考察点
这道题出自字节跳动番茄智能体应用开发岗二面,场景标注是 RAG 与多模态检索。它考察的是文档解析链路的工程细节:你知不知道 OCR 会出什么类型的错、纠错有哪些手段、代价各是什么,以及不纠错时噪声会沿着「embedding 向量偏移→召回失败→生成幻觉」这条链一路传导到最终答案。追问一般落在纠错引入新错误怎么防、以及 LLM 纠错的成本怎么控制。
参考答案
先搞清楚 OCR 会犯什么错
纠错策略要按错误类型开方子。OCR 的典型错误分几类:
- 形近字混淆:「己/已/巳」、「未/末」、「0/O」、「1/l/I」,中英文混排时尤其多;
- 结构与断行错误:多栏排版识别顺序错乱、表格行列关系丢失、一句话被页眉页脚拦腰截断;
- 缺字与多字:低分辨率区域漏字,印章、水印、底纹被误识别成文字;
- 符号噪声:乱码、连续标点、识别置信度低的区域吐出的随机字符。
纠错路线一:规则与置信度清洗
最便宜的一层。OCR 引擎(PaddleOCR 等)本身就返回每个识别框的置信度,低于阈值的片段先标记而不是直接用——要么重识别(放大、二值化后重跑),要么在文本里打占位标记。配合规则清洗:去掉孤立乱码字符、修复断行(判断行尾是否是句子边界,不是则拼接)、用标点规则修全半角混用。这层处理能清掉最明显的垃圾,成本几乎为零,必须做。
纠错路线二:词典与统计纠错
针对形近字,经典方案是混淆集 + 编辑距离 + 领域词典。维护形近字混淆表(「己已巳」互为候选),用领域词典(产品名、术语表)做词级别校验:识别出的词不在词典里、且和某个词典词编辑距离为 1,就进入候选替换。结合 n-gram 语言模型给替换前后的句子打分,选概率更高的那个——「该系统己于上周上线」里「己于」的 n-gram 概率远低于「已于」,统计信号足够纠正。这层的好处是可解释、可控,替换有明确依据,不会引入臆造内容。
纠错路线三:生成式纠错
用模型直接改写。小模型路线有专做中文纠错的模型(MacBERT 系的纠错模型),把纠错当序列标注任务,只改错字不重写,保真度高。LLM 路线是把 OCR 文本分段喂给大模型,prompt 里明确要求「仅修正明显的 OCR 错字和断行,不得增删语义」,保真度靠约束和抽查保证。LLM 对上下文依赖强的错误(需要理解句子才能判断的错字)效果最好,但两个风险必须管住:幻觉式改写(把没错但模型觉得「不通顺」的专业表述改错,术语最容易遭殃)和成本(全库文档过一遍 LLM 不便宜)。工程上常用分层策略:置信度低的段落才走 LLM 纠错,高置信度段落只做规则清洗。
不纠错会怎样:噪声的传导链
这是第二问,要答出具体的传导路径而不是一句「效果会变差」:
- 向量偏移。错字改变 embedding,「配置」识别成「配直」,这个 chunk 的向量在语义空间里就会偏离正确位置。用户 query 是干净的,相似度计算天然吃亏,召回率直接掉。
- 稀疏检索失灵。BM25 依赖精确词项匹配,错字词项和 query 词项永远匹配不上,关键词类查询全军覆没——混合检索里稀疏这一路等于被 OCR 噪声废掉了。
- 生成被污染。就算侥幸召回,错字文本进了 LLM 上下文,模型可能照抄错字(答案里出现「配直文件」),也可能被噪声带偏做出错误解读。
- 索引与聚合失真。基于关键词的统计、实体抽取、去重(同一份文档扫描两次,错字不同会被当成两篇)全部受牵连。
一个务实结论
纠错不是全有或全无。资源有限时,优先保证高价值文档和高频查询命中的文档走完整纠错链路,其余只做规则清洗;并且永远保留 OCR 原文和纠错后文本两份,纠错错了还能回退、还能对比定位问题。
可能的追问
- LLM 纠错引入了新的错误怎么办? 答:prompt 限定只改错字不改语义;术语白名单保护关键词;抽样人工比对纠错前后 diff;保留原文可回退。
- 纠错效果怎么评估? 答:拿一批带人工校对结果的 OCR 样本算纠错后的字符错误率(CER)下降幅度;端到端看纠错前后检索 Recall@K 的变化,这才是业务关心的指标。
- 扫描版 PDF 和文字版 PDF 处理上怎么区分? 答:先探测 PDF 有没有文本层,有文本层直接抽取不 OCR(零噪声);没文本层才走 OCR + 纠错链路,别对所有 PDF 一刀切。
- 多栏、表格类版式错乱怎么修? 答:用版面分析模型(LayoutParser、PaddleStructure 这类)先检测栏位和表格区域,按区域重建阅读顺序,比事后在文本上修断行靠谱得多。