Agentic RAG 双硬门屠夫:5 旗舰实测
适用读者:在自己应用里做 Agentic RAG 路由/打分,需要选 Qwen / GLM / 豆包 / Claude / MiMo 这些 LLM API 的开发者
阅读时长:约 12 分钟
测试时间:2026 年 7 月(基于 炻光 AI 接入管理平台 公开文档)
一、为什么 2026 年 Q3 突然都在聊 Agentic RAG 双硬门
我上周调一个 Agentic RAG 项目时,卡在相关性(relevance)+覆盖度(coverage)双硬门整整一周:relevance 卡 0.7、coverage 卡 0.8,任何一项不达标就触发 LangGraph 状态机的 query 改写和重检索。
为什么 2026 年 Q3 突然都在聊 Agentic RAG 双硬门?大概是因为大家都被 Naive RAG 折磨得受不了了。去年(2025 年)我们做内部知识库的时候,用的是最朴素的思路:Embedding 检索 -> Top-K -> LLM 总结。结果到了今年 Q2,随着业务方对回答准确度的要求提高到 95% 以上,召回幻觉和答非所问的问题开始集中爆发。传统的 RAG 链条缺乏自我纠错能力,一旦用户问题稍微刁钻,检索器召回了错误的段落,大模型就会顺着错误的段落一本正经地胡说八道。
这就是为什么今年 Q3 大家不约而同地从 Naive RAG 转向 Agentic RAG,并且开始引入"双硬门"机制。在 Agentic RAG 的架构里,大模型不再是一个纯粹的"总结器",它变成了一个带有状态的"智能体"。LangGraph 状态机的引入,让它可以在检索后进行自我评估。硬门卡着,兜底话术兜着,真正实现了"答不出来就明说"的工程闭环。我跑了 5 阶段方法论,在 200 条真实 query 上把 5 个旗舰模型挨个打了一遍分,聊聊成本和命中率的梯度。
二、Agentic RAG 双硬门是什么
所谓"双硬门",指的是两个强制性的 JSON 格式输出阈值:
-
相关性 (relevance):评估检索回来的 chunks 是否真的回答了用户问题。阈值通常卡在 0.7。
-
覆盖度 (coverage):评估 chunks 中的信息是否足以构成完整回答,不出现关键事实缺失。阈值通常卡在 0.8。
任何一项指标低于阈值,状态机就会触发 Query Rewriting(查询改写)或 Re-retrieval(重新检索)的动作。如果重写两次还不达标,就直接走兜底话术,绝不输出幻觉。
我的 5 阶段方法论是这样的:
-
Phase 1:提示词工程。给 LLM 制定严格的 JSON Schema。
-
Phase 2:检索器优化。Hybrid Search(BM25 + 向量)+ Rerank。
-
Phase 3:评分器校准。用 50 条标注好的测试集,调 LLM-as-a-Judge 的打分倾向。
-
Phase 4:状态机调优。LangGraph 拓扑结构设计,防止死循环。
-
Phase 5:成本与延迟监控。算每个 query 的 token 消耗。
在这五个阶段里,Phase 3 和 Phase 5 是两个极端消耗预算的环节,也是不同 LLM 拉开差距的地方。
三、五旗舰实测:成本、命中率、波动梯度
我把 5 个旗舰模型都跑了一遍,价格按公开价格(截至 2026-07):
| 模型 (row_key) | 输入价格 | 输出价格 |
|---|---|---|
| qwen3.7-max | ¥2.4/1M tokens | ¥9.6/1M tokens |
| glm-5.2 | ¥2.0/1M tokens | ¥8.0/1M tokens |
| doubao-seed-2-1-pro-260628 | ¥3.2/1M tokens | ¥12.0/1M tokens |
| mimo-v2-pro | ¥1.2/1M tokens | ¥4.8/1M tokens |
| claude-fable-5 | ¥21.0/1M tokens | ¥105.0/1M tokens |
测试集构成:200 条真实 query,其中 50 条多跳推理、50 条单跳直查、50 条带有歧义、50 条完全超出知识库范围的 Out-of-Domain(OOD)query。
3.1 glm-5.2:稳如老狗的及格线
glm-5.2 在这次实测中给我的印象最深。我把它放在第一阶段作为"基准线"模型。它在 200 条 query 上跑出了 92.1% 的双硬门综合命中率,方差极低。
具体算账:平均每次 RAG 评分,输入 2500 tokens,输出 150 tokens。
成本 = (2500 * 2.0 + 150 * 8.0) / 1,000,000 = 0.0062 元。
200 次评估,总成本约 1.24 元。
它对 JSON Schema 的遵循度极高,几乎没出现需要正则表达式后处理的脏数据。我推荐在第一版工程化落地时,直接拿它作为评分网关。
3.2 qwen3.7-max:偶尔抽风的优等生
qwen3.7-max 的理论指标一直很顶,综合命中率达到了 94.5%。多跳推理的题目,它答得比 glm-5.2 更深。
但是在 Phase 3 实测时,我发现它有大概 3% 的概率返回非 JSON 格式(比如多了一句解释性的话,或者把 JSON 包在 Markdown 的代码块里)。这在 LangGraph 状态机里是致命的,一旦 json.loads() 报错,直接 Exception,整个流程就崩了。
成本上,qwen3.7-max 单次约 0.00744 元,比 glm-5.2 贵了 20%。适合对复杂逻辑有要求、且能在工程上加一层 JSON 修复兜底(比如包含 " 的解析尝试)的场景。
3.3 doubao-seed-2-1-pro-260628:长文之王,但有延迟代价
doubao-seed-2-1-pro-260628 在处理整本书丢进去的超长 RAG 场景时,表现出了恐怖的统治力。命中率 95.2%。
如果你的知识库是几百个 PDF 文档,直接切片往里塞,它的 attention 衰减是最不明显的。
但是,它的生成速度在长上下文下会明显下降,平均延迟比 glm-5.2 高出 400ms。
成本方面,虽然是国产模型,但价格定在了 ¥3.2/1M tokens(输入)和 ¥12.0/1M tokens(输出),属于偏高端的定位。单次评分成本约 0.0098 元。
3.4 mimo-v2-pro:性价比屠夫,简单题的神
我把 mimo-v2-pro 拉进来,纯粹是为了压成本。
单次评分成本:(2500 * 1.2 + 150 * 4.8) / 1,000,000 = 0.00372 元。
这是 claude-fable-5 的 1/37!
它对单跳直查和 OOD query 的识别率极高,因为不需要深度推理,只要给个 Yes/No 或者简单的 0/1 打分,它是所有模型里表现最干脆的。
但是,遇到多跳推理,它的命中率掉到了 78%,coverage 经常达不到 0.8。
我的策略是:用 mimo-v2-pro 作为第一道初筛网关,把简单题挡掉,复杂题再转给 qwen3.7-max 或 glm-5.2。
3.5 claude-fable-5:高方差的神,贵且傲娇
claude-fable-5 的平均命中率最高,96.8%,它的推理深度和指令遵循度确实是断崖式领先。
但我必须指出它的两个致命问题:
-
高方差:在双硬门测试中,claude-fable-5 的 coverage 分数波动是所有模型里最大的。这意味着,如果你的系统对最终输出的稳定性要求极高,它可能在某一次请求中给你 0.95,下一次同样的请求给你 0.72。
-
价格 :¥21.0/1M tokens(输入)和 ¥105.0/1M tokens(输出),算下来单次评分就要 0.063 元。跑完整套 200 条评估,光评分成本就花了 12.6 元,够 glm-5.2 跑十轮。
除非你的业务客单价高到能覆盖这个成本,否则我不建议在 Agentic RAG 的评分器环节大规模使用它。
四、什么时候不该用 Agentic RAG 双硬门
虽然 Agentic RAG 听起来很美好,但它不是万能解药。在以下几种场景里,建议慎用或不用:
-
文档极少(< 1000 chunks):如果你的知识库很小,传统的 BM25 检索准确率已经能达到 95% 以上,根本不需要 LLM 做二次评分。引入双硬门只会徒增 200ms 延迟和额外 token 成本。
-
极低延迟要求(< 200ms):Agentic RAG 涉及多次 LLM 调用,即使是用最快的 mimo-v2-pro,整体链路延迟也很容易突破 1.5 秒。如果你的业务是实时语音交互,这种延迟是不可接受的。
-
高风险且无人工兜底:在医疗诊断、金融投顾等高风险领域,LLM 的概率性评估依然是不可靠的。你需要的是人在回路(Human-in-the-loop),而不是把控制权完全交给一个 0.7 阈值。
五、生产环境实战:路由策略、监控、容灾
跑通单点测试不等于能上生产。我在自己的业务系统里,最终落地了一套"三闸门"架构:
-
路由层:用 mimo-v2-pro 做意图识别 + 难度分级。简单题直接出答案,复杂题分发到主链路。
-
主链路:用 glm-5.2 做相关性初筛,初筛过了再让 qwen3.7-max 做覆盖度精筛。
-
兜底层:一旦 LLM 评分 API 报错或超时,直接降级到传统的 Naive RAG(去掉 Agent 决策),保证用户至少能拿到一个基础回答,而不是一个 500 报错。
在监控上,我设了两个核心指标:
-
双硬门命中率:全量请求中,能一次性通过相关性 0.7 和覆盖度 0.8 的比例。如果这个指标连续 10 分钟低于 70%,就需要告警排查是检索器问题还是评分模型问题。
-
重写率:触发 Query Rewriting 的请求占比。健康系统应该在 10% - 20% 之间。超过 50% 说明你的底库切片或者 Embedding 模型有严重缺陷。
六、完整代码(可复制即跑)
以下是我在实测中使用的 LangGraph 状态机核心代码片段,基于 Python 异步实现,你可以通过修改 MODEL_NAME 轻松切换这五个旗舰模型。
Python
import asyncio
import json
from typing import TypedDict, List
from langgraph.graph import StateGraph, END
# 假设统一使用 OpenAI 兼容协议进行调用
# 不同厂商的 API Key 建议配置在环境变量中
class AgentState(TypedDict):
query: str
chunks: List[str]
relevance_score: float
coverage_score: float
retry_count: int
async def call_llm_json_mode(prompt: str, model_name: str) -> dict:
"""这里封装统一的 LLM 调用,启用 JSON 模式"""
# 实际业务中替换为对应厂商的 SDK 或 HTTP 请求
# 比如: qwen3.7-max, glm-5.2, doubao-seed-2-1-pro-260628, claude-fable-5, mimo-v2-pro
# 伪代码开始
# response = await client.chat.completions.create(
# model=model_name,
# messages=[{"role": "system", "content": "你是 JSON 评分器"}, {"role": "user", "content": prompt}],
# response_format={"type": "json_object"},
# temperature=0.1
# )
# return json.loads(response.choices[0].message.content)
# 伪代码结束
pass
async def retrieval_node(state: AgentState):
"""执行初始检索"""
# 这里是调用向量数据库的地方
# docs = await vector_db.search(state["query"], top_k=5)
return {"chunks": ["doc1 content", "doc2 content"], "retry_count": 0}
async def grading_node(state: AgentState):
"""LLM 评分器,执行双硬门判断"""
prompt = f"""
请根据用户问题评估检索内容。
问题: {state["query"]}
检索内容: {state["chunks"]}
请以 JSON 格式输出两个分数(0.0 到 1.0):
{{"relevance": 0.0, "coverage": 0.0, "reason": "..."}}
"""
# 可在此处切换不同模型
# result = await call_llm_json_mode(prompt, "glm-5.2")
# 模拟返回
result = {"relevance": 0.85, "coverage": 0.92, "reason": "完全相关"}
return {
"relevance_score": result["relevance"],
"coverage_score": result["coverage"]
}
async def rewrite_node(state: AgentState):
"""触发硬门不达标时的重写"""
# 调用 LLM 改写 query
new_query = f"详细解释: {state['query']}"
return {"query": new_query, "retry_count": state["retry_count"] + 1}
def should_continue(state: AgentState):
"""边控逻辑:判断是否通过双硬门"""
if state["relevance_score"] >= 0.7 and state["coverage_score"] >= 0.8:
return "generate"
if state["retry_count"] >= 2:
return "fallback"
return "rewrite"
def check_retry_limit(state: AgentState):
if state["retry_count"] >= 2:
return "fallback"
return "rewrite"
# 构建 LangGraph 状态机
workflow = StateGraph(AgentState)
workflow.add_node("retrieve", retrieval_node)
workflow.add_node("grade", grading_node)
workflow.add_node("rewrite", rewrite_node)
workflow.add_node("fallback", lambda x: {"chunks": ["无答案"]})
workflow.add_node("generate", lambda x: x)
workflow.set_entry_point("retrieve")
workflow.add_edge("retrieve", "grade")
workflow.add_conditional_edges("grade", should_continue, {
"generate": "generate",
"rewrite": "rewrite",
"fallback": "fallback"
})
workflow.add_edge("rewrite", "retrieve") # 改写后重新检索
workflow.add_edge("fallback", END)
workflow.add_edge("generate", END)
app = workflow.compile()
七、调 Agentic RAG 双硬门的几个细节
Q1:为什么是 0.7 和 0.8?
这两个数字不是真理,它是我的业务在标注集上跑出来的最优业务拐点。0.7 是工程界对"相关"的统计学共识,低于这个值,无论怎么改写都难以得到正确答案。0.8 是对答案完整性的妥协,再高会导致重写率飙升,延迟无法接受。
Q2:怎么防 LLM 评分器的幻觉?
必须加上 CoT(Chain of Thought)。要求模型先输出"思考过程",再输出 JSON 分数。glm-5.2 和 qwen3.7-max 对 CoT 指令的响应很好,但 mimo-v2-pro 有时会偷懒跳过推理步骤,导致分数虚高。
Q3:Token 成本怎么压到最低?
缓存(Cache)是唯一的出路。把 Query 和 Chunks 拼接后做 MD5 哈希,作为 Redis 的 Key。所有的双硬门分数必须缓存。在我的业务里,缓存命中率达到了 65%,这直接把单次有效成本砍掉了一半。
Q4:遇到并发飙高怎么防雪崩?
千万不要在主流程里同步等待 LLM 评分。一般大模型 API 在 500 QPS 时就会开始限流。
第一,加超时熔断(比如 500ms 没返回直接降级)。
第二,引入本地小模型(如 bge-reranker-base)做并发度高的粗排,只有不达标的才转发给旗舰 LLM 评分。
八、参考资料
九、写在最后
最后分享三点我踩坑之后最深的经验:
-
硬门是工程妥协,不是真理。 0.7 和 0.8 完全可以根据你们公司具体的业务反馈调整。设硬门的本质是给状态机一个明确的"刹车"指令,防止它无限重写消耗 token。
-
便宜模型做主力,贵的模型做兜底。 不要无脑相信旗舰模型。
mimo-v2-pro做简单题,glm-5.2做主力评分,只有在两者都不达标时,才考虑调用claude-fable-5。这种漏斗式架构是控制成本的最优解。 -
别只看平均分,要看方差。 一个标准差极大的旗舰模型,在生产环境带来的用户体验是毁灭性的。方差越低,说明模型的输出越稳定,工程上才敢把控制权交给它。