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 结果拼成一个超长字符串。应按照标题、段落和表格边界切分,并保留 pagebboxocr_engineconfidence 等元数据。

九、OCR 失败的排查方法

  • 识别为空:检查图片是否真的包含文字层、分辨率是否过低;
  • 中文乱码:检查语言包和字符集;
  • 对比原图、OCR 文本和结构化字段;
  • 记录 OCR 引擎、模型版本、耗时和置信度分布;
  • 低质量结果不要静默发布;
  • 顺序混乱:检查版面分析和坐标排序;
  • 数字错误:提高图像质量并对金额、日期做规则校验;
  • 表格错位:更换表格识别模式,不要只使用普通文本 OCR;
  • 结果重复:检查页眉页脚和重叠区域是否被重复识别。

十、隐私与安全

身份证、合同、病历和发票都可能包含敏感信息。OCR 服务可能是本地部署或第三方 API,必须明确:

  • 数据是否离开内网;
  • 是否保存原图和识别结果;
  • 日志是否脱敏;
  • 访问权限和保留周期;
  • 删除请求是否同步清理向量和缓存。

结语

OCR 的目标不是单纯把图片变成字符串,而是把图像中的文字、版面和来源转换成可验证、可切分、可检索的知识。对关键资料,还需要置信度、规则校验和人工复核共同保障质量。

下一篇将讨论 Chunk 设计:一段文本到底应该切多大,为什么重叠和语义边界同样重要。

参考资料

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

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

相关推荐
学术 学术 Fun5 小时前
612 次图表重建实验告诉我们的:O612 次图表重建实验告诉我们的:OCR、图形与连接线CR、图形与连接线
机器学习·计算机视觉·ocr·图表
浩风祭月6 小时前
GPT-6 Astra API怎么接?Responses API迁移、异步工具调用与兼容项清单
人工智能·chatgpt·大模型·openai api·gpt-6 astra
bdy_y96 小时前
推理引擎测试指南:像调校赛车一样测试AI引擎
人工智能·大模型·性能测试
CV山月6 小时前
大模型强化学习对齐:从 RLHF 框架到 PPO 算法原理
人工智能·python·大模型·强化学习·多模态·研究生
梦想不只是梦与想9 小时前
大模型系列(三):提示工程、RAG 与 Agent
大模型·agent·rag
python零基础入门小白9 小时前
LangGraph智能体实战:如何用Langfuse构建AI运行时全链路可观测系统?
人工智能·学习·ai·chatgpt·程序员·大模型·智能体
console.log('npc')9 小时前
2026 实测:Grok 4.5 与 Grok 4.6 怎么选?前端开发、教程写作、Figma 还原选型指南
前端·大模型·ai编程·figma·grok
ShallWeL10 小时前
RAG Embedding 模型替换与索引回归
人工智能·embedding·知识库·工作流·rag
正在走向自律12 小时前
FastGPT高并发登录故障根治方案:50人并发报错、PostgreSQL、MongoDB数据库深度优化手册
数据库·mongodb·postgresql