1. 从一张发票照片说起:为什么需要大模型 OCR
你手里有一张发票照片,想让它自动告诉你「这张票的金额、开票日期、购买方是谁」。传统做法是先用 OCR 把文字抠出来,再写一堆正则去匹配字段,遇到版式一变就全废。现在更省事的思路是:让大模型直接「看图说话」,把 OCR 和语义理解合并成一次调用。
这就是本篇要落地的东西——用 Python 调用大模型 OCR,搭一个能接收图片加提问、返回结构化分析结果的图像分析系统。它适合谁?零代码基础但会复制粘贴命令的读者、想给内部工具加「识图」能力的后端同学、以及正在找 LLM 与 OCR 结合最小可行 demo 的人。
核心检索词先摆出来:Python 调用大模型 OCR、TaoToken 统一 Key、图像分析系统、config.toml、settings.json、CC Switch、Cline。这几个词会贯穿全文,你照着做就能跑通。
我试过的路径是:不折腾本地模型下载,直接用 TaoToken 的统一 API 通道把「图像理解」这件事外包出去,Python 侧只负责读图、编码、发请求、解析返回。这样你的电脑不需要显卡,也不需要装几十 GB 的模型权重,一个 Key 就能调通多家模型。
下面按「问题场景 → TaoToken 前置 → 可复制配置 → 验证请求 → 报错排查 → 工具接入」的顺序展开,每一步都给完整命令和参数,你跟着敲即可。
2. TaoToken 前置:统一 Key 与 API 通道准备
在写 Python 之前,先把「调用入口」准备好。TaoToken 在这里扮演的角色是统一网关:你不需要为每个模型单独申请账号、记不同的 Base URL,而是用同一个 Key 走同一个 API 地址,模型名在请求体里切换即可。
第一步,打开官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 注册并登录。登录后进入控制台,找到 API Keys 页面,新建一个 Key。这个 Key 就是后面所有配置里api_key字段的值,形如sk-开头的一串字符。
第二步,记住两个地址,后面配置会反复用到:
- API 基地址:
https://taotoken.net/api(注意这个地址不加任何查询参数) - 模型对话入口:https://taotoken.net/api/chat/completions
第三步,确认你要用的模型名。图像理解类请求需要选支持视觉输入的模型,具体可用列表在控制台的模型页或文档里查。文档地址:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite
注意:Key 只显示一次,创建后立刻复制保存到本地密码管理器。不要把它硬编码进要提交到 Git 的脚本里,后面我们会用环境变量和配置文件两种方式隔离。
如果你打算长期做编码类任务,比如让模型帮你改 Python 脚本、生成 OCR 后处理逻辑,可以顺带了解 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite 。它面向的是持续性的代码协作场景,和本篇的一次性图像识别请求是互补的。
到这里前置就绪:一个 Key、一个 API 地址、一个模型名。接下来进入配置环节。
3. 可复制配置:config.toml 与 settings.json 骨架
零代码基础的读者最容易卡在「配置写在哪、字段叫什么」。这里给两份骨架,一份给 Python 项目用(config.toml),一份给编辑器插件用(settings.json)。你直接复制,把 Key 换成自己的即可。
3.1 config.toml:Python 侧读取的配置
在项目根目录新建config.toml,内容如下:
[llm] api_base = "https://taotoken.net/api" api_key = "sk-你的Key粘贴到这里" model = "你的视觉模型名" timeout = 60 [ocr] image_dir = "./images" max_image_mb = 10 prompt = "请识别这张图片中的文字,并按字段输出:金额、日期、购买方。若某字段不存在,写未识别。"字段说明用表格对照更清楚:
| 字段 | 作用 | 建议值 |
|---|---|---|
| api_base | 请求基地址 | https://taotoken.net/api |
| api_key | 身份凭证 | 控制台新建的 Key |
| model | 视觉模型名 | 控制台模型页查询 |
| timeout | 单次请求超时秒数 | 60 |
| max_image_mb | 图片大小上限 | 10 |
| prompt | 默认识别指令 | 按业务改 |
Python 读取这份配置只需要标准库加一个 toml 解析库。安装命令:
pip install tomli requests读取代码片段:
import tomli with open("config.toml", "rb") as f: cfg = tomli.load(f) api_base = cfg["llm"]["api_base"] api_key = cfg["llm"]["api_key"] model = cfg["llm"]["model"]3.2 settings.json:编辑器插件侧配置
如果你用 Cline 或类似插件,配置写在settings.json里。骨架如下:
{ "llm.provider": "openai-compatible", "llm.baseUrl": "https://taotoken.net/api", "llm.apiKey": "sk-你的Key粘贴到这里", "llm.model": "你的视觉模型名", "llm.timeout": 60000, "ocr.imageDir": "./images", "ocr.prompt": "识别图片文字并结构化输出" }注意:
baseUrl填到/api为止,不要自己拼/v1或/chat/completions,插件会自动补路径。多写一段最常见的报错就是 404。
两份配置的 Key 建议用环境变量注入,避免明文。在.bashrc或系统环境变量里设TAOTOKEN_API_KEY,然后配置里写api_key = "${TAOTOKEN_API_KEY}",读取时做一次替换即可。
4. 验证请求:一次图像识别请求的完整动作
配置就绪后,先别急着搭前端。用最小脚本验证「图片能不能被识别」,这一步通了,后面都是锦上添花。
4.1 图片转 base64
大模型 API 接收图片有两种方式:传 URL 或传 base64。本地图片用 base64 最稳。代码:
import base64 def image_to_base64(path): with open(path, "rb") as f: return base64.b64encode(f.read()).decode("utf-8")4.2 组装请求体
请求体遵循 OpenAI 兼容格式,content是一个数组,里面既有文字也有图片:
import requests def analyze_image(image_path, question): b64 = image_to_base64(image_path) payload = { "model": model, "messages": [ { "role": "user", "content": [ {"type": "text", "text": question}, { "type": "image_url", "image_url": {"url": f"data:image/png;base64,{b64}"} } ] } ] } headers = { "Authorization": f"Bearer {api_key}", "Content-Type": "application/json" } resp = requests.post( f"{api_base}/chat/completions", json=payload, headers=headers, timeout=60 ) return resp.json()4.3 运行并观察结果
把上面拼起来,命令行执行:
python demo.py --image ./images/invoice.png --query "帮我提取这张图的金额和日期"成功时你会看到返回 JSON 里choices[0].message.content是一段自然语言,里面包含识别出的字段。实测下来,一张普通发票照片从发请求到返回大约几秒,取决于图片大小和模型负载。
如果返回里content为空,先检查finish_reason字段,常见值是length(被截断)或content_filter(内容被拦)。前者调大max_tokens,后者换一张图重试。
4.4 封装成可复用函数
把验证脚本整理成函数,方便后面接前端:
def ocr_and_analyze(image_path, question=None): q = question or cfg["ocr"]["prompt"] result = analyze_image(image_path, q) return result["choices"][0]["message"]["content"]到这里,一次完整的图像识别请求就跑通了。你可以把image_path换成任意本地图片,question换成任意提问,比如「这张图里有几个人」「表格第二列是什么」。
5. 本篇常见错排查清单
下面这些错,是我在接入过程中真实踩过的,按出现频率排序。
5.1 401 Unauthorized
原因几乎都是 Key 不对或没带上。检查三处:Authorization头是不是Bearer sk-xxx格式、Key 有没有多余空格、环境变量有没有真的被读取。用echo $TAOTOKEN_API_KEY确认。
5.2 404 Not Found
路径拼错。正确是https://taotoken.net/api/chat/completions。如果你在api_base里已经写了/api,拼接时只加/chat/completions,不要再加/v1。
5.3 400 Bad Request:image_url 格式错
base64 前面必须带data:image/png;base64,前缀,缺了这段会被判为非法 URL。另外图片格式要和 MIME 一致,jpg 图写成image/jpeg。
5.4 图片过大导致超时
超过 10MB 的图先压缩再传。用 Pillow 一行搞定:
from PIL import Image img = Image.open(path) img.thumbnail((1600, 1600)) img.save("compressed.jpg", quality=85)5.5 模型不支持视觉输入
报错信息里常出现model does not support image input。回到控制台模型页,确认所选模型在视觉支持列表里。纯文本模型传图片必然失败。
5.6 返回内容被截断
finish_reason为length时,在 payload 里加"max_tokens": 2000。注意这个值不是越大越好,按输出长度预估即可。
5.7 中文乱码
resp.json()一般没问题,如果手动resp.text解析,记得resp.encoding = "utf-8"。
6. 工具侧接入:CC Switch 与 Cline 配置步骤
如果你不想每次都在命令行跑脚本,可以把 TaoToken 接进编辑器工具,让识图能力变成「随手可用」。
6.1 CC Switch 接入
CC Switch 用来在多个模型配置间切换。打开它的配置文件,新增一个 profile:
{ "name": "taotoken-vision", "baseUrl": "https://taotoken.net/api", "apiKey": "sk-你的Key", "model": "你的视觉模型名" }保存后在 CC Switch 界面选中这个 profile,后续所有请求都走 TaoToken 通道。切换回其他 profile 不影响已有配置。
6.2 Cline 接入
Cline 是编辑器内的编码助手,接入后可以让它直接读你项目里的图片。步骤:
打开 Cline 设置,Provider 选OpenAI Compatible,Base URL 填https://taotoken.net/api,API Key 填你的 Key,Model 填视觉模型名。保存后新建一个对话,把图片拖进输入框,问「这张图里的报错是什么」,它会走视觉通道返回结果。
注意:Cline 的请求可能带较长的上下文,如果遇到超时,把
timeout调到 120000 毫秒。另外 Cline 默认可能走流式返回,TaoToken 的/chat/completions支持流式,无需额外改配置。
6.3 把两者串起来的工作流
一个顺手的组合是:用 Cline 在编辑器里写 Python 脚本,脚本里调用 TaoToken 做 OCR,CC Switch 负责在「写代码的模型」和「识图的模型」之间切换。这样你既不用离开编辑器,也不用为两件事维护两套 Key。
如果你后续要做更复杂的 Agent 流程,比如让模型自己决定「先 OCR 再查数据库」,可以了解 Coding Plan 的长期编码场景:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite 。它更适合持续性的代码协作,而不是单次识图。
6.4 模型对话快速验证
不想写代码时,直接用网页版模型对话验证图片能否被识别:https://taotoken.net/api/chat/completions 对应的对话入口在控制台里能找到。上传图片、输入问题,看返回是否符合预期。这一步能帮你快速判断是「模型问题」还是「代码问题」。
6.5 接入文档与 API Keys 入口
配置过程中如果字段名拿不准,查文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite 。Key 的管理和新建在:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite 。建议把这两个页面存书签,排障时第一时间对照。
最后给一个实用技巧:把config.toml里的prompt字段做成「模板 + 变量」的形式,比如"识别图片中的{field},输出JSON",Python 侧用str.format替换。这样同一套代码能复用到发票、身份证、表格等不同场景,不用每次改脚本。图像分析系统的扩展性,往往就藏在这一行 prompt 的设计里。