基于 Self-RAG 与列表级重排序的进阶 RAG 系统设计与实现

基于 Self-RAG 与列表级重排序的进阶 RAG 系统设计与实现

摘要:传统 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 已成为大模型落地最核心的范式之一,但工业实践里三个痛点长期没解决:

  1. 是否该检索?——简单问题不需要外部知识,硬塞反而稀释注意力;

  2. 检索回来的片段质量参差,Top-K 拼上下文等于把噪声也喂给 LLM;

  3. 生成阶段无反馈环,错了也不会回头再查。

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 判定

阈值处理

[Retrieve]

「这个问题是否需要外部知识?」

<0.5 → 直答

[Relevant]

「以下片段与问题相关性 1-5」

<3 → 改写重查

[Utility]

「答案对用户的帮助程度 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-