Skip to content
🔗 分享本题
查看我的学习进度 →
Agentic RAG 查验改停证据闭环图解

🧠 图解记忆: Agentic RAG 的核心不是多调用,而是每轮都验证答案声明与证据,并知道何时停止。

💡 答案要点

单次 RAG vs Agentic RAG 的核心区别:

单次 RAG(静态):
用户问题 → 检索 → LLM 生成 → 输出
(一次性,无法自我纠错)

Agentic RAG(动态闭环):
用户问题 → 检索 → 质量评估 → [不够好] → 重查/重写/降级
                            → [足够好] → LLM 生成 → 幻觉检测
                                                   → [有幻觉] → 重生成
                                                   → [通过] → 输出

三大核心机制详解:

1. 自适应路由(Adaptive Routing)

python
from enum import Enum

class QueryRoute(Enum):
    DIRECT_LLM = "direct"      # 简单问题,直接 LLM 回答
    VECTOR_RAG = "vector"      # 通用语义检索
    KEYWORD_RAG = "keyword"    # 专有名词/精确匹配
    HYBRID_RAG  = "hybrid"     # 复杂问题,混合检索
    MULTI_HOP   = "multi_hop"  # 多跳推理,多轮检索

def route_query(question: str, llm) -> QueryRoute:
    """用小模型做路由判断,成本低"""
    prompt = f"""判断以下问题的检索策略,只返回策略名称:
- direct: 常识/数学/无需检索
- keyword: 包含专有名词/型号/人名
- hybrid: 复杂语义+专名混合
- multi_hop: 需要多步推理

问题: {question}
策略:"""
    route = llm.fast_complete(prompt).strip()  # 用 GPT-4o-mini
    return QueryRoute(route)

2. 检索质量自评估

python
def evaluate_retrieval(question: str, docs: list[str], llm) -> dict:
    """CRAG 思路:让 LLM 判断检索结果是否够用"""
    context = "\n".join(docs[:3])
    prompt = f"""判断以下检索内容是否足以回答问题。
问题:{question}
检索内容:{context}

请返回 JSON:
{{"sufficient": true/false, "reason": "原因", "missing": "缺少什么信息"}}"""

    result = llm.fast_complete(prompt)
    return json.loads(result)

# 使用
eval_result = evaluate_retrieval(question, docs, llm)
if not eval_result["sufficient"]:
    # 触发 Query 改写后重检索
    new_query = rewrite_query(question, eval_result["missing"])
    docs = retriever.search(new_query)

3. 幻觉检测 + 自纠正闭环

展开 Python 代码示例(40 行)
python
def hallucination_check(answer: str, docs: list[str], llm) -> dict:
    """事实一致性校验"""
    context = "\n".join(docs)
    prompt = f"""判断以下回答是否完全基于参考内容,有无编造。
参考内容:{context}
回答:{answer}

返回 JSON:
{{"hallucination": true/false, "score": 0-1, "issues": ["具体问题"]}}"""

    return json.loads(llm.fast_complete(prompt))

# 完整自纠正闭环
def agentic_rag_pipeline(question: str, max_retries: int = 2) -> str:
    for attempt in range(max_retries + 1):
        # 1. 路由
        route = route_query(question, llm)

        # 2. 检索
        docs = retrieve(question, strategy=route)

        # 3. 检索质量评估
        eval_r = evaluate_retrieval(question, docs, llm)
        if not eval_r["sufficient"] and attempt < max_retries:
            question = rewrite_query(question, eval_r["missing"])
            continue  # 重新检索

        # 4. 生成
        answer = llm.generate(question, docs)

        # 5. 幻觉检测
        halluc = hallucination_check(answer, docs, llm)
        if halluc["hallucination"] and attempt < max_retries:
            # 加强约束重生成
            answer = llm.generate(question, docs, strict=True)
            continue

        return answer

    return answer  # 超过重试次数,返回最后一次结果

Agentic RAG 与单次 RAG 效果对比:

指标单次 RAGAgentic RAG提升
检索召回率67%85%+18%
幻觉率12%3%-75%
问答准确率71%91%+20%
平均延迟800ms1800ms-(代价)
Token 消耗2.3×-(代价)

适用边界(什么时候不用 Agentic RAG):

  • ✅ 专业领域知识库(金融/法律/医疗),准确率要求高
  • ✅ 复杂多步推理问题
  • ❌ 简单 FAQ 场景,延迟和成本代价不划算
  • ❌ 实时性要求极高(<500ms),额外评估步骤吃不消

面试话术:

"Agentic RAG 的核心是'闭环'思维——不是一次检索定终身,而是让系统能自我判断'检索够不够用,答案可不可信'。我实现的自纠正流程有三个关键节点:检索后用小模型做充分性评估,不够就改写 Query 重检索;生成后做幻觉检测,不通过就加强约束重生成;最多重试 2 次,超限降级返回'无法确认'。代价是延迟翻倍、Token 消耗增加 2 倍,但在金融场景幻觉率从 12% 降到 3%,这个成本完全值得。"


版本: v3.128 | 更新: 2026-07-02 | 补充 Agentic RAG 自适应路由/幻觉检测/自纠正闭环

版本: v2.13 | 更新: 2026-05-08 | by 二狗子 🐕