MidassAI

DeepSeek Vision: 확인 가능한 스크린샷 데이터 추출하기

MidassAI Team · 2026년 10월 12일 · 18 min read

Start Creating
파란 책상 위에 필드 패널, 돋보기, 데이터 카드 세 장을 배치한 개념 일러스트.

스크린샷 추출 작업은 반환된 필드를 이미지까지 거슬러 올라가 확인할 수 있을 때 비로소 끝납니다. 깔끔하게 형식화된 답변을 받는 것은 첫 단계에 불과합니다. 진짜 어려운 경우는 읽을 수 없는 숫자, 잘못된 행에 붙은 값, 그리고 모델이 맥락에서 임의로 채워 넣은 누락된 단위입니다. 대량의 이미지를 보내기 전에 이러한 사례를 중심으로 워크플로를 구축하세요.

2026년 10월 12일에 확인한 DeepSeek의 Vision 가이드는 deepseek-flash에 대한 이미지-텍스트 입력을 문서화하고 있습니다. 9월 10일 변경 로그는 이 이름을 V4.1 Flash와 대응한다고 설명합니다. 이 글은 문서화된 API에 대한 10월 실용 가이드이며, 10월의 새 모델 발표가 아닙니다. 아래 예제는 구현 템플릿이며, 기록된 추론 실행이나 OCR 정확도 벤치마크가 아닙니다.

명확한 경계가 있는 스크린샷 준비하기

출력 범위가 작고 명확한 작업을 선택하세요. 예를 들어 하나의 재고 패널에서 보이는 상태, 품목명, 표시된 수량을 추출하는 식입니다. "이 대시보드를 이해해 줘"처럼 시작하면 어떤 부분이 중요하고 어떤 결론을 도출할지를 모델이 스스로 결정하게 되므로 피하세요.

열 제목과 단위를 보존할 수 있을 만큼 충분한 맥락을 캡처하세요. 숫자만 좁게 잘라내면 그 숫자를 해석하는 데 필요한 정보가 사라질 수 있습니다. 원본이 세로로 길거나 밀도가 높다면 이름을 붙인 영역으로 나누고, 전체 배치를 파악할 수 있도록 원본 이미지 사본도 보관하세요. 요청을 보내기 전에 각 영역에 panel-A, panel-B 같은 안정적인 식별자를 부여하세요.

일반적인 읽기 크기에서 입력을 직접 살펴보세요. 스크린샷에서 숫자를 구분할 수 없다면 더 확신 있는 답변을 요청해도 사라진 픽셀이 복원되지는 않습니다. 가능하다면 글자를 읽기 좋은 배율로 원본을 다시 캡처하세요. 작은 텍스트를 읽기 어렵게 만드는 반복적인 리사이즈와 압축은 피하세요.

아래 샘플에는 PNG를 사용하세요. 공식 가이드는 JPEG, GIF, WebP도 지원하며 파일 내용에서 형식을 식별합니다. 파일 이름을 바꾼다고 변환되는 것이 아닙니다. 확장자만 믿지 말고 실제로 보내는 파일을 확인하세요.

모델이 알 수 없다고 남겨둘 수 있는 범위 정의하기

요청을 작성하기 전에 필드를 지정하세요. 재고 패널이라면 유용한 레코드에 영역 식별자, 보이는 품목명, 표시된 수량, 표시된 단위, 상태, 그리고 모호성에 대한 메모가 포함될 수 있습니다. 원래 표현이 중요한 경우에는 그대로 유지하고, 정규화는 이후 단계에서 처리하세요.

알 수 없는 값을 명시적으로 만드세요. 빈 셀, 오버레이에 가려진 텍스트, 읽을 수 없는 문자는 서로 다른 관찰 결과입니다. 이들이 모두 0이 되어서는 안 됩니다. 다운스트림 시스템에 숫자가 필요하다면 스키마를 맞추기 위해 값을 지어내지 말고 해당 레코드를 검토 대기 상태로 두세요.

직접 제공하는 스크린샷을 위한 예시 지시문은 다음과 같습니다.

panel-A의 재고 테이블만 읽으세요. 화면에 보이는 각 행에 대해 품목명, 수량 텍스트, 단위, 상태를 표시된 그대로 반환하세요. 읽을 수 없는 필드에는 null을 사용하고 메모에 그 이유를 설명하세요. 숨겨진 행을 추론하거나, 잘린 이름을 완성하거나, 합계를 계산하지 마세요. 내가 이미지에서 각 행을 찾을 수 있도록 짧은 위치 설명을 포함하세요.

위치 설명은 검토를 돕는 보조 수단이지 정확한 바운딩 박스가 아닙니다. 애플리케이션에 좌표가 필요하다면 그 요구 사항을 별도로 정의하고 검증하세요. 그럴듯한 위치 문구를 추출된 값이 올바르다는 증거로 취급하지 마세요.

Start Creating

올바른 콘텐츠 블록에 이미지 담아 보내기

문서화된 Chat Completions 인터페이스는 텍스트와 이미지 블록을 user 메시지의 content 배열 안에 넣습니다. 로컬 이미지는 데이터 URL로 인코딩할 수 있습니다. 다음 Python 템플릿을 사용하려면 OpenAI 호환 Python 클라이언트를 설치하고, 로컬 환경에 DEEPSEEK_API_KEY를 설정한 뒤, screenshot.png 위치에 실제 PNG 파일을 두세요. API 키는 소스 파일과 브라우저 코드에서 분리해 관리하세요.

