做生意的人都熟悉这个场景:客户下单的方式千奇百怪。有人发一句微信——「张经理 A 产品 200 件 单价 8 周五要」;有人甩来一张 Excel;有人直接拍一张报价单照片;还有人给一份扫描的 PDF。而公司这边,得有人把这些一条条手动敲进系统,又慢又容易错。
这篇记录我怎么做一个自动录入工具:让 AI 把这些“任意格式”的来单读懂,变成一条规整的订单,自动写进一个团队都能看的在线表格。工具本身不难,难的是怎么让它可靠到敢真用。我把过程里的判断和踩过的坑都写下来。
内容做了脱敏——所有涉及具体项目的地方都用「某企业」「某产品」这类说法,方法是通用的,任何要把“杂乱输入变成规整数据”的场景都用得上。文章写给完全的新手,术语第一次出现都会用一句白话解释。
先看整体:数据怎么流动
先说两个词:结构化数据,就是一条条字段整齐的记录(客户、产品、数量各占一格),方便统计和查找;与之相对的是一段大白话文字,叫“非结构化”。这个工具干的事,就是把非结构化的来单,变成结构化的订单。
再一个:多模态大模型——“多模态”指它不仅能读文字,还能看图。所以一张拍下来的报价单,它也能“看懂”里面写了什么。
整条流水线是这样:
- 任意格式来单(文字 / Excel / Word / 图片 / 扫描 PDF);
- 多模态解析:模型读内容,抽出订单字段,并对每个字段标注“确定还是不确定”;
- 换算·归一:把“千克 / kg”统一成“公斤”这类,单位口径拉齐;
- 写入表格:确定的字段正常入库,原文和原件永久留底;
- 留底·提醒:有拿不准的,标记“待复核”并提醒人来看。
最后订单落在一个在线多维表格里——就是那种既能当数据库、又能当看板和统计面板的云端表格(例如飞书 / Lark 这类),团队多人可以同时查看、分类、做报表。AI 只负责“录入”这一个动作,查看和协作仍然交给表格本身。
一条总纲:保守优先
在写任何功能之前,先定了一条压倒一切的原则——宁可留空,也绝不瞎填。模型对一个字段没把握时,让它空着、标记出来让人补,而不是猜一个填进去。因为录错一个数量或单价,比空着更糟:空着有人会补,填错了没人知道。
围绕这条总纲,有五条设计原则贯穿始终:
- 保守优先:字段不确定就留空、标记,绝不猜测填错;
- 原文永久留底:每条记录都把原始文字和原始文件存进去,任何时候可追溯;
- 置信度驱动复核:模型对每个字段输出“确定 / 不确定”,只要有一项不确定,整条打上“待复核”;
- 幂等防重:同一份来单不会被重复录入两次(后面解释“幂等”);
- 失败不致命:某一单解析失败就记日志、跳过,继续处理下一单,绝不让一颗老鼠屎坏一锅粥。
核心手法:让模型“只吐结构化 JSON”,还带“确定度”
这是整个工具最关键的一步。我们不让模型用大白话回答,而是要求它只返回一段严格的 JSON——JSON 是一种机器好解析的、键值对格式的文本。而且每个字段不只给值,还要给一个置信度标记(confident: true / false),也就是模型自己判断“这个我拿得准吗”。
给模型的指令(提示词)大致长这样:
你是订单信息抽取助手。从来单内容里抽取字段,只返回 JSON,不要任何多余文字。
每个字段包含 value(值)和 confident(是否确定):
{
"客户名称": {"value": "", "confident": true/false},
"产品": {"value": "", "confident": true/false},
"数量": {"value": null, "confident": true/false},
"单位": {"value": "", "confident": true/false},
"单价": {"value": null, "confident": true/false},
"原文摘录": "留底用的关键原文"
}
规则:
- 找不到的字段 value 留空,confident 设 false。
- 拿不准、模糊、有多种解读的,confident 一律 false(宁可标记复核,绝不猜测)。
- 单位归一化:kg / 千克 → 公斤 …
几个让它稳定的小手法,都是反复试出来的:
- 给一两个例子(术语叫 few-shot,“给几个示范”):在提示词里放一条“输入长这样、输出就该是这样”的范例,模型照着学,格式稳很多;
- 温度设 0:“温度”是模型的随机性旋钮,调到 0 让它每次尽量给一致的结果——录数据要的是稳定,不是创意;
- 要求归一化:单位、称呼这些口径在提示词里就规定死,别指望入库后再清洗;
- 容错解析:模型偶尔会不听话,在 JSON 外面套一层 markdown 代码框,或前后多几句话。代码里做个兜底——截取第一个
{到最后一个}再解析,别因为一层壳就整条失败。
- 因为这一个布尔值,把“模型的不确定”变成了程序能读、能据以分流的信号。后面“自动入库还是找人确认”,全靠它。没有它,你只能要么全信、要么全查,没有中间地带。
一道闸门:自动入库,还是弹窗让人确认
有了每个字段的“确定度”,就能设一道置信度闸门来分流:
- 所有关键字段都“确定” → 自动入库,屏幕上给一条绿色回执(客户 + 产品 + 数量 + 单价 + 金额),录入员瞄一眼就行,不打断;
- 任一关键字段“不确定” → 弹出一张确认卡:不确定的字段高亮、旁边给输入框让人补;确定的字段也显示、也允许改。人点“确认入库”才真正写进表格。
这里有个刻意的设计——“关键字段”只圈定客户、产品、数量、单位、单价这几个;联系方式、备注这类次要字段不确定,不强制打断,可以入库后再补。别让每一点小瑕疵都拦住人,那样自动化就没意义了。
- 刚上线时,故意把触发确认的门槛调低——稍有不确定就弹窗,让人多确认几次,攒对系统的信任;用一段时间、确认它识别得稳,再放宽到“更多单直接自动入库”。
- 关键是:把这个松紧度做成一个可调参数(配置里的一个阈值),以后调节不用改代码。
给非技术员工的“傻瓜界面”
底层引擎能无人值守地批量处理,但真正天天用它的是不懂代码的录入员。所以在引擎之上,做了一个聊天式的网页界面:打开就是一个像聊天窗口的页面,打字或把文件拖进去,系统当场解析——确定就自动记好、不确定才弹出来让补。
几个定位上的判断,比功能本身更重要:
- 不让员工碰命令行:做一个双击就启动的图标(背后帮他把服务开起来、把浏览器打开到录入页)。员工的世界里只有“双击、打字、拖文件”;
- 复用,不重写:界面直接调用已经跑通的解析、换算、写库函数,不把底层逻辑重抄一遍——两套代码各写一遍,迟早不一致;
- 划清边界,故意不做:不做登录(就一台电脑一个人用)、不做多轮闲聊(这是录单器不是聊天机器人)、绝不给它任何能改代码 / 删文件 / 跑命令的能力。界面越“笨”,越不可能被误操作弄坏。
- 给非技术同事的工具,“不能做什么”和“能做什么”一样重要。把危险能力从一开始就关在门外,比事后叮嘱“别乱点”可靠得多。
各种格式怎么读:分流 + 复合成一单
“任意格式”听着吓人,拆开其实就两条路:
- 能抽出文字的(txt / Excel / Word / 带文字层的 PDF)→ 先把文字抽出来,走文本模型(更便宜更快);
- 抽不到文字的(图片、扫描件 PDF)→ 转成图片,走多模态模型用“看”的。判断扫描件很简单:PDF 抽文字如果抽出来是空的,基本就是扫描件,转图片走视觉。
还有个常见情况:一笔订单的资料是分开的——一段文字说明 + 好几个附件。做法是把它们综合成一条订单来解析,并定两条规矩:
- 信息冲突时,以文字说明为准,文件作为补充佐证;
- 给图片数量设个上限(比如一次最多 6 张),超了只取前几张并标记需人工复核——防止一次塞太多把请求撑爆、反而漏信息。
人和模型,各干各的
回头看,整个工具其实是一次分工:
- 模型接下体力活:读各种格式、从乱文本和图片里抽字段、把单位口径拉齐、批量重复处理;
- 人只做裁决:补模型标“不确定”的字段、点最终确认、定规则和松紧门槛。
这不是“AI 全自动”,也不是“纯人肉”,而是把判断留给人、把重复留给机器。模型再强,也是它读、人拍板。
改单、留痕与不重复
真实业务里订单会变,还要防重复,这几处也定了规矩:
- 改已有单:不靠人翻找。系统按“客户 + 产品”列出候选,人选中一条,弹出“旧值 → 新值”的确认卡,只改提到的字段、不误伤其他,并且把这次改动追加到修改历史里留痕;
- 永久留痕:哪怕是自动入库的单,原文也写进“原始信息”字段、原件挂到“附件”。任何一条记录都能回溯到它最初长什么样;
- 幂等防重:**“幂等”**的意思是——同样的操作做一次和做多次,结果一样。这里用“文件名 + 内容指纹”做判断,同一份来单不会被录进去两次。
部署与那些用血换来的坑
把开发机上跑通的东西交付到真正使用的机器,往往才是真考验。这几个坑,值得任何做类似工具的人先知道:
| 坑 | 现象 | 对策 |
|---|---|---|
| 模型端点没切 | 换到交付环境后解析报错 / 读图能力变了 | 开发和交付可能用不同的模型服务地址(base_url);交付前切到目标端点,并用真正的多模态模型重测读图,别拿开发时的模型想当然 |
| 在线表格的“AI 自动提取”字段 | 脚本刚写入的数量、单价,过几秒被清空或改掉 | 这类在线表格常带一个“AI 从文本自动提取”的字段功能,它会在你写入后反读原文、覆盖你的值。给关键字段一律用普通文本列;金额这种用公式列(公式只读不抢写) |
| 分两步写入 | 先建记录、再补附件,触发上面那个覆盖 | 一次写完:字段和附件在同一次写入里提交,别“先建后补” |
| 启动脚本乱码 | 双击启动脚本直接报错、命令被拆坏 | 有些系统的地区设置不是 Unicode,启动脚本(.bat/.vbs)的内容要纯英文;中文界面放到浏览器网页里(网页是 UTF-8,正常) |
| 云同步截断文件 | 读到的文件是被截断的半截,处理出残缺结果 | 云盘(OneDrive 这类)同步中的文件可能只同步了一半就被读到;重要文件确认同步完成,或改从本地可靠位置读 |
最后这条尤其要记:云同步很方便,但它同步到一半的文件是“薄薄一层壳”。 项目从云端搬到本地、或跨机器迁移时,最容易在这里悄悄丢东西——文件看着在,内容却缺了一块。
结语
做完这个工具,最深的感受是:让 AI 读懂杂乱输入,技术上已经不难;难的是让它“可靠到敢真用”。 而可靠不来自更强的模型,来自几条朴素的规矩——
保守优先(不确定就留空)、原文留底(永远可追溯)、置信度复核(把不确定交给人)、人来拍板(模型读、人定)。
模型会一代代变强,但这几条规矩可以作为稳定的一层保留下来。工具真正的价值,不是“全自动”这个听着酷的词,而是——把重复交给机器、把判断留给人,两边都做自己最擅长的事。