DeepSeek 视觉功能:提取可核验的截图数据
MidassAI Team · 2026年10月12日 · 11 分钟阅读

截图数据提取任务完成的标志,是有人能把返回的字段逐一追溯回原始图像。拿到格式规整的答案只是第一步。真正棘手的情况是:无法辨认的数字、对应到错误行的数值,以及模型根据上下文自行补全的缺失单位。在批量发送大量图片之前,应先围绕这些情况设计好工作流。
DeepSeek 的视觉指南(查阅于 2026 年 10 月 12 日)记录了 deepseek-flash 的图文输入能力。9 月 10 日的更新日志将该名称对应为 V4.1 Flash。本文是依据 API 文档整理的十月实操指南,并非宣布 10 月有新模型发布。下面的示例是一个实现模板,不是一次真实推理运行的记录,也不是 OCR 准确率基准测试。
准备一张边界清晰的截图
选择一个输出规模小且定义明确的任务。例如,从一个库存面板中提取可见状态、物品名称和显示数量。不要一上来就提出“理解这个仪表盘”——那会让模型自行决定哪些部分重要、该得出什么结论。
截图时保留足够的上下文,保留列标题和单位。只截取数字的局部图像,可能会丢掉解读这些数字所需的信息。如果原图很长或信息密集,把它划分为若干命名区域,并保留一份完整图像用于定位。在发起请求前,给每个区域一个稳定的标识符,例如 panel-A 或 panel-B。
以正常阅读尺寸检查输入。如果你自己都分不清截图里的某个数字,要求模型给出“更确定”的答案也无法找回丢失的像素。尽可能以可用的尺寸重新截取原始图像。避免反复缩放和压缩,那会让小字更难辨认。
下面的示例使用 PNG。官方指南也支持 JPEG、GIF 和 WebP,并根据文件内容识别格式。重命名文件并不会完成格式转换。请检查你实际发送的文件,而不是只依赖扩展名。
明确模型可以留作未知的部分
在写请求之前先定义字段。对于库存面板,一条有用的记录可以包含:区域标识符、可见物品名称、显示数量、显示单位、状态,以及一条关于歧义的备注。需要保留原始措辞时就原样保留;规范化留待后续步骤处理。
让未知值显式呈现。空白单元格、被浮层遮挡的文字、无法辨认的字符,是三种不同的观测结果,不应统统变成零。如果下游系统必须填数字,应把这条记录挂起等待人工复核,而不是为了满足其数据结构要求 凭空编造一个。
以下是一条原创示例指令,适用于你提供的截图:
只读取 panel-A 中的库存表格。对每一个可见行,按图中原样返回物品名称、数量文本、单位和状态。无法读取的字段使用 null,并在备注中说明原因。不要推测被隐藏的行,不要补全被截断的名称,也不要计算合计。附上一段简短的位置描述,方便我在图中找到每一行。
位置描述只是复核辅助,不是精确的边界框。如果你的应用需要坐标,请单独定义并验证该需求。不要把一个看似合理的位置描述当作提取值正确的证据。
在正确的内容块中发送图片
文档中的 Chat Completions 接口把文本块和图片块放在 user 消息的 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 细节级别设置。这并不保证逐像素读取:指南另外描述了图像预处理。其 low 档位会将图像降采样到 512 × 512,因此信息密集的截图在你用细节换效率之前,需要仔细检查小字是否仍可辨认。
先核验提取结果,再做任何计算
把输入图和返回结果并排打开,一次核对一行。比对文本、行对应关系和单位。数量可能被正确转录,却挂到了相邻商品上——单靠拼写检查发现不了这种问题。
先准备一小组样本,其中包含普通行、缺失值、被截断的名称和有歧义的字符。这些是建议的评估用例。保留你自己核验过的答案,并记录每次失败究竟来自输入图像、提取过程,还是你的应用对响应的解读方式。
只有在接受各个单项值之后才计算合计。如果图中同时有小计和总计,保留它们各自的标签,而不是根据位置二选一。把文本转成数字时,让单位和小数点与分隔符规则保持明确。逗号在不同来源文档中可能含义不同。
为了可重复处理,每条复核过的记录都要保留输入标识符、区域名称、提示词版本、所请求的模型和原始响应。这样日后需要更正时,不必猜测这个值究竟出自哪张截图。
区分传输错误和读取错误
如果请求失败,先检查身份认证、输入格式、消息结构和当前的体积限制,再去改动提取指令。在这个 Chat Completions 示例中,图片属于 user 消息,并使用 image_url 块。不要把 Responses API 的 input_image 结构套用到这里。
如果请求成功但某个值不对,检查裁剪区域和任务定义。换一个保留表头的更清晰区域试试。如果某个字段始终无法读取,就让它保持未知并转交人工复核。反复向同一张图索要确定答案,可能只会得到另一个猜测,而不会产生更可靠的证据。
对于需要迁移旧模型名称的项目,请参阅单独的 DeepSeek API 迁移指南。这里的提取工作流以文档中的当前名称为前提,重点在于验收数据,而不仅仅是收到一次成功响应。只有在必需字段都能对照其来源核验之后,才发布或导入结果。