想象一座繁忙的数字王国——你的知识库。每天有成百上千份文档像旅行者一样,拿着自己的“护照”在王国门口排队。这些护照五花八门:有的是电脑直接生成的电子文档(原生 PDF),有的却是用手机拍照、扫描仪扫出来的“照片护照”(扫描件、图片 PDF)。海关查验员(OCR 引擎)的任务,就是在第一道关口把这些照片护照上的笔画、污渍、歪斜的文字逐字“读”出来,转换成王国系统能识别的电子文本。读错了怎么办?名字被抄错的人进了关,后续要找他时——查无此人,或者找到一堆同名错人。RAG 系统里最贵的往往不是生成回答,而是“文档进库”这一关。OCR 就是这道关,它决定了文本能不能进向量库、检索能不能命中。本文就按海关查验的完整流程走一遍:设备选型(工具)、清整护照(预处理)、分栏验看(版面分析)、对付特殊格式(表格公式)、错字后果(检索影响),以及年终考核(评测方法)。
理解 OCR 及其工程链路,是做好 RAG 知识库与文档智能化的基本功——它直接决定了你的检索天花板。掌握本文内容,你就能独立完成扫描件入库、OCR 选型与评测,让知识库真正“认得出、找得着”。
可视化演示
动态演示OCR识别的核心机制,通过基础/核心/应用/扩展四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
OCR识别:OCR在 OCR在RAG管线中的位置与核 OCR工具链与引擎对比分析 核心机制可视化 OCR识别整体架构与关键组件
OCR管线定位
数字王国的边境线上,海关查验员守在第一道闸口。每天涌来的“旅行者”分两种:一种拿着电脑直接生成的电子护照(原生电子 PDF),机器一刷就能读取;另一种拿着的是印刷后拍照或扫描出来的“纸质照片护照”(扫描件和图片 PDF),上面的字在系统眼里只是一堆深浅不一的像素格子。查验员必须先把这些像素读成文字,签发一张“电子通行证”,旅行者才能进入王国腹地。
RAG 系统的标准管线是:文档加载 → 解析 → 切分 → 向量化 → 向量库 → 检索 → 生成。OCR 就处在“文档解析”这一步,是整个管线的第一道质检。后面所有环节拿到的都是 OCR 输出的文本:文本错了,向量化就错;向量错了,检索就歪;最终答案自然不靠谱。有一个常被忽视的真相——向量检索的命中率上限,在文本入库那一刻就已经锁死了。
具体落地时,团队通常先用 PDF 解析库(如 PyMuPDF、pdfplumber)尝试直接抽取文本;只有检测到文档没有文本层(即扫描件/图片 PDF),才进入 OCR 流程。判断依据很朴素:抽出来的文本为空、或文字量远小于页面视觉信息量。OCR 输出后还要做轻量清洗(去重、统一换行),再交给切分器。为什么要这么较真?因为检索相关度的数学基础是向量相似度,而向量的原料就是文本:
1. 向量化表示:把检索问题和文档片段分别映射成高维向量,$\vec{q}$ 代表问题、$\vec{d}$ 代表文档。
2. 点积计算:分子 $\vec{q} \cdot \vec{d}$ 把两个向量逐维度相乘再求和,衡量方向上的重合程度。
3. 模长归一:分母 $\|\vec{q}\| \cdot \|\vec{d}\|$ 用各自长度做归一化,消除文本长短带来的偏差。
4. 读取结论:结果落在 $[-1,1]$ 区间,越接近 1 相关度越高;OCR 错字会让 $\vec{d}$ 漂移、分值下降。
所以,边境官不是可有可无的边缘角色。他签发的每一张电子通行证,决定了后续检索官能不能在档案库里快速找到正确的人。OCR 这一关做不好,后面所有昂贵的大模型环节,都在给一个“字都认错”的系统打工。
OCR工具选型
查验员手里拿什么设备,直接决定查验效率。有的海关配的是老式放大镜(通用开源引擎),有的配了智能证件阅读机(面向中文优化的方案),有的干脆把整本护照拍照发给总部专家团(云端 API 和视觉大模型)。设备没有绝对好坏,只看你的口岸主要接待哪类人。
OCR 工具选型没有银弹。做 RAG 知识库,常见选项分四类:一是 Tesseract,历史悠久、完全开源,对英文和印刷体尚可,但中文长文和复杂版面表现平平;二是 PaddleOCR,百度开源项目,中文识别强、自带版面分析和表格识别管线,是目前国内团队最常用的底座;三是云服务(百度、阿里、腾讯 OCR API),开箱即用、精度高,但有数据出境和按量付费的问题;四是视觉大模型(GPT-4V、Qwen-VL、InternVL 等),直接“看图说话”,适合版面复杂或需求灵活的边角场景,成本也最高。
选型时要按“语种 × 版面复杂度 × 数据敏感度 × 预算”四个维度打分。还有个实操技巧:把置信度阈值纳入流程。OCR 引擎对每个字段会输出置信度 p,设一个阈值 τ,低于阈值的文本不进向量库,而是走人工复核或二次识别:
1. 定义输出:$\hat{y}$ 是最终判定结果,只有“接受入向量库”和“转人工复核”两种取值。
2. 读取置信度:$p$ 是 OCR 引擎对某字段(如合同编号)给出的置信度,范围 0 到 1。
3. 设置阈值:$\tau$ 是预先定好的门槛,比如 0.85,经验值来自历史错误分布。
4. 分段判定:当 $p \ge \tau$ 时接受;$p < \tau$ 时转入工复核,避免错字带病入库。
选设备的核心逻辑是“认得出、认得准、成本扛得住”。老放大镜不是不能用,只是面对中文客户时效率太低;一套智能证件阅读机前期投入大,但每天处理上千份扫描件时,便宜设备会让复核区排起长队,隐性成本反而更高。
图像预处理
护照在包里揉皱了、淋了点雨、照片还贴歪了——查验员直接读会很吃力。所以海关通常先做一次“清整”:压平褶皱、扶正角度、擦掉污渍,再递给识别设备。这套动作对应到 OCR 管线上,就是图像预处理。
图像预处理是整个流程中最容易被低估的一环。拍照和扫描的文档常见四类问题:一是噪声(灰尘、水印、压缩痕迹);二是倾斜(放歪了 3~10 度);三是光照不均或背景发灰;四是分辨率不足。对应处理分别是:降噪滤波、倾斜矫正、对比度增强、超分或重扫。
其中倾斜矫正回报最高。用霍夫变换或投影轮廓法算出倾斜角,再对图像旋转;角度扶正后,字符的垂直笔画对齐,识别引擎的字符切分准确率明显上升。另一项常用操作是二值化——把灰度图变成纯黑白的 0/1 图,降低背景干扰。设原始灰度值为 f(x,y),阈值为 T:
1. 输入灰度值:$f(x,y)$ 表示原图上坐标 $(x,y)$ 处的灰度,0 为黑、255 为白。
2. 设定阈值:$T$ 是分割前景和背景的临界值,可以固定,也可以按图像直方图自适应计算。
3. 置为前景:当 $f(x,y) \ge T$ 时,输出 $g(x,y)=1$,对应文字笔画。
4. 置为背景:当 $f(x,y) < T$ 时,输出 $g(x,y)=0$,对应空白或噪声区。
预处理做得好,等于把一张皱巴巴的湿护照变成干净平整的证件。查验员读起来省力,出错自然就少。很多团队发现:只做倾斜矫正 + 二值化两步,字符错误率就能下降一半以上——这是整个 OCR 管线里性价比最高的两小时。
版面分析
护照不是一整块文字,它有照片区、姓名区、证件号区、签章区;报纸更夸张,标题、正文、配图、广告栏全挤在一起。如果查验员不先分清这些区域,就可能把照片底下的印章当正文抄录。这就是版面分析要解决的问题。
版面分析(Layout Analysis)干三件事:区域识别、阅读顺序还原、噪声区剔除。区域识别把页面划分成标题、正文段落、表格、图片、页眉页脚;阅读顺序解决“双栏论文先读左栏还是右栏”这类问题;噪声剔除则把页眉、页码、装饰性水印从正文中摘出去,防止它们混进向量库。
现代版面分析有两类主流方法:基于检测的(用 DBNet、YOLO 系目标检测模型输出文本框坐标)和基于分割的(像素级分类成不同语义区域)。评估一个区域框得好不好,业界标准是 IoU 指标:
1. 预测区域:$\text{pred}$ 是版面分析模型预测出的文本框区域,比如标题框。
2. 标准区域:$\text{gt}$ 是人工标注的真实区域(Ground Truth)。
3. 交集面积:分子 $|\text{pred} \cap \text{gt}|$ 是两个框重叠部分的面积。
4. 并集面积:分母 $|\text{pred} \cup \text{gt}|$ 是两个框覆盖的总面积。
5. 计算比值:比值越接近 1 重合度越高,一般大于 0.5 就算检测命中。
分不清区域的查验员会给后续环节埋雷:把页脚的公司地址当正文切进向量库,检索“合同货款”时会莫名命中“客服电话”。版面分析做扎实,文本块才能按人类阅读顺序进入切分器——这一环节对 RAG 检索质量的影响,经常比选哪个 OCR 引擎还大。
表格与公式识别
入境申报单上全是格子:姓名、航班号、申报物品、金额。光把格子里的字读出来不够,还得知道每个字属于哪一行哪一列;公式则像另一种语言,Σ、√、分数线在视觉上是结构,不是简单的一串字符。这是 OCR 里最考验功力的部分。
表格识别(Table Recognition)比普通文本难一个量级。它分两步:结构识别(还原单元格的行列关系和合并情况)和内容识别(读格子里的文字)。主流方案输出 HTML 表格或 Markdown 表格,这样切分器拿到的才是语义完整的文本块。公式识别(Formula Recognition)则把数学表达式转成 LaTeX 源码,让“某个公式出自哪篇论文”这类问答成为可能。
那么如何衡量“结构还原得好不好”?业界常用还原结构与标注结构之间的编辑距离。编辑距离(Levenshtein 距离)指把一个序列变成另一个序列所需的最少单字符操作数,定义如下:
1. 状态定义:$d_{ij}$ 表示串 $a$ 的前 $i$ 个字符与串 $b$ 的前 $j$ 个字符之间的编辑距离。
2. 删除操作:从 $d_{i-1,j}+1$ 表示删掉 $a$ 的第 $i$ 个字符,代价为 1。
3. 插入操作:从 $d_{i,j-1}+1$ 表示往 $a$ 中插入 $b$ 的第 $j$ 个字符,代价为 1。
4. 替换判定:$d_{i-1,j-1}+\mathbb{1}(a_i \neq b_j)$,末尾字符相同时不加分、不同则加 1。
5. 取最小值:三种操作中选代价最小的路径,最终 $d_{mn}$ 就是完整串的编辑距离。
面对申报单和公式题,查验员不能只念出“字”,还得把“格”和“结构”原样复述出来。表格和公式识别做得好,RAG 才能回答“去年三季度各区域销售额对比”这类跨行跨列的问题;否则知识库里存的,只是一堆读不出结构的文字残骸。
错误与检索影响
海关最怕的事来了:查验员手一抖,把护照上的“王小明”抄成了“王小朋”。人倒是放进关了,可档案系统里查“王小明”时永远查不到这个人——他顶着一个没人认识的名字,在王国里彻底“失联”。
OCR 错误从来不是均匀分布的。最容易错的是:数字(0/O、1/l、8/B 这类形近字符)、专有名词(人名、公司名、产品型号)、生僻字和英文大小写。这些恰恰是检索里信息量最高的词。“98% 的字符准确率”听起来不错,但长文档里错误不断累积,而且错字往往集中在关键实体上——这正是检索最怕的打击面。
评估 OCR 文本质量的标准指标是 CER(字符错误率)。给定识别结果和标准答案,先算出最小编辑距离(S 个替换、D 个删除、I 个插入),再除以标准文本总字数 N:
1. 替换数:$S$ 是识别结果中“把正确字符换成了另一个字符”的次数。
2. 删除数:$D$ 是标准文本中存在、但识别结果里丢失的字符数。
3. 插入数:$I$ 是识别结果里凭空多出来的字符数。
4. 标准字数:$N$ 是标准文本(Ground Truth)的总字符数。
5. 求比率:CER 越低越好,经验上低于 2%~5% 才适合直接进向量库。
边境官抄错一个字母,可能让整份合同的编号在系统里“查无此人”。所以在 OCR 环节投入人力做复核、对数字字段单独校验,比在检索环节调参挽救划算得多。错误的成本在产生那一刻就定了,后面做的所有事都是在还债。
评测与最佳实践
海关每年做一次年度考核:抽 1000 本护照,逐字核对查验员的抄录结果,算出错误率、合格率,再决定明年要不要换设备。做 RAG 的 OCR 评测也是同一套逻辑——不抽样、不对照,就永远不知道自己的管线真实水平。
一套务实的评测流程分四步:一是采样,从真实业务文档里随机抽 100~500 页,覆盖合同、报表、论文等不同版面类型;二是标注,人工抄录标准文本(Ground Truth);三是跑管线,计算 CER 和字段级准确率;四是检索端回归,把 OCR 文本接入 RAG,看召回率有没有变化。只盯 CER 不够,因为 CER 反映“字对不对”,检索端指标才反映“用起来好不好”。
字段级指标可以算精确率和召回率。比如“公司名称”这类关键字段,识别对了才算正例:
1. 真正例:$TP$ 是标准答案中有、模型也识别出来的字段数。
2. 精确率:$P = \frac{TP}{TP+FP}$ 表示识别结果里有多少是对的,分母含误报 $FP$。
3. 召回率:$R = \frac{TP}{TP+FN}$ 表示该找出的字段找回了多少,分母含漏报 $FN$。
4. 调和平均:$F_1 = \frac{2PR}{P+R}$ 综合两者,避免靠“只报一个头部字段”刷分。
工程最佳实践清单:保留原始扫描件图片;文本与图片双轨存储,文本向量入库、图片供前端回显;OCR 输出按版面结构组织成 Markdown;对低置信度文本块打标不进库;切分时优先按段落、标题等语义边界切,避免切碎表格和编号列表。年度考核不只看“认对了多少字”,更看“帮王国解决了多少实际问题”——评测体系建好之后,每次升级引擎、调参数都能用数据说话,这才是“第一道关”该有的底气。
AI 应用场景
企业合同与发票知识库
阶段:文档加载与解析
解决的问题:法务和财务部门积累的纸质合同、盖章扫描件无法直接进 RAG。传统做法是人工录入关键字段,几十万份文档需要数月工时且易漏易错。用 OCR + 版面分析 + 字段级校验后,扫描件自动转成结构化文本,低置信度字段转人工复核,文本进向量库的同时保留原图地址,法务提问“2024 年与 A 公司签订的付款条款”即可直接命中原文。
具体案例:某制造企业将 20 万份历史采购合同扫描件用 PaddleOCR 批量识别,合同编号、金额等数字字段单独校验,字符错误率从初版 8% 降到 2% 以下。合同问答机器人上线后,法务检索单份合同的时间从 15 分钟缩至 10 秒。
扫描版论文库与学术问答
阶段:文档加载与解析
解决的问题:大量历史论文只有扫描版,无法全文检索和引用定位。OCR + 版面分析识别标题、作者、摘要、正文、公式和参考文献区域,按阅读顺序输出 Markdown,再切块入向量库。研究者提问“哪篇论文提出了某某注意力机制”,系统能定位到具体段落甚至公式。
具体案例:某高校图书馆将 5 万篇扫描版论文数字化,公式转 LaTeX 后支持跨论文的公式相似检索,教师查证“某公式的原始出处”平均耗时从 1 小时降到 1 分钟。
财务票据 OCR 与智能审单
阶段:文档加载与解析(含人工复核闭环)
解决的问题:增值税发票、报销单种类繁杂、表格结构多变,纯模板匹配无法覆盖。OCR 先识别整体版面,表格结构还原模块输出“发票号、金额、税额”等字段,再配合置信度阈值把低分单据自动分流到人工核验,形成“机器识别 + 人工兜底”的闭环。
具体案例:某互联网公司财务共享中心每月处理 3 万张票据,OCR 管线将单据录入人员从 12 人缩减到 4 人,异常票据识别率(错票、重复报销)提升了 40%。
Python 演示
# -*- coding: utf-8 -*-"""RAG 文档 OCR 演示: 扫描件文本提取、切块与字符错误率评测""" GROUND_TRUTH = ( "合同编号:SD-2024-088\n" "甲方:云帆科技有限公司\n" "乙方:星辰数据服务有限公司\n" "签订日期:2024年3月18日") def corrupt(text): """模拟 OCR 在数字与专名上的典型错误""" return text.replace("云帆科技", "云凡科技").replace("星辰", "星晨") def edit_distance(a, b): """计算两个字符串的编辑距离 (Levenshtein)""" m, n = len(a), len(b) dp = [[0] * (n + 1) for _ in range(m + 1)] for i in range(m + 1): dp[i][0] = i for j in range(n + 1): dp[0][j] = j for i in range(1, m + 1): for j in range(1, n + 1): if a[i - 1] == b[j - 1]: dp[i][j] = dp[i - 1][j - 1] else: dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + 1) return dp[m][n] class OcrDocument: def __init__(self, name, pages, noisy=False): self.name = name self.pages = pages self.noisy = noisy self.text = "" self.chunks = [] def run_ocr(self, engine="paddle"): """优先调用真实引擎, 缺依赖或图片时回退到模拟文本""" try: if engine == "paddle": from paddleocr import PaddleOCR ocr = PaddleOCR(use_angle_cls=True, lang="ch") result = ocr.ocr(self.pages[0], cls=True) lines = [line[1][0] for res in result if res for line in res] self.text = "\n".join(lines) else: import pytesseract self.text = pytesseract.image_to_string( self.pages[0], lang="chi_sim") except Exception: base = GROUND_TRUTH self.text = corrupt(base) if self.noisy else base return self.text def split_chunks(self, size=24, overlap=6): """按字符滑动窗口切块, 模拟 RAG 入库前的文本分块""" chars = list(self.text) self.chunks = [] i = 0 while i < len(chars): self.chunks.append("".join(chars[i:i + size])) i += size - overlap return self.chunks def cer(self, ground_truth): """字符错误率: 编辑距离 / 标准文本总字数""" n = max(1, len(ground_truth)) return edit_distance(ground_truth, self.text) / n def main(): doc = OcrDocument("采购合同扫描件.pdf", ["page_1.png"], noisy=True) print("提取文本:") print(doc.run_ocr()) chunks = doc.split_chunks() first = chunks[0] if len(first) > 30: first = first[:30] + "..." print("\n切块数:", len(chunks)) print("首块:", first) print("字符错误率 CER: {:.2%}".format(doc.cer(GROUND_TRUTH))) if __name__ == "__main__": main()
doc = OcrDocument("采购合同扫描件.pdf", ["page_1.png"], noisy=True)创建文档对象,noisy=True 模拟真实环境中 OCR 会犯的专名错误。from paddleocr import PaddleOCR尝试加载真实 OCR 引擎,未安装时自动降级。lines = [line[1][0] for res in result if res for line in res]把引擎返回的坐标、置信度、文本三元组中第 3 项文本提取出来。base = GROUND_TRUTH; self.text = corrupt(base) if self.noisy else base没有引擎时用预设合同文本兜底,并注入“云帆→云凡”这类典型错字。def edit_distance(a, b)实现 Levenshtein 编辑距离,dp 表逐格填充分子串代价。if a[i - 1] == b[j - 1]: dp[i][j] = dp[i - 1][j - 1]字符相同则继承左上角代价,不加操作数。dp[i][j] = min(...)删除、插入、替换三种操作中取最小代价路径。self.cer = edit_distance(ground_truth, self.text) / nCER 等于总编辑操作数除以标准文本字数,数值越低越好。chunks = doc.split_chunks()用滑动窗口把整篇文本切成入库块,overlap 保证跨块语义不丢失。if __name__ == "__main__": main()保证脚本既可被 import 作为模块,也支持直接运行跑完整演示。
常见误区
误区以为 OCR 就是拿一张图调一下接口,返回的就是干净文本。图片模糊、倾斜、有印章遮挡时,只要调高 API 额度就能解决。
正解真实管线远不止一个接口:图像预处理、版面分析、表格结构还原、后处理纠错缺一不可。海关查验员再专业,面对一张淋雨揉皱的护照也得先清整再读。OCR 引擎只是“眼睛”,预处理和版面分析是“台灯和放大镜”,没有它们,接口输出的就是带错字的乱序文本。
为何常见:市面上的 OCR Demo 都用清晰扫描件展示,掩盖了脏图、复杂版面这些真正的工程痛点,让新手误以为识别是开箱即用的。
误区反正 OCR 就是读文字,免费的老牌开源工具 Tesseract 足够用了,花钱或引入其他框架没必要。
正解Tesseract 的设计年代早,对英文印刷体表现尚可,但中文长文、竖排、表格、复杂版面下错误率明显偏高。做中文 RAG 知识库,PaddleOCR 这类中文化化且自带版面分析的工具通常效果更好。选型要看“语种 × 版面 × 数据敏感度”,免费不等于适合,就像放大镜免费,但海关不会用它读护照机读码。
为何常见:开源、免费、名气大这三个标签叠加,容易让人跳过实测对比直接拍板,尤其是入门阶段接触的第一个工具。
误区OCR 准确率都 99% 了,1000 个字才错 10 个,直接进向量库没问题。
正解平均准确率掩盖了两个致命事实:错误高度集中在数字、专名、生僻字这些检索关键实体上;且长文档错误会累积。一份 50 页合同可能有好几个关键字段被抄错。向量检索对实体名的偏移非常敏感——“王小明”变成“王小朋”,相似度会急剧下降,该命中的 chunk 直接消失。2%~5% 的 CER 是入库安全线,不是“差不多得了”。
为何常见:平均指标给人的心理安全感太强,而 Demo 数据又不会拿“合同编号中 0 和 O 混淆”这种坑来吓唬人。
误区OCR 出文本后直接 `text[:512]` 一路切下去,反正大模型切块不都这么干吗?
正解切分前必须先做版面分析:还原阅读顺序(双栏论文不能左右乱跳)、剔除页眉页脚、把表格转成 Markdown。否则切出来的块可能是“正文半句 + 页脚电话”,检索时牛头不对马嘴。这和海关查验一样,得先把护照上哪些是正文、哪些是印章分清楚,再逐栏抄录。
为何常见:早期 RAG 教程都用干净的电子文本演示切分,让切块看起来是个纯机械操作,忽略了扫描件特有的版面脏数据问题。
面试题
Q1. 在 RAG 文档处理管线中,OCR 属于哪个阶段?
- A.文档加载与解析← 正确答案
- B.向量嵌入阶段
- C.检索重排阶段
- D.答案生成阶段
答案:A。OCR 把扫描件图片转为文本,发生在文档解析环节,是向量化之前的必经之路。好比海关查验发生在入境第一道闸口,而不是在游客逛完王国之后。B、C、D 都是文本入库之后的下游阶段。
Q2. 下列哪种文档必须经过 OCR 才能进入 RAG 向量库?
- A.原生电子版 PDF
- B.图片扫描件 PDF← 正确答案
- C.Word 文档文件
- D.HTML 网页文件
答案:B。图片扫描件 PDF 只有像素没有文本层,必须 OCR 提取文字。原生电子 PDF、Word、HTML 本身带有文本信息,可直接解析。就像电子护照一刷就过,照片护照必须由查验员人工读一遍。
Q3. 扫描文档歪了 5 度,最应该做哪种预处理?
- A.执行图像降噪
- B.执行倾斜矫正← 正确答案
- C.执行图像二值化
- D.超分放大图片
答案:B。倾斜会让字符的垂直笔画错位,干扰字符切分,必须先用霍夫变换等方法算出角度并旋转扶正。降噪针对噪声、二值化针对灰度背景、超分针对分辨率低,都不解决“歪”的问题,就像把护照擦干净也改变不了照片贴歪的事实。
Q4. 版面分析的核心目的是什么?
- A.加快识别速度
- B.压缩存储空间
- C.定位区域与顺序← 正确答案
- D.提升图像清晰度
答案:C。版面分析解决“哪块是标题、哪块是正文、哪块是表格”以及阅读顺序的问题。它不加速也不压缩,更不涉及图像清晰度。类比海关查验要先分清护照上的照片区、姓名区和签章区,才能按正确格式抄录。
Q5. 下列哪些内容在 OCR 中更容易出错?
- A.长段落中文
- B.编号与数字← 正确答案
- C.生僻专有名词← 正确答案
- D.粗体大字号
答案:BC。数字(0/O、1/l、8/B 形近字符)和生僻专名(人名、公司名、型号)信息密度高且缺乏上下文纠错,是 OCR 重灾区。长段落中文有上下文冗余,粗体大字对比度高,反而不容易错。边境官最怕的永远是护照号和姓名这类“错一个字母就查无此人”的字段。
Q6. 字符错误率 CER 的定义是什么?
- A.编辑距离除以总字数← 正确答案
- B.识别出的字符总数
- C.识别错误的页面数
- D.引擎输出的置信度
答案:A。CER = (替换数 S + 删除数 D + 插入数 I) / 标准文本总字数 N,本质是归一化的编辑距离。它衡量“抄错率”而非字符总量、错误页数或置信度。就像海关考核看的是抄录错误占比,而不是查验员一共抄了多少字。
Q7. 下列属于 OCR 在 RAG 场景下的工程最佳实践的有哪些?
- A.保留原始扫描图片← 正确答案
- B.只存纯文本入库
- C.输出结构化文档← 正确答案
- D.低置信度人工复核← 正确答案
答案:ACD。最佳实践要求“图片文本双轨存储”(保留原图供回显和人工核对)、输出带版面结构的 Markdown、对低置信度字段打标并转人工复核。只存纯文本会丢失原始证据,检索结果无法追溯。这与海关保留护照原件存档、电子档案两套并行的逻辑一致。
Q8. OCR 把合同编号“088“识别成”0B8”,对检索影响通常很大,主要原因是什么?
- A.专名错会偏移语义向量← 正确答案
- B.数字不参与向量化
- C.数字会增大文档体积
- D.数字影响计算速度
答案:A。合同编号这类数字专名在语料中低频出现,识别错一个字符就会让向量显著偏移,且缺乏上下文可以纠错,该 chunk 的相似度排名会大幅下降。数字完全参与向量化,也不影响体积和速度。就像护照号抄错一位,档案系统就再也查不到这个人。
Q9. 下列哪些是常见的开源 OCR 方案?
- A.Tesseract 引擎← 正确答案
- B.PaddleOCR 引擎← 正确答案
- C.EasyOCR 引擎← 正确答案
- D.MySQL 数据库
答案:ABC。Tesseract、PaddleOCR、EasyOCR 都是开源 OCR 工具,分别适合不同语种和场景。MySQL 是关系型数据库,负责存数据,不负责识别图像。好比放大镜、智能证件阅读机是查验设备,档案柜只是存放资料的家具。
Q10. 做 RAG 时,对 OCR 文本进行切分之前,建议先做什么?
- A.先还原版面再做切分← 正确答案
- B.直接按固定字数切
- C.删除全部标点符号
- D.统一转为大写字母
答案:A。切分前应先做版面分析,还原阅读顺序并剔除页眉页脚,否则切出的块可能“正文半句 + 页脚电话”,进入向量库后检索质量极差。直接按字数切、删标点、转大写都是破坏语义的粗暴操作。就像查验员必须先把版面区块分清楚,再逐栏抄录,抄录顺序错了,档案就乱了。