import base64
import os
from pathlib import Path
from openai import OpenAI

image = Path("screenshot.png").read_bytes()
if not image.startswith(b"\x89PNG\r\n\x1a\n"):
    raise ValueError("이 예제에는 PNG 이미지를 사용하세요")
encoded = base64.b64encode(image).decode("ascii")

client = OpenAI(
    api_key=os.environ["DEEPSEEK_API_KEY"],
    base_url="https://api.deepseek.com",
)
result = client.chat.completions.create(
    model="deepseek-flash",
    messages=[{
        "role": "user",
        "content": [
            {"type": "text", "text": (
                "panel-A의 재고 테이블을 읽으세요. 보이는 각 행의 "
                "품목명, 수량 텍스트, 단위, 상태, 위치를 반환하세요. "
                "읽을 수 없는 필드는 null을 사용하고 모호한 이유를 "
                "설명하는 메모를 추가하세요. 숨겨진 행을 추론하거나 합계를 계산하지 마세요."
            )},
            {"type": "image_url", "image_url": {
                "url": "data:image/png;base64," + encoded,
                "detail": "original",
            }},
        ],
    }],
)
print(result.choices[0].message.content)

이 템플릿은 반환된 콘텐츠를 검사할 수 있도록 출력할 뿐이며, 기계 판독 가능한 스키마를 강제하거나 결과를 검증하지 않습니다. 자동 임포트에 연결하기 전에 그런 단계를 추가하세요. API 요청에는 계정 상태와 현재 제공업체의 가격 정책에 따른 사용 요금이 발생합니다.

가이드는 공개 이미지 URL과 Files API 참조를 다른 입력 옵션으로 설명합니다. 워크로드에 맞는 전송 방식을 선택하세요. 로컬 샘플은 인라인 방식이 편리하고, 같은 이미지를 반복해서 사용한다면 파일 참조가 더 적합할 수 있습니다. base64 인코딩은 요청 본문 크기도 키우므로, 규모를 확대하기 전에 현재 문서화된 크기 제한을 확인하세요.

이 예제는 문서화된 original detail 설정을 사용합니다. 그렇다고 해서 픽셀 단위의 완벽한 판독이 보장되는 것은 아닙니다. 가이드는 이미지 전처리를 별도로 설명하며, low 설정은 512 × 512로 다운샘플링합니다. 따라서 밀도가 높은 스크린샷이라면 효율을 위해 디테일을 포기하기 전에 특히 주의가 필요합니다.

무엇이든 계산하기 전에 추출 결과 검증하기

입력 이미지와 응답을 나란히 열어 놓고 반환된 행을 한 번에 하나씩 확인하세요. 텍스트, 행 연결, 단위를 비교하세요. 수량은 정확히 옮겨 적었지만 이웃한 제품에 붙어 있을 수도 있습니다. 맞춤법 검사만으로는 그런 문제를 잡아내지 못합니다.

일반적인 행, 누락된 값, 잘린 이름, 모호한 문자를 포함하는 소규모 샘플로 시작하세요. 이는 제안된 평가 사례입니다. 직접 검증한 정답을 보관하고, 각 실패가 입력 이미지에서 비롯되었는지, 추출 과정에서 비롯되었는지, 아니면 애플리케이션이 응답을 해석한 방식에서 비롯되었는지 기록하세요.

개별 값을 확인한 후에만 합계를 계산하세요. 이미지에 소계와 합계가 모두 있다면 위치를 기준으로 하나를 골라 쓰지 말고 각 라벨을 그대로 보존하세요. 텍스트를 숫자로 변환할 때는 단위와 소수점 표기 규칙을 명시적으로 유지하세요. 쉼표는 원본 문서에 따라 다른 의미를 가질 수 있습니다.

반복 가능한 처리를 위해서는 입력 식별자, 영역 이름, 프롬프트 버전, 요청한 모델, 원시 응답을 검토가 끝난 각 레코드와 함께 보관하세요. 그러면 어떤 스크린샷이 그 값을 만들었는지 추측할 필요 없이 나중에 수정할 수 있습니다.

전송 오류와 판독 오류 구분하기

요청이 실패하면 추출 지시를 바꾸기 전에 인증, 입력 형식, 메시지 구조, 현재 크기 제한을 먼저 확인하세요. 이 Chat Completions 예제에서 이미지는 user 메시지에 속하며 image_url 블록을 사용합니다. Responses API의 input_image 형태를 대신 넣어서는 안 됩니다.

요청은 성공했는데 값이 틀렸다면 크롭과 작업 정의를 살펴보세요. 헤더가 유지된 더 명확한 영역으로 다시 시도해 보세요. 그래도 필드가 읽히지 않으면 알 수 없음 상태로 유지하고 검토 단계로 보내세요. 같은 이미지에 확답을 반복해서 요구하면 더 나은 증거 없이 다른 추측만 얻게 될 수 있습니다.

이전 모델 이름을 마이그레이션하는 프로젝트라면 별도의 DeepSeek API 마이그레이션 가이드를 참고하세요. 여기서 다룬 추출 워크플로는 문서화된 현재 이름을 전제로 하며, 단순히 성공적인 응답을 받는 것이 아니라 데이터 검증에 초점을 둡니다. 필수 필드를 원본과 대조해 확인할 수 있을 때만 결과를 게시하거나 임포트하세요.

관련 글

Start Creating