MidassAI

DeepSeek Vision:スクリーンショットから検証可能なデータを抽出する

MidassAI Team · 2026年10月12日 · 16 min read

Start Creating
青い机の上に項目パネル、ルーペ、3枚のデータカードを並べた概念イラスト。

スクリーンショットの抽出タスクは、返されたフィールドを画像まで遡って確認できたときに完了です。整形された回答を得ることは、最初の一歩にすぎません。難しいのは、読み取れない数字、誤った行に紐づいた値、モデルが文脈から補ってしまう欠落した単位といったケースです。大量の画像を送信する前に、こうしたケースを想定してワークフローを構築してください。

2026年10月12日に確認したDeepSeekのVisionガイドでは、deepseek-flashでの画像とテキストの入力が説明されています。9月10日の変更履歴では、この名前がV4.1 Flashに対応するとされています。これは10月の新モデルの発表ではなく、公式ドキュメントに記載されたAPIに関する10月時点の実践ガイドです。以下の例は実装テンプレートであり、記録された推論実行やOCR精度のベンチマークではありません。

境界が明確なスクリーンショットを用意する

出力が小さく明示的なタスクを選びます。たとえば、1つの在庫パネルから、表示されているステータス、品目名、表示数量を抽出します。「このダッシュボードを理解して」といった指示から始めないでください。どの部分が重要で、どんな結論を導くべきかをモデルに委ねることになります。

列の見出しや単位を保持できる十分なコンテキストをキャプチャします。数字だけをぎりぎりで切り抜くと、それらを解釈するのに必要な情報が失われることがあります。元の画像が縦長または密な場合は、名前を付けた領域に分割し、全体の位置関係を確認できる画像のコピーも保持します。リクエストを行う前に、panel-Aやpanel-Bのような安定した識別子を各領域に付けてください。

通常の読み取りサイズで入力を確認します。スクリーンショット内の数字を自分が区別できないなら、より自信のある回答を要求しても失われたピクセルは復元されません。可能な場合は、文字を読み取れる大きさで元の画像を取り直してください。小さなテキストを読みにくくするようなリサイズや圧縮の繰り返しは避けます。

以下のサンプルにはPNGを使用します。公式ガイドはJPEG、GIF、WebPもサポートしており、ファイル内容からフォーマットを識別します。ファイル名を変更しても変換にはなりません。拡張子だけに頼らず、実際に送信するファイルを確認してください。

モデルが「不明」のままにしてよい項目を定義する

リクエストを書く前にフィールドを指定します。在庫パネルの場合、有用なレコードには、領域識別子、表示されている品目名、表示数量、表示単位、ステータス、曖昧さに関するメモが含まれるでしょう。重要な場合は元の文言をそのまま保持し、正規化は後のステップで行います。

不明な値は明示的にします。空のセル、オーバーレイで隠れたテキスト、読み取れない文字は、それぞれ異なる観察結果です。これらがすべてゼロになるべきではありません。下流のシステムが数値を必要とする場合は、スキーマを満たすために値を作り出すのではなく、レコードをレビュー用に保留してください。

あなたが用意するスクリーンショットに対する、オリジナルの指示例:

panel-Aの在庫テーブルのみを読み取ってください。表示されている各行について、品目名、数量のテキスト、単位、ステータスを表示どおり正確に返してください。読み取れないフィールドにはnullを使用し、その理由をメモで説明してください。隠れた行を推測したり、切れた名前を補完したり、合計を計算したりしないでください。画像内で各行を見つけられるよう、簡単な位置の説明を含めてください。

位置の説明はレビューの助けであり、正確なバウンディングボックスではありません。アプリケーションに座標が必要な場合は、その要件を別途定義して検証してください。もっともらしい位置の記述を、抽出された値が正しいことの証拠として扱わないでください。

Start Creating

正しいコンテンツブロックで画像を送信する

文書化されているChat Completionsインターフェースでは、テキストブロックと画像ブロックをユーザーメッセージのcontent配列内に配置します。ローカル画像はdata URLとしてエンコードできます。以下のPythonテンプレートでは、OpenAI互換のPythonクライアントをインストールし、ローカル環境にDEEPSEEK_API_KEYを設定し、PNG形式の画像をscreenshot.pngとして配置してください。キーはソースファイルやブラウザのコードに含めないでください。

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("Use a PNG image for this example")
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": (
                "Read the inventory table in panel-A. Return each visible "
                "row's item name, quantity text, unit, status, and location. "
                "Use null for unreadable fields and add a note explaining "
                "the ambiguity. Do not infer hidden rows or calculate totals."
            )},
            {"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にダウンサンプリングされるため、密度の高いスクリーンショットでは、詳細さと効率をトレードオフする前に特に注意が必要です。

計算の前に抽出結果を検証する

入力とレスポンスを並べて開き、返された行を一度に1つずつ確認します。テキスト、行の対応付け、単位を比較してください。数量は正しく転記されていても、隣の製品に紐づいていることがあり、スペルチェックだけではそれを検出できません。

通常の行、欠落値、切り詰められた名前、曖昧な文字を含む少数のサンプルから始めます。これらは提案する評価ケースです。自分で検証した回答を保持し、各失敗が入力画像、抽出処理、アプリケーションによるレスポンスの解釈のどれに起因したかを記録してください。

合計の計算は個々の値を確認した後にのみ行います。画像に小計と合計の両方が含まれる場合は、位置に基づいて一方を選ぶのではなく、それぞれのラベルを保持してください。テキストを数値に変換する際は、単位と小数点の規則を明示します。カンマはソース文書によって異なる意味を持つことがあります。

繰り返し可能な処理のために、レビュー済みの各レコードとともに、入力識別子、領域名、プロンプトのバージョン、要求したモデル、生のレスポンスを保持してください。これにより、どのスクリーンショットがその値を生成したかを推測せずに、後で修正することが可能になります。

転送エラーと読み取りエラーを切り分ける

リクエストが失敗した場合は、抽出指示を変更する前に、認証、入力フォーマット、メッセージ構造、現在のサイズ制限を確認してください。このChat Completionsの例では、画像はユーザーメッセージに含め、image_urlブロックを使用します。Responses APIのinput_imageの形を代用しないでください。

リクエストは成功したが値が誤っている場合は、切り抜きとタスク定義を見直します。見出しを保持した、より明確な領域を試してください。それでもフィールドが読み取れない場合は、不明のままにしてレビューに回してください。同じ画像に確定的な答えを繰り返し求めても、より良い証拠ではなく、異なる推測が返ってくる可能性があります。

古いモデル名から移行するプロジェクトについては、別のDeepSeek API移行ガイドを参照してください。ここでの抽出ワークフローは、文書化されている現在の名前を前提とし、成功レスポンスを受け取るだけでなく、データの検証に重点を置いています。必須フィールドがソースと照合して確認できた後にのみ、結果を公開またはインポートしてください。

関連記事

Start Creating