# 为 RAG 整理文档：先检查源文档，再调整提示词

从已连接的知识库或公开帮助网站收集文档，在为 RAG 建立索引前，检查文本提取、版本和分块边界。

Canonical page: https://beeuni.ai/blog/zh/prepare-documents-for-rag

你的知识库助手总是引用旧政策，或漏掉表格中的部分内容。Beeuni 可以读取原始文档，找出过期副本和文本提取错误，再为搜索索引整理修正后的文本。下面用一份配送指南说明该检查什么，以及最后应导出哪些文件。

检索增强生成（RAG）会在文档中查找相关段落，交给模型作为回答问题的依据。这些段落通常称为“分块”，也就是为搜索准备的较小文本片段。Beeuni 智能体可以从已连接的知识库或公开帮助网站收集文档、提取文本，再运行脚本整理这些片段。你的应用随后使用所选工具建立索引并进行搜索。

## 从知识库所在位置收集内容

对于公开帮助网站，向智能体提供起始网址和要纳入的版块。让它访问相关链接、保存文章文本，并报告无法打开的页面。对于私有文档，连接相应服务，并授予它访问目标集合的权限。只有私有网址，并不意味着页面就能读取。

维护一份来源清单，逐项记录页面或文档的引用、标题、获取时间，以及来源提供的版本信息。代码仓库的提交记录可以标明文档快照；对于实时更新的帮助页面，可能需要另行保存副本。在准备下一次导出前，智能体可以将这份清单与上次导入的内容进行比较，找出已更改、已删除和新发现的页面。

## 从应用答错的问题入手

在原始文档中找到应当回答该问题的段落。将对应页面与提取出的文本，以及检索返回的分块进行比较。这样可以区分问题出在文本提取还是检索。如果正确段落已经传给模型，就检查答案如何使用了它。

| 你看到的情况 | 检查内容 | 调整方式 |
| --- | --- | --- |
| 一个没有单位的数值 | 表格标题和相邻单元格 | 让标题和单位与相关行保留在一起 |
| 答案依据的是旧规则 | 文档版本和生效日期 | 删除已被取代的文本，或明确设置版本筛选 |
| 句子中途被截断 | 导出文本中的分块边界 | 尽可能按章节或段落边界切分 |
| 检索结果里反复出现导航文字 | 页眉、页脚和页面菜单 | 去除重复的模板文字，但不要删掉实质性说明 |
| 没有匹配的段落 | 提取覆盖范围和检索结果 | 补回缺失文本，再重新测试索引和检索 |

## 表格标题可能改变答案

想象一份运输指南，其中有张表格，标题是“发货后交付时间（工作日）”。标准服务对应的数值为“3–5”。如果提取结果只保留“标准：3–5”，单位和起算时间就都丢失了。模型只能猜这个数字指的是天数、价格还是其他内容。

```
Example of a passage with its context preserved:
Document: Shipping guide
Section: Delivery estimates
Service: Standard
Delivery time: 3–5 business days after dispatch
Source: sample-shipping-guide.pdf, page 2
```

这段内容可以支持回答“发货后，标准配送需要多久？”。但如果没有发货日期和相关日历信息，它无法回答“我的订单能在周五前送达吗？”。评审时应同时纳入这两个问题：第一个用于检查表格是否在提取过程中保留下来，第二个用于检查应用是否能识别信息缺失。

## 每个段落应保留哪些信息？

保留稳定的文档 ID、标题、章节、可用时的页码引用，以及版本或生效日期。对于公开页面，还要保留来源网址。这些字段可以让应用显示引用，并区分措辞相似的不同版本。

没有适用于所有集合的固定分块大小。简短的常见问题解答可以完整保留；较长的操作流程可能需要拆成多个分块，每块都带上章节标题。让智能体导出一个样本，然后不打开原始来源，直接阅读这些分块。检查术语、单位和例外条件是否仍然清楚。

## 智能体也能编写评估问题吗？

它可以根据文档起草候选问题。在用这些问题评估应用之前，先核对预期答案和来源段落。纳入答案分散在多个章节的问题、涉及过时规则的问题，以及集合本身无法回答的问题。将这套评估题与用于调整系统的示例分开保存。

## 沿着检索结果追查一次失败

回到那份虚构的运输指南。假设当前指南规定，标准配送在发货后需要 3–5 个工作日，而旧版指南规定的是 2–3 天。你的应用回答“2–3 天”。保存问题、按返回顺序排列的检索段落、它们的元数据，以及答案。这样就能开始调查过时规则是如何影响回答的。

如果检索结果里只有旧版指南，检查替代版本是否已导入，以及版本筛选是否将其排除。如果两个版本都出现，检查应用如何在它们之间作出选择。如果正确段落出现了，但标题缺失，就修复文本提取或分块边界。如果完整的当前版本段落已经传给模型，而答案仍然漏掉“发货后”和“工作日”这两个信息，就检查答案生成环节。重新提取整个集合无法解决最后一种问题。

将这条追踪记录与评估案例一并保存。更改之后，比较段落和答案，而不只是看答案。模型可能已经知道相似事实，因此看似合理的答案会掩盖检索遗漏；遇到下一个涉及文档中特有规则的问题时，它仍可能答错。

## 用评估问题测试分块大小

较大的分块可以保留完整流程及其例外情况，但也会把无关文本带入提示词。较小的分块可以让事实更容易被检索，却可能把事实与其成立条件分开。重叠文本有助于处理边界问题，但也可能让多个结果位置都被几乎相同的段落占据。在对整个集合调整这些设置前，先检查返回的结果集。

对于每个评审过的问题，标记哪些段落足以支持答案。检查这些段落是否出现在应用发送给模型的结果中。也要记录无关和重复的结果。对于最终答案，分别评估事实依据、引用，以及对信息缺失的识别能力。只看一个总体分数，不容易看出具体是哪一环发生了变化。

每次导出时，都将测试问题和检索设置一并保存。测试更干净的来源文本时，先使用相同的检索配置；测试分块大小或排序方式时，固定来源版本。若同时改动两者，即使答案有所改善，也无法判断是哪项改动起了作用。

## 应该从 Beeuni 导出什么？

请导出清理后的文本、带有元数据的段落记录、来源清单，以及提取失败列表。然后将这些文件导入索引流水线。

[数据集准备指南](/blog/zh/build-ai-training-dataset-jsonl)介绍了评审记录和数据集拆分。如果你需要从应用中触发准备流程，请参阅[将 Beeuni 用作智能体后端](/blog/zh/use-beeuni-as-your-agent-backend)。
