为什么你的 RAG 管道会在客户上传的数据上失效(以及如何修复)
格式错误的 PDF、编码问题、PII 污染和重复内容会静默降低 RAG 检索质量。以下是如何在向量数据库上游构建数据质量管道的方法。
RAG 检索上游的数据质量问题是这样的:你的管道是在干净、格式规范的文档上构建和测试的——而你的客户上传的是其他所有东西。格式错误的 PDF、编码错误、含有 PII 的文本、重复内容和格式不一致会静默降低检索质量,而不会抛出错误 。RAG 系统看起来在工作;只是返回了更差的答案,引用了被污染或冗余的来源,却没有任何迹象表明有什么问题。
客户数据破坏 RAG 的五种方式
1. 格式错误的 PDF
并非所有 PDF 都是平等的。常见的失效模式:
- 零字节或截断文件:在上传或传输过程中损坏的 PDF。解析器静默失败或返回空的提取内容。
- 受密码保护的 PDF:需要解密才能解析的文件。没有预先筛查,这些文件在没有提供信息性错误的情况下就会失败。
- 内容流损坏的 PDF:看起来有效但包含格式错误内部结构的文件。解析器可能提取部分内容,产生出现在检索中但无法回答任何真实问题的片段。
- 仅有图像内容且没有 OCR 层的 PDF:在传统扫描档案中很常见。没有 OCR,就不会提取文本——文档以零长度或近零长度的块进入向量 存储,能被检索到但不提供任何信息。
一个没有预先筛查就摄取 50,000 份客户文档的 RAG 系统,可能有 5–15% 的文档处于损坏状态。这些失败都不会以系统错误的形式出现;它们以降低的检索质量出现。
2. 编码问题
企业文档档案在多年的系统迁移过程中积累了编码不一致性。常见问题:
- 单批次中的混合编码:UTF-8、Windows-1252 和 ISO-8859-1 文件在同一次上传中共存。在 UTF-8 文本上训练的嵌入模型对非 UTF-8 输入产生降级的嵌入。
- 乱码:错误编码的字符显示为乱码文本(
’替代',é替代é)。这些会破坏文档的语义内容,导致嵌入模型产生无法准确代表文档含义的嵌入。 - 空字节和不可打印字符:传统数据库导出或某些文档转换工具引入空字节和控制字符。这些以不可预测的方式破坏文本分块逻辑。
编 码问题特别有害,因为它们看起来像内容。一个到处都是 é 的文档会被嵌入、分块和检索——但嵌入与使用正确字符的查询不会对齐。
3. 重复内容
客户文档档案包含的重复内容远超大多数从业者的预期。来源包括:
- 同一文档归档在多个目录位置
- 同一合同的多个版本,有细微的修订差异
- 转发的电子邮件,嵌入了完整的线程历史,显示为独立文档
- 在数百份文档中逐字出现的样板部分(标准条款和条件、免责声明)
在 RAG 系统中,重复表现为检索从多个来源返回相同内容,为基于该内容的响应人为地提高了置信度评分。主要基于样板文字训练的系统会用样板文字来响应。拥有十份同一过时政策文档副本的系统会自信地反复检索那份过时的政策。
4. PII 污染
客户文档常规性地包含 PII:支持工单中的客户姓名和联系信息、临床记录中的患者标识符、HR 文档中的员 工社会安全号码、账单记录中的金融账户号码。当这些数据进入向量存储时,它们变得可检索:
- 关于客户投诉的查询可能检索到包含特定客户联系方式的文档
- 关于员工绩效的查询可能检索到包含该员工社会安全号码的文档
- 关于账单历史的查询可能检索到包含支付卡号码的文档
这不是假设性风险。这是将未筛查的客户数据摄取到可被不应访问该 PII 的用户访问的检索系统中的直接后果。对于受 GDPR 保护的数据,这可能构成数据泄露。对于受 HIPAA 保护的数据,这是具有直接监管后果的违规行为。
5. 格式不一致
客户上传跨越多个文档世代和系统来源。一个"文档档案"可能包含:
- 文本密度差异很大的 PDF(200 词的单页文档和 50,000 词的技术手册)
- 需要不同分块策略的混合文档类型(结构化表单 vs. 叙事文本)
- 具有非标准章节结构的文档,导致分块在语义错误的位置进行拆分
- 表格在提取为线性化文本时失去赋予其意义的结构关系
格式不一致不会阻止摄取——它会降低检索精度。来自提取效果差的表格的块可能以语义表示较弱 的方式嵌入。来自在错误边界拆分的文档的块可能在单一嵌入中结合不相关的概念。
为什么"只是添加错误处理"在规模上会失败
对这些问题的直觉反应是在摄取管道中添加错误处理:捕获解析失败、跳过零长度文档、记录编码错误。这对于明显的失败是有效的——管道停止大声报错。它并不能修复静默失败。
编码乱码不会抛出错误。它产生系统成功处理的字符串。近重复文档不会抛出错误。它们正常嵌入、分块和检索。文档文本中的 PII 不会抛出错误。它与周围内容一起嵌入并变得可检索。
错误处理捕获以异常形式出现的失败。大多数文档质量问题以管道无投诉地处理的有效但降级的输入形式出现。在规模上——10,000 份文档、100,000 份文档——这些静默降级的累积效应是显著的,且事后难以诊断。
正确的解决方案是摄取上游的质量门控,而不是摄取管道内部的错误处理。
解决方案:RAG 摄取前的数 据质量管道
解决方案是在文档进入向量数据库之前运行的四节点质量层。
异常检测器:捕获损坏文件
异常检测器节点筛查传入文档的结构完整性问题:
- 文件大小异常(零字节文件、太小无法包含有效内容的文件)
- PDF 结构验证(内容流完整性、页数一致性)
- 受密码保护文件检测
- 编码检测和非 UTF-8 文件标记
- 空字节和不可打印字符检测
异常检测失败的文档被路由到隔离队列,而不是继续进行解析。隔离日志记录每份文档的具体失败原因,实现有针对性的纠正。
PII 脱敏器:防止 PII 进入向量存储
PII 脱敏器节点在解析后、分块前运行。它检测并移除:
- 电子邮件地址、电话号码、社会安全号码
- 街道地址和地理标识符
- 医疗记录 ID 和患者标识符
- 金融账户号码和卡号
PII 被标记的 token 替换([EMAIL]、[PHONE]、[MEDICAL_ID]),在移除敏感数据的同时保留文档的语义结构。结果是一份准确代表其内容和上下文的文档——而不会将可检索的 PII 嵌入向量存储。
为满足 GDPR 和 HIPAA 合规,每次脱敏都会被记录:检测到哪些实体类型、应用了哪种脱敏方法以及每次检测的置信度评分。
质量评分器:标记低置信度提取
质量评分器根据可配置的质量标准评估每份解析的文档:
- OCR 置信度(对于扫描文档)
- 提取完整性(成功解析页面的百分比)
- 内容密度(每页最低词数,低于此值的页面可能是解析失败)
- 编码有效性(乱码指标和替换字符的存在)
评分高于接受阈值的文档进入分块。低于阈值的文档保留在审核队列中。这确保只有经过验证提取质量的文档才向向量存储贡献嵌入。
实际上,第一次对客户档案运行质量评分器通常会发现 8–20% 的文档存在质量问题,这些问题会静默降低检索质量。
去重器:防止检索冗余块
去重器在分块前移除近重复内容:
- 精确重复(相同内容,不同文件路径)被减少为一个代表性文档
- 近似重复(相似度高于可配置阈值,默认 0.95)被减少为一个代表性文档
- 样板检测标记在文档中高频出现的内容(标准条款、免责声明、页眉)以供选择性从块集中排除
分块前的去重意味着向量存储包含不同的内容。检索返回多样化、非冗余的结果。置信度评分不会因同一段落的十份相同副本的存在而被人为提高。
对比:RAG 摄取质量方法
| 功能 | 无管道 | 定制脚本 | Ertas 管道 |
|---|---|---|---|
| 损坏文件检测 | 无 | 部分(仅错误) | 全面 |
| PII 保护 | 无 | 部分(基于正则) | 全面(多类型) |
| 质量评分 | 无 | 无 | 内置,每文档 |
| 去重 | 无 | 仅精确 | 精确 + 近似重复 |
| 审计追踪 | 无 | 手动记录 | 内置,可导出 |
定制脚本列代表大多数团队第一次遇到这些问题时构建的内容:一个捕获解析错误的脚本,也许是一个用于电子邮件的正则表达式,手动记录。这处理了明显的情况。Ertas 管道处理完整的范围——包括定制脚本遗漏的静默失败。
常见问题
如何在文档进入 RAG 之前检测格式错误的文档?
在文件导入后将异常检测器节点部署为第一个处理步骤。将其配置为检查:零字节文件、PDF 结构完整性、密码保护和编码异常。节点将失败的文档路由到隔离队列而非解析器,因此它们永远不会产生进入下游质量管道的格式错误提取。隔离日志列出每份失败文档及其具体失败原因,为你提供可操作的纠正信息。
我可以为 RAG 摄取设置质量阈值吗?
可以。质量评分器节点允许你为每个质量维度配置接受阈值:OCR 置信度(对于扫描文档)、提取完整性、内容密度和编码有效性。文档的总体评分是这些维度的加权平均值;你可以根据哪些质量因素对你的用例最重要来调整权重。低于总体阈值的文档保留在审核队列中。阈值可以按管道运行进行调整——你可能在初始摄取通过时使用较低的阈值,并在生产时收紧它。
这与现有的向量数据库配合使用吗?
可以。质量管道以你选择的输出格式生成干净、去重、PII 脱敏的文档——JSONL、RAG 就绪分块格式或纯文本。无论你使用哪个向量存储(Pinecone、Weaviate、Chroma、Qdrant、pgvector 或其他),这些输出都会馈入你现有的向量数据库摄取工作流。Data Suite 处理数据准备层;你现有的向量数据库和检索栈处理其余部分。质量管道位于你的文档来源和摄取管道之间,而不是在其内部。
Ship AI that runs on your users' devices.
Free plan with 30 credits/mo, no card required. Paid plans from $10/mo USD.