简介:Agent 与 RAG 应用“看不懂”文档,根因多半不在模型智商,而在解析层:跨页表格行列错乱、扫描件幻觉编造数字、答案出处无法追溯。本文从“大模型消费的是 token 流而非版面”这一根因出发,深度拆解三类典型失效场景,给出解析方案评测维度、对照实验设计与七条工程落地检查项,帮你为知识库与 Agent 构建可靠的文档数据层。
理想状态很美好:把文档丢给大模型,Agent 自动读表、抽取字段、回答问题。但真实工程里,翻车几乎是常态。三个典型现象,做过知识库或文档 Agent 的开发者应该都眼熟:
这些问题的根源不在模型的“智商”,而在“视力”。
大模型读到的是一维 token 序列,而文档是二维(甚至多维嵌套)的版面结构。两者之间的错位具体表现为三点:
换句话说,在模型之前,必须有人把“版面”翻译成模型能精确消费的“结构化数据”。这正是文档解析(Document Parsing)的职责,也是它从 OCR 的衍生话题演变为 AI 基础设施关键一环的原因——RAG 知识库、办公 Agent、训练数据清洗,谁都绕不开这一层。
从架构视角看,一条成熟的 Agent 文档链路通常分三层:
解析层是整条链路的地基。地基不稳,上层 Agent 的所有“智能”都是空中楼阁。
失效机理:如果解析方案按页独立处理,每页各自识别一个表格,第二页的表体就失去了第一页的表头与列语义;如果按纯文本顺序拼接,行列边界会完全丢失。更麻烦的是合并单元格:一个跨两行的合并格,在错误还原下会把数据“错位一格”塞进隔壁列——这种错误不报异常、不抛警告,只会安静地污染下游数据。
避坑要点:
def validate_cross_page_table(parsed, ground_truth):# 行列数一致性assert len(parsed.rows) == len(ground_truth.rows)assert all(len(r) == len(ground_truth.rows[0]) for r in parsed.rows)# 表头复现:续表应还原出与前页一致的列结构assert parsed.header == ground_truth.header# 单元格级抽样比对for cell in sample_cells(ground_truth, n=20):assert parsed.cell(cell.row, cell.col) == cell.value
失效机理:扫描件没有文字层,必须经过 OCR。OCR 对清晰印刷体准确率较高,但对低质量扫描(倾斜、模糊、印章遮挡、手写批注)容易出错。真正的危险在于:下游模型不具备“识别不出”的自我认知,会把 OCR 噪声或自身编造包装成确定答案,语气自信、格式工整。
避坑要点:
失效机理:如果解析结果只有正文文本、没有坐标与页码,那么无论下游模型多强,都无法回答“这个结论来自第几页哪个单元格”。溯源信息必须在解析阶段就埋进数据结构里,事后无法补齐。
避坑要点:
{"page": 7,"type": "table","bbox": [120, 340, 560, 890],"cells": [{"row": 3, "col": 2, "text": "450.00", "bbox": [210, 512, 260, 530]}]}
很多团队选型时被 demo 惊艳,上线后翻车,问题出在评测方法。建议做好两件事。
第一,用自己的业务文档构建黄金集。 公开基准与你的真实文档分布往往差异巨大——你的文档可能是双栏技术报告、盖章合同扫描件、嵌套多层的三线表。从真实流量抽样 50~100 份,人工标注期望输出,作为长期回归测试集。评测维度至少包括:
第二,做“纯 AI 直读 vs 解析后 + AI”的端到端对照实验。 同一批文档、同一组问题,跑两条管线,对比四个指标:答案准确率、幻觉率、引用准确率、端到端时延与成本。经验上常见的规律是:原生数字版 PDF 上两条管线差距不大,但扫描件、复杂表格、多栏版面一旦出现,直读管线的幻觉率会明显抬升;而解析管线的代价是增加一个预处理环节。这个对照能帮你在“解析前置”与“模型直读”之间,找到符合自己文档分布的取舍点。
给 Agent 喂文档这件事,模型能力再强,也绕不开一个前提:它拿到的东西得是干净、结构完整、可追溯的数据。文档解析就是这层“视力矫正”——跨页表格的合并、扫描件的置信标注、每个结论的页码坐标,这些不起眼的工程细节,决定了上层应用是“能演示”还是“能上线”。
先修视力,再谈智商。把解析这一关过了,Agent 才真正具备干文档活儿的资格。