RAG 文档入库如何减少脏数据:OCR、文本抽取与摘要的分层处理
RAG 文档入库如何减少脏数据,真正困难的通常不是完成一次 API 调用,而是让结果可以校验、失败可以定位、后续能够回到原始证据。本文围绕“如何设计 OCR、PDF 文本抽取和摘要分层的 RAG 文档入库流程”给出一套可以直接落到任务状态和数据契约上的实现方式。
RAG 文档入库如何减少脏数据,真正困难的通常不是完成一次 API 调用,而是让结果可以校验、失败可以定位、后续能够回到原始证据。本文围绕“如何设计 OCR、PDF 文本抽取和摘要分层的 RAG 文档入库流程”给出一套可以直接落到任务状态和数据契约上的实现方式。
问题与结果
将文件原件、抽取文本、切片、摘要和索引元数据分层,失败文档不会混入可检索语料。
最终交付不是一段不可追溯的模型回答,而是一组带来源、版本、状态和失败记录的数据。这样既方便接入后续系统,也能在接口、页面或模型输出变化时定位问题。
适用场景
- 扫描件和 PDF 知识库入库
- 合同与报告的可检索归档
- 企业文档问答前的数据治理
实现前先确定边界
- 先判断文件类型和可读性,再选择 OCR 或 PDF 文本抽取
- 摘要只从已验收文本生成
- 抽取为空、乱码或页数异常时停止索引
可验证工作流

API 编排与职责
| 步骤 | 接口 | 请求方式 | 用途 |
|---|---|---|---|
| 图片识别 | 通用图片文件流 OCR 到文本 | POST | 处理图片、扫描件、截图中的文字 |
| PDF 文本抽取 | 通用 PDF 文件流 OCR 到文本 | POST | 把 PDF 转成可检索文本 |
| PDF 摘要 | PDF 全文多语言 AI 摘要 | POST | 生成文档摘要,作为检索元数据 |
最小可运行实现
上传 PDF 并抽取文本:
curl -X POST "https://api.gugudata.com/imagerecognition/pdf2text?appkey=YOUR_APPKEY" \
-F "file=@./report.pdf"
对同一份 PDF 生成摘要:
curl -X POST "https://api.gugudata.com/ai/summarize?appkey=YOUR_APPKEY&lang=zh-cn&streaming=false" \
-F "file=@./report.pdf"
Python 侧可以把转换结果交给入库任务:
import requests
APPKEY = "YOUR_APPKEY"
def pdf_to_text(path: str) -> str:
"""Convert a PDF file to text before indexing."""
with open(path, "rb") as file_obj:
response = requests.post(
"https://api.gugudata.com/imagerecognition/pdf2text",
params={"appkey": APPKEY},
files={"file": file_obj},
timeout=120,
)
response.raise_for_status()
payload = response.json()
return payload["Data"]
入库设计
文档入库时建议保存这些字段:
| 字段 | 说明 |
|---|---|
| document_id | 自己系统里的文档 ID |
| source_file | 原始文件名或业务来源 |
| extracted_text | OCR 或 PDF 转文本结果 |
| summary | 摘要接口返回的文档摘要 |
| chunk_id | 分段后的文本块 ID |
| extracted_at | 转换时间,便于刷新和审计 |
失败分类与降级
图片或 PDF 转换失败时,Agent 不应该直接生成答案。它应该把文档标记为“转换失败”,保留失败原因,并允许人工重新上传或换用更清晰的文件。对于大文件,可以先做文件大小和格式检查,再调用接口,减少无效请求。
工程化注意事项
- OCR 结果要保留原始页码或文件来源,方便定位答案出处。
- 分段时不要只按固定字数切分,要尽量保留标题、段落和表格上下文。
- 入库前去掉明显页眉、页脚和重复水印,减少检索噪声。
- 对敏感文档先做权限控制,再开放给问答系统。
数据契约与留痕
建议至少保存以下字段;真实项目可以继续拆分,但不要删除来源、版本和状态信息。
| 字段 | 作用 |
|---|---|
document_id |
稳定业务标识,用于关联记录并避免名称冲突 |
file_hash |
内容哈希,用于完整性校验、版本识别和去重 |
extract_method |
业务数据字段,保存时记录来源、口径和缺失状态 |
page_count |
业务数据字段,保存时记录来源、口径和缺失状态 |
text_version |
规则、输入或产物版本,变更时保留旧版本 |
summary |
派生结果,必须关联输入版本与生成时间 |
index_status |
显式状态或结果,禁止用空值代替失败 |
所有派生结果都应带生成时间和输入版本。发生重试时新增尝试记录,不要覆盖最后一次失败,以免排查时只剩“最终成功”而看不到中间问题。
验收清单
- 同一文件重复上传不会产生重复索引
- 每个切片可回溯到页码或原文件
- 抽取失败与摘要失败分开记录
能力边界
公开 Demo 只能证明响应形状;OCR 准确率、文件上限、并发和配额需要按实际账号重新验证。
示例中的 YOUR_APPKEY 仅为占位符。真实密钥只能放在服务端环境变量或密钥管理系统中,不应进入前端、文章、日志或版本库。