1. 发票报销这件事,为什么值得用 PaddleOCR + OpenClaw 重做一遍
每个月月底,财务群里准时出现那句“发票记得贴一下”,然后就是一场体力活:从邮箱、微信、纸质票里翻出 PDF,一张张打开,把发票号码、开票日期、金额、税率、购买方和销售方信息敲进表格。一张两张还能忍,十几张下来,眼睛花、手也酸,最怕的是录错一个数字,后面核对又要重来。
我这次想解决的,就是这条从“拍照/收票”到“入表”的链路。核心思路不复杂:让 PaddleOCR 负责把票面字段抽出来,让 OpenClaw 负责流程编排和写入飞书多维表格,中间所有模型调用统一走 TaoToken 的 Key 和 API 通道。这样做的价值在于,识别和入库不再是两套割裂的动作,而是一条可以重复执行的自动化流水线。
PaddleOCR 在这里承担的是“眼睛”的角色。它基于文心大模型体系训练,对发票这类版式固定、字段密集的文档有不错的抽取能力,返回的是结构化 JSON,而不是一堆散乱文本。OpenClaw 则是“手和大脑”,它通过 ClawHub 上的 Skills 机制挂载 PaddleOCR 能力,再按你给的提示词把字段映射到飞书多维表格的列上。TaoToken 的作用是“统一门禁”,把模型调用的 Base URL 和 Key 收敛到一个地方,避免你在多个平台之间来回切换配置。
适合谁照着做?如果你每个月有固定量的发票要处理,或者你在团队里负责报销汇总,又或者你只是想体验一下“能力即插即用”的 Agent 工作流,这套组合都值得跑一遍。它不需要你从零写 OCR 推理代码,也不需要你手搓飞书 API 的鉴权逻辑,重点在于把 Skills 挂载、Key 配置、字段映射这三件事做对。
我实测下来,一张结构清晰的电子发票,从丢进 OpenClaw 到写入多维表格,大概几十秒。识别准确率在测试的几张票上表现稳定,连表格结构都能完整提取。下面我把整个搭建过程拆开讲,包括环境变量、Base URL 配置、ClawHub Skills 挂载步骤,以及用一张真实发票跑通识别、校验、入库的验证动作。
2. TaoToken 前置准备:统一 Key 与 API 通道怎么配
在动手挂载 PaddleOCR Skills 之前,先把模型调用的通道理顺。这一步很多人会忽略,结果后面报错时不知道是 Skills 的问题还是 Key 的问题。TaoToken 在这里的角色,是给你一个统一的 API 入口,OpenClaw 里所有需要调用模型的地方,都指向同一个 Base URL 和同一把 Key。
先明确两个地址。官网入口是https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=,API 地址是https://taotoken.net/api,注意 API 地址后面不加 UTM 参数,保持干净。你需要在控制台里创建一把 API Key,这个 Key 就是后面 OpenClaw 配置里要填的凭证。
创建 Key 的路径是进入控制台,找到 API Keys 管理页。如果你用的是 Claude Code 或者类似的编码工具,也可以在 Coding Plan 里查看额度与调用情况。对于这套发票系统来说,你主要用到的是模型对话和文档解析相关的调用能力,所以 Key 的权限范围按默认即可,不需要额外开奇怪的权限。
配置的时候,核心是三个东西:Base URL、API Key、Model ID。这三个在 OpenClaw 的配置里要写全,缺一个都会导致请求失败。Base URL 填https://taotoken.net/api,API Key 填你刚创建的那串,Model ID 根据你实际调用的模型来填。如果你不确定 Model ID 写什么,可以先到模型对话页面确认当前可用的模型名称,再回填到配置里。
这里有个容易踩的坑:有人把官网地址当成 API 地址填进去,结果请求直接 404。记住官网是给人看的,API 是给程序调的,两者路径不一样。另外,Key 不要硬编码在会提交到 Git 的脚本里,建议用环境变量的方式注入。比如在 shell 里这样写:
export TAOTOKEN_BASE_URL="https://taotoken.net/api" export TAOTOKEN_API_KEY="你的_API_Key" export TAOTOKEN_MODEL_ID="你的_Model_ID"然后在 OpenClaw 的配置文件中引用这些环境变量。这样做的好处是,换 Key 或者换模型时只改环境变量,不用动 Skills 的配置。如果你是在本地跑,也可以写进.env文件,但记得把.env加进.gitignore。
还有一点,TaoToken 的接入文档里有针对不同工具的配置示例,包括 Claude Code 的 settings 片段和 Codex 的 auth.json 写法。如果你后面要把这套流程接到编码工具里做批量处理,可以参考文档里的 JSON/TOML 片段,把 Base URL 和 Key 按对应格式填进去。文档入口在接入文档页,里面有完整的字段说明。
把这一步做完,你手里应该有了可用的 Base URL、Key 和 Model ID。接下来才是挂载 PaddleOCR Skills,顺序不要反,否则排查问题时你会分不清是通道没通还是技能没装上。
3. 可复制配置:ClawHub Skills 挂载与飞书多维表格字段映射
这一节是整套系统的核心配置部分,我会给出可以直接复制的片段和步骤。先处理 PaddleOCR Skills 的挂载,再处理飞书多维表格的字段映射。
PaddleOCR 已经以 Skill 的形式上架到 ClawHub,地址是https://clawhub.ai/Bobholamovic/paddleocr-doc-parsing。你不需要手动下载代码,直接在 OpenClaw 里对它说“帮我下载这个技能”,并附上上面的链接,它就会自动完成安装。安装完成后,你可以让 OpenClaw 列出当前已挂载的 Skills,确认 PaddleOCR 出现在列表里。
接下来配置 PaddleOCR 的 API 参数。虽然 Skill 本身封装了解析逻辑,但它仍然需要一个 API_URL 和 TOKEN 来调用底层的解析服务。你可以打开 PaddleOCR 官网,上传一张发票 PDF 做测试解析,解析完成后点击左上角的 API 入口,按提示完成手机号验证,就能看到 API_URL 和 TOKEN。把这两个值复制出来,交给 OpenClaw 帮你写入配置。如果你习惯手动改配置文件,可以按下面的结构写:
{ "skills": { "paddleocr-doc-parsing": { "api_url": "你的_PaddleOCR_API_URL", "token": "你的_PaddleOCR_TOKEN", "model_base_url": "https://taotoken.net/api", "model_api_key": "你的_TAOTOKEN_API_KEY", "model_id": "你的_Model_ID" } } }注意这里我把 TaoToken 的 Base URL、Key 和 Model ID 也一并写进了 Skill 配置里,这样 PaddleOCR 在需要模型辅助时,走的就是统一通道。如果你的 OpenClaw 版本把模型配置放在全局 settings 里,那就把这三项写到全局配置,Skill 里只留 PaddleOCR 自己的 api_url 和 token。两种方式都可以,关键是三件套要齐全。
然后是飞书多维表格的字段映射。你需要先在飞书里建好一张多维表格,表名可以叫《发票管理》。字段建议按下面这些来建,类型尽量选对,不然后面写入会报类型不匹配:
| 字段名 | 建议类型 |
|---|---|
| 发票号码 | 文本 |
| 发票类型 | 单选 |
| 开票日期 | 日期 |
| 开票人 | 文本 |
| 购买方名称 | 文本 |
| 购买方统一社会信用代码 | 文本 |
| 销售方名称 | 文本 |
| 销售方统一社会信用代码 | 文本 |
| 开户银行 | 文本 |
| 银行账号 | 文本 |
| 合计费用项目名称 | 文本 |
| 合计费用单价 | 数字 |
| 合计费用数量 | 数字 |
| 合计费用金额 | 数字 |
| 合计费用税率 | 数字 |
| 合计费用税额 | 数字 |
| 发票附件 | 附件 |
建好表之后,把下面这段提示词发给 OpenClaw,让它按这个结构写入:
帮我将该信息存入到飞书多维表格,我希望有的字段是:发票号码、发票类型、开票日期、开票人、购买方名称、购买方统一社会信用代码、销售方名称、销售方统一社会信用代码、开户银行、银行账号、合计费用项目名称、合计费用单价、合计费用数量、合计费用金额、合计费用税率、合计费用税额,以及上传发票附件到附件字段。发送后,OpenClaw 会引导你完成飞书授权。授权完成后,它会尝试创建或匹配这张多维表格。这里有一个实际会遇到的问题:附件字段没法直接通过文本写入,需要先把 PDF 上传到飞书云空间,拿到文件链接后再以附件形式关联。这一步 OpenClaw 可能会提示你手动调整,或者你可以在提示词里补充一句“附件先上传到飞书云空间,再关联到附件字段”。我试过在提示词里把附件处理逻辑说清楚,后面就顺畅很多。
字段类型也要注意,金额、单价、数量、税率、税额这几列如果建成了文本,写入时可能不会报错但后续没法做求和统计。建议一开始就建成数字类型。日期字段同理,建成日期类型后,OpenClaw 写入时会自动做格式转换。
配置完成后,你可以再发一条确认指令,把规则固化下来:
我整体修改了下《发票管理》多维表中的字段类型和名称,请你以后按照这个要求,我只需要上传发票附件给你,你就借助 PaddleOCR 技能帮我做解析后,把相应字段对应的存储到《发票管理》这个飞书多维表格,ok 吗?这样 OpenClaw 就记住了这套映射关系,后续你只丢发票,它自动完成解析和入库。
4. 验证请求:用一张真实发票跑通识别到入库
配置写完,必须用真实数据验证一遍,否则你不知道是配置对了还是碰巧没报错。我拿一张真实的电子发票 PDF 做测试,把整个过程拆成识别、校验、入库三步来看。
第一步,把发票 PDF 发给 OpenClaw,并明确让它调用 PaddleOCR Skills 解析。你可以这样说:
请用 PaddleOCR 技能解析这张发票,返回结构化 JSON。正常情况下,OpenClaw 会调用已挂载的 Skill,把 PDF 传给 PaddleOCR 的解析接口,然后返回一段 JSON。返回内容里应该包含发票号码、开票日期、购买方、销售方、金额、税额等字段。如果返回的是空对象或者报错,先检查 PaddleOCR 的 api_url 和 token 是否填对,再检查 TaoToken 的 Base URL 和 Key 是否生效。
第二步,校验字段。不要急着入库,先肉眼比对几个关键字段:发票号码是否完整、开票日期格式是否正确、金额和税额是否对得上。我测试的几张票里,PaddleOCR 对表格结构的提取比较完整,连明细行的项目名称、单价、数量都能拿到。如果某个字段缺失,可能是票面本身没有这个信息,也可能是解析时字段名映射没对上。这时候你可以让 OpenClaw 把原始 JSON 打印出来,看看 PaddleOCR 实际返回的键名是什么,再调整映射。
第三步,入库。确认字段无误后,让 OpenClaw 把数据写入飞书多维表格:
请把上面解析出的字段写入《发票管理》多维表格,附件字段用上传后的文件链接。写入成功后,你去飞书多维表格里刷新一下,应该能看到新的一行记录,各个字段都填好了,附件字段里也能点开对应的 PDF。如果附件字段是空的,说明文件上传或关联那一步没走通,回到上一节检查附件处理逻辑。
为了确认整条链路可重复,我建议连续跑两张不同格式的发票,比如一张电子普票、一张电子专票。不同票面的字段布局略有差异,跑两张能暴露映射上的问题。实测下来,只要字段名和类型建对了,两张票都能顺利入库。识别准确率在测试样本上表现稳定,没有出现金额错位的情况。
如果你想让验证更直观,可以在 OpenClaw 里加一句“解析完成后先展示 JSON,等我确认再写入”,这样你能在入库前拦截错误数据。对于发票这种涉及金额的场景,多一道人工确认并不多余。
5. 本篇常见错排查:401、local proxy failed、reading choices 与 OAuth
这一节把我踩过和见到的报错集中列一下,方便你对照排查。很多问题其实不是 PaddleOCR 或 OpenClaw 本身的 bug,而是配置链路里某一环没对齐。
先说 401。这个报错通常出现在调用模型或解析接口时,意思是鉴权失败。优先检查 TaoToken 的 API Key 是否复制完整,有没有多余空格。然后确认 Base URL 是不是https://taotoken.net/api,如果你误填了官网地址,也会走到错误的鉴权逻辑。还有一种情况是 Key 被禁用或额度用尽,去控制台看一眼 Key 的状态和余额。如果 PaddleOCR 自己的 token 过期,也会返回类似的未授权错误,这时候重新在 PaddleOCR 官网获取 token 即可。
再说 local proxy failed。这个报错一般和本地网络环境或代理配置有关。如果你在 OpenClaw 里配置了自定义的请求转发,检查一下地址和端口是否可达。有些情况下,环境变量里残留了旧的代理设置,导致请求发不出去。把无关的代理变量清掉,只保留 TaoToken 的 Base URL,再重试。注意不要使用任何非正规的网络通道,保持请求直连即可。
reading choices 这个报错,通常出现在解析返回结果时。模型或解析服务返回的 JSON 结构和你预期的字段路径不一致,代码去读choices字段时读不到。解决方法是先把原始返回打印出来,确认实际结构,再调整取值路径。如果你用的是 OpenClaw 的 Skill 封装,检查 Skill 版本是否和当前接口匹配,必要时重新从 ClawHub 拉取最新版。
OAuth 相关报错,基本都出在飞书授权环节。表现是写入多维表格时提示授权失效或权限不足。你需要重新走一遍飞书授权流程,确保授予了多维表格的读写权限和云空间的上传权限。如果之前授权过但后来改了表结构,也可能导致字段映射失败,这时候重新发一次字段映射的提示词,让 OpenClaw 刷新认知。
还有一个隐蔽的坑:字段类型不匹配。比如你把金额列建成了文本,写入数字时可能不报错,但后续统计会出问题;或者你把日期列建成了文本,写入时格式对不上。对照第 3 节的表格检查一遍字段类型,能省掉很多莫名其妙的失败。
最后提醒一句,如果你在配置里用到了 Claude Code 或 Codex 的配置文件,比如 settings 或 auth.json,确保 Base URL、Key、Model ID 三件套写全,缺一个都会导致请求失败。排障时按“通道 → 技能 → 授权 → 字段”的顺序逐层检查,比盲目重装有效得多。
6. 把发票丢给 OpenClaw 之后,这套系统还能怎么用
整套流程跑通之后,你手里其实不只是一个发票录入工具,而是一条可复用的文档处理流水线。PaddleOCR 负责抽取,OpenClaw 负责编排,TaoToken 负责统一调用通道,飞书多维表格负责存储和展示。这个结构可以平移到其他场景,比如合同关键信息提取、快递单汇总、报销单批量整理。
如果你想把调用能力接到编码工具里做批量处理,可以到 API Keys 页面管理你的 Key,到接入文档页查看不同工具的配置片段。需要验证模型对话效果时,模型对话页面可以直接测试。如果你打算长期跑这类 Agent 任务,Coding Plan 里可以查看额度与调用情况,方便做成本预估。
回到发票这件事本身,最实用的技巧是:把字段映射规则固化在 OpenClaw 的提示词里,之后每次只丢文件,不再重复描述字段。附件处理那一步如果经常出问题,可以在提示词里明确“先上传飞书云空间再关联附件字段”,减少手动干预。另外,定期检查多维表格里的字段类型,避免因为表结构变动导致写入失败。
我现在处理发票的流程就是:收到 PDF,丢给 OpenClaw,等它解析入库,然后去多维表格里核对一眼。整个过程不需要打开 OCR 代码,也不需要手动填表。这套东西搭一次,后面每个月都能省下不少重复劳动。