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 引擎效果高度依赖语言、版式和图片质量,正式使用前请用真实样本评测。

相关推荐
OxYGC6 小时前
智能体项目复盘 · 智能客服篇:对话栈、Flow 与策略集成器——LLM 是怎么嵌进传统多轮对话架构的
对话系统·智能客服·rag·智能体
隔窗听雨眠10 小时前
云数仓向PostgreSQL生态延伸的技术动因与工程代价
postgresql·数据库架构·云数仓
橙臣程1 天前
RAG、SFT、RL 怎么选?基座模型越来越强,什么时候还值得微调
rag
小田学Python1 天前
DeepSeek Harness 完整上手指南:安装部署 + 必装插件 + 用一周就回不去的功能
大数据·大模型·agent·ai工具·deepseek
Peter-OK1 天前
PostgreSQL学习笔记(入门-进阶-精通说明)
笔记·学习·postgresql
aicat_cn1 天前
json-render 接入 Chat SDK:Agent 在 Slack 和 Teams 里直接回表格和按钮
ai·大模型
神奇的代码在哪里1 天前
Agent 记忆的组成部分:Anthropic The components of agent memory 文章的简要解读
大模型·claude·ai agent·上下文工程·agent记忆
神奇的代码在哪里1 天前
ERNIE-5.5-Flash-Base 开源速览:280B-A14B MoE 基座,微调与推理支持 1M 上下文
大模型·模型部署·文心大模型·moe·ernie5.5
謓泽1 天前
【插件】用写网页的方式做视频?HyperFrames 让我重新理解了“做视频“这件事!
gpt·ai·大模型·音视频·媒体·claude·视频
JJJennie7772 天前
MAI Gateway私有化部署全攻略:大模型网关接入DeepSeek?附架构图
大模型·gateway·ai网关·魔芋ai