|Agentic AI Group
智能体工程课程
2026 版
高阶10 学时更新:2026-07-26

06|高级检索增强生成(RAG)优化

从数据治理和基础检索出发,掌握混合检索、重排、上下文压缩、评估、GraphRAG、多模态与企业权限治理。

前置知识
  • 理解 Embedding、余弦相似度和基础向量检索
  • 能使用 Python 处理文本和数据文件
学习成果
  • 能设计并调优完整 RAG 链路
  • 能使用 Recall@K、MRR、NDCG 和回答质量指标定位问题
  • 能构建带权限、版本和自动更新机制的企业知识库
高级 RAG 链路
图 6-1:高级 RAG 的核心不是“多放几个文档”,而是可测量的召回、排序、上下文与生成链路。

1. 数据采集、清洗与切片

1.1 数据质量决定上限

知识库应保存原始文件、解析文本、结构信息、来源、版本、有效期、权限和处理日志。只保存向量而丢失原文与版本,会使错误无法追踪。

1.2 标准化处理流程

采集

识别所有者、来源、许可、更新频率和敏感级别。

解析

提取标题、章节、表格、图片说明和页码;保留版面结构。

清洗

去页眉页脚、重复段、乱码和失效内容,不删除有业务意义的编号。

切片

按语义和结构切分,并保留父子关系、重叠和元数据。

索引

建立关键词、向量、图或结构化索引。

验收

抽查解析质量,运行标注问题的召回评估。

1.3 切片策略比较

策略优点缺点适用
固定 Token简单、稳定破坏语义和章节无明显结构的文本
递归分隔尽量保留段落参数需调优通用文档
标题/章节可解释、可引用章节可能过长制度、教材、技术文档
句义切片语义完整计算成本高高价值问答
父子切片小块召回、大块生成存储与逻辑复杂长文档、手册

切片不是一次性选择。应根据问题粒度和证据范围做评估。例如用户问一个表格单元格,整章切片可能严重降低精确度。

1.4 Embedding 与向量数据库选型

选 Embedding 时看语言、领域、维度、上下文长度、延迟、部署方式和许可证。选向量库时看过滤、混合检索、索引更新、备份、多租户、可观测和成本。

工程建议先用小规模真实评测集比较模型,而不是只看公开排行榜。领域术语、中文缩写和表格文本会显著影响结果。

2. 混合检索与查询优化

2.1 为什么关键词与向量要结合

向量检索善于语义相近问题,关键词检索善于精确编号、专有名词、日期和代码。混合检索能降低单一路径的盲区。

2.2 Reciprocal Rank Fusion(RRF)

RRF 不要求两个检索器分数同尺度,只根据名次融合:

RRF(d) = Σ 1 / (k + rank_i(d))

其中 k 常用于减小头部名次差异。完整本地实现见 examples/06_rag_pipeline.py

from collections import defaultdict


def rrf(rankings: list[list[str]], k: int = 60) -> list[tuple[str, float]]:
    scores = defaultdict(float)
    for ranking in rankings:
        for rank, doc_id in enumerate(ranking, start=1):
            scores[doc_id] += 1.0 / (k + rank)
    return sorted(scores.items(), key=lambda x: x[1], reverse=True)

2.3 查询改写与分解

  • 补全缩写和同义词;
  • 将多意图问题拆成多个子查询;
  • 根据元数据提取时间、部门、文档类型过滤;
  • 对会话追问补全省略信息;
  • 保留原查询,避免改写偏离用户意图。

查询改写也会出错,应记录原查询、改写查询和召回差异。

3. 重排、去重与量化评估

3.1 重排

第一阶段用快速检索获取较多候选,第二阶段用 Cross-Encoder 或强模型重排少量候选。重排可提高精确度,但增加延迟和成本。

3.2 冗余过滤

相邻切片常高度重复。可按文档 ID、文本哈希、相似度和章节关系去重。保留多样证据通常比堆叠重复内容更有价值。

