摘要:传统 RAG(Retrieval-Augmented Generation)采用"检索 → 拼接 → 生成"的固定流水线,存在检索冗余、上下文噪声大、生成盲目信任低质片段等问题。本文基于 Self-RAG(Asai et al., 2023)的"自省式检索"思想,结合列表级重排序(Listwise Rerank)与自适应阈值截断,设计了一套可落地的进阶 RAG 框架 Advanced-RAG。系统在 HotpotWikiQA 子集上的 EM / F1 较基线提升 7.2% / 5.8%,并在中文法务问答场景完成端到端验证。文中给出完整 Python 实现,含向量检索、重排序、自省判别器与生成模块。
1. 引言
RAG 已成为大模型落地最核心的范式之一,但工业实践里三个痛点长期没解决:
是否该检索?——简单问题不需要外部知识,硬塞反而稀释注意力;
检索回来的片段质量参差,Top-K 拼上下文等于把噪声也喂给 LLM;
生成阶段无反馈环,错了也不会回头再查。
Self-RAG 用「反思 token」(retrieve / relevant / supported / utility)让 LLM 在生成过程中自己决定查不查、查完判一判再决定要不要继续生成,论文在多个 QA 基准上超了 ChatGPT + 固定 RAG。但原论文实现依赖专有 API + 特定微调模型,中小团队难复现。
本文贡献:
用 BGE-reranker-large 做列表级重排序替代 pointwise 打分,缓解 Top-K 截断的信息损失;
用 轻量判别 Prompt 模拟 Self-RAG 的
[Retrieve]/[Relevant]/[Utility]决策,不微调也能跑;给出 async 流水线 + 缓存 的工程实现,QPS 可线性扩。
2. 相关工作(简述)
Naive RAG:Lewis et al., RAG (2020),检索 + 拼接 + Seq2Seq。
Self-RAG:Asai et al., 2023,引入 4 类反思 token,训练时做自适应检索。
Rerank 方向:RankGPT(Sun et al., 2023)用 LLM 做 listwise 重排;BGE-reranker 用 cross-encoder 在中文场景 SOTA。
Corrective RAG (CRAG):2024 年新工作,检索低置信时触发 Web 补查,与本文自省模块互补。
3. 系统设计
3.1 整体架构
User Query │ ▼ [Self-Reflect: NeedRetrieve?] ──No──▶ Direct Generate │ Yes ▼ [Dense Retriever (BGE + FAISS)] → K=20 │ ▼ [Listwise Rerank (BGE-reranker-large)] → K'=5 │ ▼ [Self-Reflect: IsRelevant?] ──No──▶ Rewrite Query + Re-retrieve │ Yes ▼ [Generate + [IsSupported] check] │ ▼ Answer
3.2 关键设计点
① 自省判别器(零样本 Prompt 版)
不微调,用同一个 backbone LLM 做三档二分类:
反思点 | Prompt 判定 | 阈值处理 |
|---|---|---|
| 「这个问题是否需要外部知识?」 | <0.5 → 直答 |
| 「以下片段与问题相关性 1-5」 | <3 → 改写重查 |
| 「答案对用户的帮助程度 1-5」 | 生成后自评,可回滚 |
② Listwise Rerank
Pointwise reranker 对每个 (q, d) 独立打分,丢失片段间相对顺序信号。BGE-reranker 是 cross-encoder,把 (q, d) 拼一起过 transformer,列表级用 sorted(scores, descending)即可,推理成本可接受(K=20 → 5,rerank 一次 batch 搞定)。
4. 核心代码实现
4.1 依赖
# python 3.10+# pip install langchain faiss-cpu sentence-