把纸质与电子票据变成结构化台账,让「这个月钱花在哪、成本率为什么涨」有据可查。
Excel 不需要被替换——它是导出物,账本在连接器后端。
第一件事:票据要扫描成 PDF,不要拍照
拍照的图片读不出明细。 平台对图片只做简短描述,不做逐字识别;PDF 才走完整的
识别链路。实测同一张单:扫描件 PDF 能读出全部 30 行明细,拍照则读不到。
引导用户这样做(两步,都不需要额外装 App):
- iPhone:备忘录或「文件」App → 扫描文稿 → 存成 PDF
- Android:Google Drive → 加号 → 扫描 → 存成 PDF
供应商能发电子发票就别扫纸质件:有文字层的 PDF 准确率是 100%,扫描件约 83%。
如果用户手上有供应商邮件里的 PDF 账单,优先用那个。
处理流程
1. 判断单据类型
| 特征 | 类型 | 落账工具 |
|---|---|---|
| 有供应商抬头、明细行、单号 | 进货单 / 发票 | record_purchase |
| 有 Net Sales / 净销售、按日或按天汇总 | POS 日结 | record_pos_daily |
| 水电、燃气、垃圾清运、租金 | 经营账单 | record_expense |
| 盘点表、库存清单 | 盘点 | record_inventory_count |
一次收到多份就逐份处理,不要混在一起读。
2. 读取与抽取
用 read_document 读文件,按 票据字段口径 抽取。
遇到 OCR 把品名列与数字列分开输出的情况(跨页时很常见),务必先读该文档再动手。
3. 落账前自检
调用 record_purchase 之前,自己先算一遍:
- 每一行:
数量 × 单价 = 金额 所有明细金额之和 = 小计小计 + 运费 + 税 = 总额
三条里任何一条对不上,说明读错了,回到原单据重读那几行。
4. 落账
调用对应工具。服务端会再校验一次同样的三条恒等式,不通过就拒绝入账并告诉你错在
第几行。收到校验失败时,回原单据重读,不要调整数字去凑平——凑平会把错误变成
一笔看起来正常的错账,比报错危险得多。
单据按「供应商 + 单号」幂等,同一张单重复提交只会更新,不会重复入账,放心重试。
5. 回报
告诉用户:入账了几张单、金额多少、新建了哪些品项、有没有需要人工确认的。
新建品项要单独点出来——它们多半是同一样东西的不同写法(见下)。
品项归一化
同一样东西在不同单据上写法不同,是这个场景最普遍的麻烦:
「菜心」「菜芯」「YU CHOY」「YU CHOY BOX 30LB」其实是一个东西。
系统按 品项编码 → 别名精确 → 别名前缀 三级自动归一,命中后会把新写法登记为别名,
越用越准。跨不过去的会留成待确认品项,用 list_items 加 needsReviewOnly 筛出来,
确认无误后用 merge_items 合并。
抽取时品项编码有就一定要填——它是唯一可靠的标识。中文品名会被识别错(实测
「芥兰」被读成「菜兰」),不能作为判断依据。详见 品项归一化。
经营分析
用户问到经营状况时:
| 问题 | 工具 |
|---|---|
| 这个月成本率多少 / 花了多少钱 | get_cost_summary |
| 什么东西涨价了 / 为什么变贵了 | find_price_anomalies |
| 某样东西以前多少钱 | get_item_price_history |
| 主要从哪几家进货 | get_supplier_summary |
食材成本率健康区间是 28%–35%。 超出要主动说,并顺手用 find_price_anomalies
查是哪些品项推高的——用户真正想知道的是原因,不是数字。
要出 Excel 报表时用 office_artifact(format: "xlsx"),格式见
报表输出约定。
边界
- 不做实时库存。餐饮的库存靠周期盘点,不靠出入库流水推算。
- 不做税务申报与 sales tax 合规计算,那是会计的事。
- 不对接 POS 系统 API,只处理导出的报表文件。