23.OCR在知识库中的作用扫描件和图片文字如何进入RAG

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 引擎,输入质量不同,结果可能差别很大。常见预处理包括:

  1. 纠正旋转和透视;
  2. 调整分辨率与对比度;
  3. 去除边框、噪点和背景;
  4. 将超大图片切成合理区域;
  5. 对表格和印章区域采用不同策略。

预处理不应无条件增强。过度锐化可能破坏小字号,压缩过度可能让数字和标点无法识别。

五、表格 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 设计:一段文本到底应该切多大,为什么重叠和语义边界同样重要。

参考资料

  1. Unstructured 官方文档:Partitioning
  2. PaddleOCR 官方文档
  3. Tesseract OCR 官方文档
  4. Hugging Face Documentation:Tokenizer

本文为"码海寻道"原创技术文章。OCR 引擎效果高度依赖语言、版式和图片质量,正式使用前请用真实样本评测。

相关推荐
长谷深风11110 小时前
Tool与Skill:AI能力设计的分水岭
java·人工智能·ai·大模型·aiagent
像风一样自由202010 小时前
41.用FastAPI搭建一个RAG后端需要哪些接口
人工智能·大模型·fastapi·rag·智能体
VIP_CQCRE10 小时前
把 OpenCode 接入 Ace Data Cloud:让 VS Code、Cursor、Windsurf 统一调用 AI 编程模型
vscode·大模型·ai编程·opencode·acedatacloud
爱上纯净的蓝天11 小时前
只输出选项和概率的模型:判别层的接口契约与阈值工程
人工智能·大模型·llm·模型评估·架构设计
民乐团扒谱机11 小时前
【微科普】节拍检测从入门到迁移:西方SOTA模型怎么识别Beat,中国戏曲民乐又该怎么训练?
深度学习·大模型
IT·陈寒16 小时前
Vite热更新失效?你可能漏了这个配置项
人工智能·大模型·api·创业·变现·简历优化
百无聊赖是也非也16 小时前
从被动应对到开放生态:中国模型为何崛起
人工智能·大模型
無a伟17 小时前
RAG演进路线与核心架构
agent·rag
IT·陈寒18 小时前
Java 并发这块坑真多,线程池又给我上了一课
人工智能·大模型·api·创业·变现·简历优化
梦想不只是梦与想18 小时前
LangGraph图:State、Node、Edge(一)
langchain·大模型·langgraph