OCR 在知识库中的作用:扫描件和图片文字如何进入 RAG?
码海寻道 · 大模型、智能体与 RAG 工程组件系列第 23 篇

扫描合同、发票、纸质制度、现场照片和流程图,通常没有可直接检索的文本层。OCR 的作用,就是把图像中的文字识别出来,再把识别结果接入解析、切分、向量化和检索链路。
OCR 应当被视为"带不确定性的解析器"。它可能把金额、日期、否定词、表格列或印章附近的文字识别错误,因此不能只保存最终字符串,还应保存识别框、页码、置信度、语言、引擎版本和原图对象键。
一、OCR 不是"拍照转文字"这么简单
一个可用的 OCR 流程通常还要处理:
- 图片方向和倾斜;
- 分辨率和压缩噪声;
- 多栏、表格和印章遮挡;
- 中文、英文、数字和特殊符号混排;
- 文字所在的版面位置;
- 识别置信度和人工复核。
对于 RAG,最重要的不只是识别出字符,还要知道字符原来位于哪一页、哪一块区域、哪一行表格中。
二、OCR 在 RAG 中的位置
text
图片 / 扫描 PDF
↓
预处理:旋转、裁剪、去噪
↓
OCR:文字 + 坐标 + 置信度
↓
版面恢复:标题、段落、表格
↓
文本清洗与 Chunk
↓
Embedding 与向量检索
OCR 应作为解析链路的一部分,而不是独立的"上传后手工复制"步骤。
三、OCR 输出建议统一成结构化结果
json
{
"page": 1,
"blocks": [
{
"text": "差旅费管理办法",
"type": "title",
"bbox": [120, 90, 860, 160],
"confidence": 0.98
},
{
"text": "员工出差应按规定标准报销......",
"type": "paragraph",
"bbox": [120, 210, 900, 360],
"confidence": 0.94
}
]
}
后续可以根据 type 和坐标恢复阅读顺序,并把页码、图片坐标和置信度写入 Chunk 元数据。
四、预处理为什么重要?
同一个 OCR 引擎,输入质量不同,结果可能差别很大。常见预处理包括:
- 纠正旋转和透视;
- 调整分辨率与对比度;
- 去除边框、噪点和背景;
- 将超大图片切成合理区域;
- 对表格和印章区域采用不同策略。
预处理不应无条件增强。过度锐化可能破坏小字号,压缩过度可能让数字和标点无法识别。
五、表格 OCR 不能只取一串文字
假设图片中有以下表格:
text
职级 | 城市 | 住宿标准
经理 | 北京 | 600
员工 | 北京 | 450
如果 OCR 只返回"职级城市住宿标准经理北京600员工北京450",模型很难稳定判断列关系。应尽可能输出 Markdown 表格或结构化记录:
markdown
| 职级 | 城市 | 住宿标准 |
| --- | --- | ---: |
| 经理 | 北京 | 600 |
| 员工 | 北京 | 450 |
对于财务、合同和医疗等高风险内容,表格识别后必须抽样人工核对。
六、置信度如何参与知识库流程?
可以按置信度设置策略:
text
置信度 ≥ 0.95 → 自动入库
0.80 ≤ 置信度 < 0.95 → 标记警告并抽样复核
置信度 < 0.80 → 转人工或重新识别
阈值只是示例,需要使用领域数据校准。数字、日期、金额和专有名词可以单独设置更严格的规则。
不要把 OCR 置信度等同于事实正确率。它只反映识别模型对字符的信心,不能证明原图本身清晰、内容完整或业务含义正确。
对于合同金额、身份证号、日期和条款编号等关键字段,应使用字段级规则复核,而不是只看整页平均置信度。OCR 结果进入 RAG 后,回答中最好保留页码和原图引用,方便用户回看原始证据。
七、图片文字和图片语义要区分
一张流程图可能同时包含:
- 可被 OCR 识别的文字;
- 箭头、连线和节点关系;
- 颜色和图标表达的语义。
如果只做 OCR,可能丢掉流程方向。对于重要图示,可以同时保存原图、OCR 文本和人工生成的图像说明;回答时再根据问题选择文本检索或多模态模型分析。
八、OCR 结果如何进入 Embedding?
推荐在向量化前做一次规范化:
python
def normalize_ocr_block(block: dict) -> str:
text = " ".join(block["text"].split())
return f"页面:{block['page']}\n类型:{block['type']}\n内容:{text}"
不要把所有页面 OCR 结果拼成一个超长字符串。应按照标题、段落和表格边界切分,并保留 page、bbox、ocr_engine 和 confidence 等元数据。
九、OCR 失败的排查方法
- 识别为空:检查图片是否真的包含文字层、分辨率是否过低;
- 中文乱码:检查语言包和字符集;
- 对比原图、OCR 文本和结构化字段;
- 记录 OCR 引擎、模型版本、耗时和置信度分布;
- 低质量结果不要静默发布;
- 顺序混乱:检查版面分析和坐标排序;
- 数字错误:提高图像质量并对金额、日期做规则校验;
- 表格错位:更换表格识别模式,不要只使用普通文本 OCR;
- 结果重复:检查页眉页脚和重叠区域是否被重复识别。
十、隐私与安全
身份证、合同、病历和发票都可能包含敏感信息。OCR 服务可能是本地部署或第三方 API,必须明确:
- 数据是否离开内网;
- 是否保存原图和识别结果;
- 日志是否脱敏;
- 访问权限和保留周期;
- 删除请求是否同步清理向量和缓存。
结语
OCR 的目标不是单纯把图片变成字符串,而是把图像中的文字、版面和来源转换成可验证、可切分、可检索的知识。对关键资料,还需要置信度、规则校验和人工复核共同保障质量。
下一篇将讨论 Chunk 设计:一段文本到底应该切多大,为什么重叠和语义边界同样重要。
参考资料
- Unstructured 官方文档:Partitioning
- PaddleOCR 官方文档
- Tesseract OCR 官方文档
- Hugging Face Documentation:Tokenizer
本文为"码海寻道"原创技术文章。OCR 引擎效果高度依赖语言、版式和图片质量,正式使用前请用真实样本评测。