微信扫码
添加专属顾问
将文件转化为可信数据资产,揭秘AI解析工程中的关键挑战与实战方案。 核心内容: 1. 企业文件数据化面临的现实困境与核心难点 2. 从直接解析到结构化识别的技术演进路径 3. 构建可解释、可复查的数据生产线核心流程
时至今日,很多传统公司的大部分的数据依然使用office文件去管理,,把excel和图片当做数据库去管控是一个很常见的现象。
Excel、CSV、PDF、Word、邮件正文、聊天记录、扫描件、截图、各种系统导出的半结构化表。它们每天在业务人员之间流转,被下载、转发、改名、复制,再上传到另一个系统。文件很多,数据以一种极低效率的方式在企业中运转。而且这些数据往往有时效性,所以自然会有“过期”无用的数据。
可以说文件只是信息的载体。它还不是数据。
文件只是信息的载体,还不是数据。真正的数据,至少要能被查询、关联、复用,也要能解释它从哪里来。否则它只是一个看起来很完整的 JSON,出了错却没人敢用。
我最开始做这类文件解析时,也很自然地想过:能不能直接把文件扔给大模型,让大模型直接输出业务需要的JSON?
后来发现这个想法太轻了。
难点不在于模型能不能识别几个字段。难点在于系统敢不敢相信这些字段。企业文件有一个很现实的特点:他们最初是给人看的,不是给机器看的。
人看得懂标题、备注、合并单元格、上下文、颜色、空行、缩写、附件说明。机器不懂。机器看到的是行、列、段落、文本块、坐标、页码,还有一堆不稳定的表格:
同一个字段,在不同文件里可能叫不同名字。
同一个表格,今天从第 3 行开始,明天从第 7 行开始。
同一个业务对象,可能被拆在多个 sheet、多个段落、多个附件里。
有些数字是金额,有些数字是数量,有些数字只是备注里的编号。
所以想要引入AI去解决文件导入的问题,一开始如果就想着怎么引入大模型,然后使用大模型去把数据“转成JSON”,那这个问题开始就已经偏了。
所以一上来就问“怎么让大模型把文件转成 JSON”,问题已经偏了。更应该先问的是:哪些内容可以稳定识别?哪些内容必须结合上下文?哪些字段即使识别出来,也不能直接入库?哪些地方必须保留来源,方便后面复查?
企业更想要的是一条能解释、能复查、能修正的数据生产线。
这张图看着长,其实核心就几件事:先认识文件,再拆开处理,再保留来源,再检查有没有漏,最后再决定能不能入库。
我们最开始试过一条很直接的路:把 Excel / CSV 转成 Markdown,再交给大模型理解,让模型输出符合业务 schema 的结果。
这个方案上手很快,非标准文本也能覆盖一些。但大表一来,问题就很明显:等待时间长、输出太大、容易触发 context window 或 max tokens,金额事实也不可控。
更麻烦的是,一旦字段错位,很难追溯到底是哪个单元格导致的。
我们尝试过让 LLM 做 Layout detector,也尝试过轻量 Layout hint。
这个方向比“LLM 直接输出金额”更安全,因为模型只判断结构,不给事实金额。并且在这个过程中也尝试过引入MarkItDown。MarkItDown 可以把 Excel 转成更容易阅读的 Markdown。它适合:人工快速理解文件内容,离线分析某些文件的文本表达,给模型提供较友好的文本上下文。
但是它不适合作为正式解析主链路的原因主要在于:
Markdown 可能丢失合并单元格语义。
横向块和空表头列的坐标语义会变弱。
模型读 Markdown 后仍可能生成事实。
解析结果不容易回到 workbook row/column。
所以这个阶段我们都是考虑如何处理数据才能让大模型得以解析,但是慢慢发现一个问题,那就是如果后端已经能稳定识别结构,调用 LLM 只会增加等待。并且如果 LLM 输出完整 LayoutPlan,仍然有 schema 重和超时问题。如果只输出 hint,后端还需要负责 section 展开、坐标校验和 executor。
方案结论:
对于Excel文件而言,不同的企业里面有着截然不同的使用方式,Excel不再是纯数据文件,同时承载着数据、布局、视觉表达和人工填写习惯。在真实的业务文件里,关键信息不是常来自某个固定字段,它可能来自sheet名,可能来自文件名,或者它可能来自标题行、表头甚至子表头。并且出现很多场景会合并单元格,有的列有的行又可能是空。所以Excel解析的目标不是“把所有文本读出来”,而是:把带布局语义的表格,转成业务可消费/可追溯/可复核的结构化事实。
这句话里有三个关键要求:
可消费:输出必须符合业务schema
可追溯:重要字段最好能回到sheet、row、column或原文片段
可复核:不确定的地方要进入missing / warning / confidence,不能静默编造
这是一个真实的需求,在海运报价的场景中,我们需要把报价文件的数据转变成运价的一个routes,关键的信息可能包含:船公司、币种,还要重要的数据比如起运港、目的港、中转港等,除此之外还要航线柜型对应的价格的信息,一条route对应包含有效期,除此之外还有其他数据就不在这里过多罗列。
而在另一个local费用的场景中,解析的目标不是routes,而是本地费用的模版,包含的信息则为船公司、起运港、费用项(各类的附加费和计费规则)、币种等。
消费方往往是上游查询的应用,解析结果最终会进入报价池,用于后续报价匹配。两个业务都在“解析excel”,但它们不是同一个解析任务,维度不同关注的数据也不一样。但是对于AI应用而言,数据又需要保持跟业务相关,且需要保证数据的准确性。
但是两者又有本质行为的相似之处,输入源都是Excel,底层文件读取模型调用或者是trace、token usage又可以复用。但是又需要将业务的schema、prompt、归一化、校验、失败策略拆开。
做 Excel 解析时,我现在不会先问“用哪个 OCR / LLM / 库”。我会先问几个更业务的问题。
第一,先定义业务对象。
最重要的入库对象是什么?它的业务主键是什么?哪些字段必填?哪些字段可以后续补?哪些字段绝对不能推断?它会不会直接参与金额计算或业务决策?
报价解析里的港口和柜型金额不能乱猜。Local Fee 里的金额也不能被模型结合常识补齐。很多解析问题,都是因为一开始没有把这个边界说清楚,最后把“读到了文本”误认为“解析成功”。
第二,再定义消费方。
同一份解析结果,给后台入库、给业务人员预览、给上游报价匹配系统使用,设计都不一样。哪些字段入库,哪些字段展示,哪些字段只作为 trace 保留,需要提前想清楚。
第三,再判断 Excel 的结构类型。
不要按客户名或文件名堆判断。真实 Excel 更适合先归纳成结构原语:标准表、分段表、宽表、横向块、文本块、混合表。
这一步要回答:业务实体在行上还是列上?金额是单列还是拆列?信息来自显示列,还是来自标题、sheet 名、文件名?备注和条件是不是混在某个单元格里?
第四,区分结构判断和事实读取。
LayoutPlan 只告诉系统“去哪里读”,不能代替事实本身。关键金额、柜型、费用项,最终应该由 executor 回读 workbook 原始单元格。
第五,设计观测字段。
至少要有 parseTrace、timings、missing、warning、confidence、source。否则解析失败时,只能靠人肉看文件,很快就会变成玄学。
我现在把链路拆成了几部分
1. 文件预处理只保留信息
文件预处理不应该过早去做业务解释,它更重要的职责在于:识别文件类型、读取workbook bytes、sheet文本和对Excel做必要内容的提取
可以说,它不应该决定哪个是业务模版,哪一列是金额,然后哪一行对应什么数据,模板是否覆盖这样的业务问题。
对于业务解释,应该交还给后面的parser、LayoutPlan、normalizer和人工确认
2. 高确定性规则先走规则parser
规则parser适合处理稳定、明确、可重复的格式,它不是大模型解析器,更多时候它是用工具进行解析的函数。这类规则特别适合处理:显示表头完整、列角色明确、section标题清晰、列表达固定等场景。
好处是,规则parser提供快路径:解析速度快、可测试、不消耗token、不依赖模型稳定性、出错时容易定位。但坏处是没法覆盖全部情况。
3. 复杂Excel引入布局中间层
真实的文件越来越以后,你会发现企业的数据是多样的,不可能每个文件都要写一个parser。企图处理所以场景,然后用枚举的方式去兼容是不现实的。更可维护的方式是引入布局中间层,我把这个层成为LayoutPlan。这个中间层主要描述sheet范围、行列范围、header行、数据起止行,还有meta数据的映射。
这样做的好处是新的Excel先归类为结构原语,不安客户名和文件名堆判断,并且executor 可以统一回读 workbook,validator 可以统一校验越界和缺轴。
4. Executor必须回读workbook
布局中间层只告诉后端“去哪里读”,但是不能代替后端读取事实,最终模版还是应该由executor从workbook原始单元格读取
这样做边界可以避免很多风险,比如模型看错数、模型补齐不存在的数据、markdown转换丢失坐标无法追溯。
5. LLM应该怎么用
大模型不是不能用,而是应该放在正确的位置:我更推荐使用LLM去做低置信解析结果的风险校验,或者去校验疑似错位字段,还有在 schema 很小的情况下输出 layout hint。最不推荐做的就是使用LLM 直接输出完整 workbook 解析结果并作为事实。
6. 输出必须经过schema和normalizer
无论结果来自规则还是 LLM,都应该经过统一输出层。输出层负责: 缺失字段进入missing。 不确定内容进入warnings。风险费用标记needsReview或displayOnly。这样可以避免每个 parser 都各自输出一套字段习惯。
最终我们的方案职责拆分如下:
这个组合的好处是:
标准文件快。
非标准文件可以扩展结构原语。
关键金额来自原始单元格。
LLM 有价值,但不控制事实。
trace 能解释每一步为什么这样解析。
不同业务必须有不同 schema。报价解析和 Local Fee 解析如果共用一套 schema,短期看起来省事,长期一定会互相污染。
正确的做法是:底层能力复用,业务 schema、normalizer、测试样本分开。这样出问题时,才能知道是哪个业务、哪个模板、哪个规则出了问题。
Instructor 不是一个大模型,也不是 Agent 框架。它是一个围绕大模型调用的结构化输出工具。
更准确地说:
它把“请模型输出 JSON”变成“请模型输出符合 Pydantic schema 的对象”。
它会把模型原始输出解析成 Python 类型对象。
它会用 Pydantic 校验字段是否存在、类型是否正确、枚举值是否合法。
它可以在校验失败时自动重试,但本项目报价解析默认不建议开启重试。
from pydantic import BaseModel, Fieldfrom langchain_openai import ChatOpenAIimport instructorclassBusiness(BaseModel):# 模型定义llm = ChatOpenAI(model="gpt-3.5-turbo",api_key="你的openai密钥")instructor_llm = instructor.patch(llm)# invoke 直接返回校验后的结构化对象,无需手动解析JSONresult = instructor_llm.invoke(input=prompt,response_model=Business)# 关键:强制模型输出匹配该模型结构
在当前涉及大模型解析的业务场景中,模型经常需要返回 JSON。只靠 Prompt 约束会遇到这些问题:
返回半截 JSON。
字段名漂移,例如routes写成route_list
类型错误,例如价格应该是数字却输出"USD 3050"
嵌套结构缺字段,例如某条 route 没有pod_raw
枚举值不受控,例如status输出成“解析完成”而不是success。
Instructor 可以把这些问题前置为 schema 校验问题。
Instructor 不能替代 OCR、不能替代业务规则,也不能自动理解业务逻辑。它就像一个输出约束,它不能替代业务解析的能力,更不知道每个字段代表了什么含义,它只知道哪些字段应该存在。
所以它应该放在“结构化输出校验层”,不能被误用成“报价解析能力本身”。
当前边界是:
单轮模型调用优先。成功就是返回完整 JSON。失败就是返回失败状态和错误信息。不开放同步人工复核中间态。默认不做“失败后二次模型修复”。
因此 Instructor 的默认策略应该是:
这能避免为了修复 JSON 格式而额外调用模型,导致成本和耗时不可控。
最后附上我完整项目的时序图,这篇文章分享就到这里,感谢阅读。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2026-07-11
2026OpenClaw企业知识库哪家好 实测混合RAG多模态文档解析适配效果
2026-07-11
Context Over Control:当 AI 开始旁听每场会议,公司会更聪明还是更紧张?
2026-07-10
LLM Wiki:让对话真正沉淀下来
2026-07-09
AI顾问画像引擎:如何把专家经验变成可计算资产
2026-07-08
工程师的知识操作系统:如何用五步法搭建个人知识管理体系
2026-07-07
AI 原生知识库不是资料库,而是企业智能体的工作接口
2026-07-07
本体论离你有多远:LLM时代的知识结构升级
2026-07-07
老板最大的 AI 幻觉:以为 AI 是用来裁人
2026-04-28
2026-06-04
2026-06-11
2026-04-20
2026-04-26
2026-04-24
2026-04-14
2026-06-15
2026-05-09
2026-05-07
2026-07-11
2026-07-07
2026-07-04
2026-06-30
2026-06-29
2026-06-29
2026-06-19
2026-06-04
欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。
在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。
一、 定义
本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。
会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。
知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。
二、 账号注册与登录
登录方式:本网站支持以下登录方式,您可根据实际情况选择:
微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。
手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。
账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。
实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。
未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。
三、 服务内容与规范
知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。
服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。
禁止行为:您在使用服务时不得实施以下行为:
利用技术手段批量爬取、下载、转存知识库内容;
将知识库内容用于商业目的或未经授权地向第三方传播;
干扰本网站正常运行或侵犯其他用户合法权益;
发布违法违规信息或从事违反公序良俗的活动。
四、 知识产权声明
权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。
有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。
侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。
五、 个人信息保护
我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。
您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。
您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。
六、 免责声明
内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。
不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。
第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。
七、 违约责任
如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。
如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。
八、 法律适用与争议解决
本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。
因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。
九、 其他
本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。
本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。
我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。