1. 优化从失败类型开始
用户说“答案不对”,至少有四种不同原因:
| 现象 | 可能原因 | 优先实验 |
|---|---|---|
| 正确条款没有被找到 | 文档缺失、分块差、查询不匹配 | 检查源文档与召回 |
| 找到了但排很后 | 检索分数不够细致 | 重排、混合检索 |
| 找到一半条件 | 块太小或表格结构丢失 | 父子块、结构解析 |
| 条款完整却答错 | 上下文冲突或生成误读 | 精简证据、提示与验证 |
每个实验都保留旧方案作为基线。一次同时更换分块、向量模型和 Prompt,就很难知道谁产生了收益。
2. 分块优化:小块检索、大块理解
短块容易匹配具体内容,长块更容易保留完整条件。可以先检索子块,再把对应父段落或章节拿来供模型阅读,这叫常见的父子块思路。
例如子块包含“满一年可申请”,父段落还包含“适用人员”和“累计工作年限定义”。生成需要这些条件,不应只拿匹配最强的一句话。
同时检查重复块:多个近似版本占满 Top-K,会挤掉其他必要证据。去重不应误删不同版本之间真正变化的条款。
3. 查询改写与拆分
“报销那个怎么弄”可能依赖前一轮的“上海出差住宿”。先结合必要历史改写成独立问题,可提高检索相关性。
“年假几天、怎么申请、离职时怎么办”包含多个子问题,可以分别检索,再合并证据。
改写也可能引入用户没说的条件。应保留原问题,并检查是否把“实习生”改成“正式员工”等关键变化。
多查询会增加检索与生成开销。用评测确认覆盖率收益,而不是查询越多越好。
4. 关键词与向量检索为何互补
关键词检索擅长精确名称、编号、缩写和罕见术语,例如合同编号 A-1024。BM25 等方法结合词频、词的区分性及文档长度进行打分。
向量检索有机会处理同义表达,例如“休假额度”与“年假天数”。但可能忽略编号中的微小差别,检到语义相近却事实不符的资料。
混合检索结合二者。原始分数的尺度不同,不能未经处理就简单相加。
一种按排名融合的方法是 Reciprocal Rank Fusion:
是各检索列表, 是平滑常数;某个列表没出现该文档,通常该列表贡献为 0。它利用排名,减轻分数尺度不一致的问题,但融合策略仍要调试。
lists = [["A", "B", "C"], ["C", "A", "D"]]
scores = {}
k = 60
for ranking in lists:
for rank, doc_id in enumerate(ranking, start=1):
scores[doc_id] = scores.get(doc_id, 0.0) + 1 / (k + rank)
print(sorted(scores, key=scores.get, reverse=True))
# ['A', 'C', 'B', 'D']
A 在两份列表都靠前,因此融合后领先。这段只是排名计算,不包含真实搜索引擎。
5. Bi-encoder 与 Cross-encoder
Bi-encoder分别编码问题和文档,可以预先计算文档向量,因此适合从大量文档里快速找候选。
Cross-encoder把问题与候选文档放在一起判断相关性,能更细地比较词句关系,但通常要对每个候选单独计算,不适合无差别遍历整个大库。
常见组合是“便宜召回较多候选,再昂贵重排少数候选”。重排也可能错,特别是缺乏领域训练或对时间、否定等条件不敏感时。
6. 元数据过滤和证据预算
用户有权访问的范围、文件生效时间、部门和产品版本,应该用于过滤。过滤太严会漏掉答案,太松会引入过期或越权内容。
给生成器的内容要有预算:优先保留直接回答问题的证据、补充定义与必要例外,减少重复和无关段落。
“相关文档越多越好”不成立。更多噪声会消耗窗口、费用与注意力,还会增加冲突。
7. Graph RAG 解决什么额外问题
普通文档检索擅长找到与问题直接相关的片段。若问题涉及多跳关系,例如“某供应商关联的子公司,分别与哪些项目存在合同”,关系图可能更适合导航。
图中:
- 实体是节点,例如公司、项目、合同。
- 关系是边,例如“控股”“签订”“负责”。
- 节点和边应保留原文出处、时间与置信信息。
Graph RAG 是一类结合图与检索生成的方法,不是一个唯一固定算法。有的重视实体关系遍历,有的还建立社区与摘要,用于更全局的问题。
例如“员工—所属部门—部门制度”可以按关系找适用条款;但图谱若把“甲公司不控股乙公司”抽成“控股”,后面推理再精密也建立在错误关系上。
进一步查看 Microsoft GraphRAG 项目说明可了解其中一种实现。它不意味着所有知识库都应采用相同方案。
8. 图检索的成本与边界
图谱需要实体消歧、关系抽取、更新、删除、权限与来源追踪。一个公司改名,可能影响多个节点与关系。
如果问题主要是“某条政策是什么”,普通全文与向量检索可能更简单有效。只有关系或全局聚合带来可测收益,才值得引入更复杂的图流程。
知识图谱也不等于 Graph Neural Network,前者是一种知识组织方式,后者是一类学习图结构的方法。
9. 一个可执行的调优顺序
先建立带标准证据的题集,再逐步比较:
- 文档与解析修复后,正确证据是否进入可检索范围?
- 改分块后,Recall@K 是否提高?
- 加混合检索后,编号题与同义题是否都改善?
- 加重排后,证据是否更靠前,延迟增加多少?
- 精简上下文后,答案是否更忠实?
- 引入图后,多跳题是否改善,简单题是否退化?
同时记录费用和 P95 延迟。只有准确率没有运行代价,无法判断优化能否上线。
复习卡片与自测
- 检索指标与回答指标要分开。
- 混合检索结合精确词匹配与语义匹配。
- 重排在少量候选上做更细比较。
- 图适合关系问题,但抽取、维护和权限都有成本。
1. 为什么不直接把 BM25 分数和余弦分数相加?
参考答案
二者的分布和尺度不同,一项可能数值上压倒另一项;需要合理归一化或采用按排名融合等方法,再验证效果。2. 正确条款根本不在候选里,重排能救回来吗?
参考答案
不能。重排只能处理提供给它的候选,应先改善召回或文档处理。3. 图谱里每条关系为什么需要出处与日期?
参考答案
关系可能被抽错或过期,保留出处和时间才能核验、更新,并解释结论从何而来。原文定位
依据:原资料 6.5—6.6、15.1、15.4。