3.3 检索指标

  • Recall@K:相关证据是否出现在前 K;
  • MRR:第一个相关结果排名是否靠前;
  • NDCG@K:考虑多级相关性和位置折损;
  • Precision@K:前 K 中相关结果占比。

def recall_at_k(retrieved: list[str], relevant: set[str], k: int) -> float:
    if not relevant:
        return 1.0
    return len(set(retrieved[:k]) & relevant) / len(relevant)


def reciprocal_rank(retrieved: list[str], relevant: set[str]) -> float:
    for rank, doc_id in enumerate(retrieved, start=1):
        if doc_id in relevant:
            return 1.0 / rank
    return 0.0

3.4 生成指标

  • Faithfulness:答案中的事实是否被证据支持;
  • Answer Relevance:是否回答用户问题;
  • Citation Correctness:引用是否对应结论;
  • Completeness:关键要点是否遗漏;
  • Refusal Quality:无证据时是否正确拒答。

LLM-as-a-Judge 可提高评估效率,但评审模型也有偏差。重要评测应加入人工复核和规则检查。

3.5 Bad Case 归因

未找到证据 → 数据缺失 / 解析错误 / 切片错误 / 查询错误 / 检索器错误
找到但排名低 → 融合权重 / Embedding / 过滤 / 重排问题
证据正确但答案错 → Prompt / 模型 / 上下文干扰 / 输出校验问题
答案正确但无引用 → 引用生成或后处理问题

4. 企业级高级 RAG

4.1 多模态 RAG

图片、扫描件、图表和音视频不能只做 OCR。应保留图片区域、图注、表格结构和时间轴,并根据问题选择视觉模型、文本检索或结构化查询。

4.2 知识图谱 + 向量检索

向量检索回答语义相关内容,图谱擅长明确实体关系和多跳约束。组合方式包括:

  • 向量先找到实体,再查询图谱;
  • 图谱筛选候选范围,再做文本检索;
  • 图路径作为结构证据,与文本证据一起生成答案。

4.3 权限和隐私

权限过滤必须在检索阶段执行,不能先取回敏感内容再要求模型“不要泄露”。每个切片应带租户、部门、角色、保密级别和有效期标签。

4.4 自动更新数据飞轮

数据源变更 → 增量采集 → 解析与质量检查 → 索引更新 → 回归评估 → 灰度切换 → 旧索引退役

每个索引版本应可回滚。删除原始文档时,要确保关键词索引、向量索引、缓存和摘要同步删除。

5. 应用案例:制度检索系统

5.1 数据集

准备 20–50 份带版本和有效期的制度文档,构建 50 个问题,标注相关文档、相关段落和期望答案要点。

5.2 对比实验

实验检索配置目的
A仅向量 Top-5基线
BBM25 + 向量 RRF验证混合检索
CB + Reranker验证重排
DC + 查询改写验证复杂问题
ED + 权限过滤验证企业约束

记录 Recall@5、MRR、平均延迟、平均上下文 Token 和人工正确率。最终报告不能只给一个“效果更好”的结论。

5.3 工程复现:可评估的制度检索

cd repository/enterprise-agent-lab
python -m app.cli --question "设备 P-100 温度异常时依据哪一版 SOP?"
python -m app.cli --question "一个数据集中不存在的问题"
python -m unittest discover -s tests -v

阅读 app/retrieval.pydata/policies.json,确认结果包含 doc_id、版本和证据。实践时建立至少 50 条带相关文档标注的查询集,分别实现关键词、向量、RRF、重排四组实验;不能用最终答案正确率替代 Recall@K/MRR,也不能只报告平均值。

服务部署沿用 app.server/DEPLOY.md。生产改造要把索引版本与文档版本一起发布,先构建新索引、跑回归、灰度切换,再保留可回滚旧索引;ACL 必须在检索阶段过滤。验收提交数据清单、切片配置、指标表、10 个 Bad Case 归因和删除传播记录。

6. 可靠参考资料