Agent 成本路由:轻量分类器过滤 + 昂贵 Agent 按需激活 · 干货攻略
- 链接: https://x.com/hwchase17/status/2087972990499852353
- 分类: x-tips
- 来源: X @hwchase17
- 作者: Jay
- 更新: 2026-08-17
这是什么
在 LangChain/LangGraph Agent 执行链中,在调用昂贵 Agent 之前插入一个轻量级分类器/路由步骤,由该步骤判断当前输入是否真的值得跑 Agent。如果分类器判定"不值得",直接返回轻量级结果(如简单回复、规则匹配、缓存结果),跳过整个 Agent 调用链路,从而节省大量 token 消耗。
核心代码模式(LangChain Expression Language, LCEL):
from langchain_core.output_parser import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
# 步骤 1:轻量级路由分类器
router_prompt = ChatPromptTemplate.from_messages([
("system", "你是一个分类器。判断用户问题是否需要调用Agent(需要搜索网页、执行代码、访问数据库等工具)?只需回答 YES 或 NO。"),
("human", "{input}")
])
# 用便宜模型(如 GPT-4o-mini / Haiku)做路由判断
router_model = ChatOpenAI(model="gpt-4o-mini", temperature=0)
router_chain = router_prompt | router_model | StrOutputParser()
# 步骤 2:路由到不同分支
def route_after_router(state):
result = router_chain.invoke({"input": state["input"]})
if result.strip().upper() == "YES":
return "agent"
else:
return "direct"
# 步骤 3:直接回复分支(不调用Agent)
direct_prompt = ChatPromptTemplate.from_messages([
("system", "你是一个助手,直接回答以下问题,不要使用任何工具。"),
("human", "{input}")
])
direct_chain = direct_prompt | ChatOpenAI(model="gpt-4o-mini") | StrOutputParser()
# 步骤 4:完整 Agent 分支(调用工具)
from langchain.agents import create_react_agent
from langchain.tools import tool
@tool
def web_search(query: str):
"""搜索网页"""
# 实际实现使用 Tavily / DuckDuckGo 等
return f"搜索结果: {query}"
tools = [web_search]
agent = create_react_agent(ChatOpenAI(model="gpt-4o"), tools)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# 步骤 5:用 LCEL 组装条件路由
from langchain_core.runnables import RunnableBranch
branch = RunnableBranch(
(lambda x: route_after_router(x) == "agent", agent_executor),
(lambda x: route_after_router(x) == "direct", direct_chain),
direct_chain
)
# 使用
result = branch.invoke({"input": "你好,今天天气怎么样?"}) # → 直接回复,跳过Agent
result = branch.invoke({"input": "帮我查一下台积电最新财报关键数据"}) # → 触发Agent
为什么值得关注
谁分享的、解决什么问题
LangChain 联创兼 CEO Harrison Chase(@hwchase17) 在 X 上分享了这一模式。原话是:
"Can use a lightweight classifier step to first decide if even worth running / Then more expensive agent if that criteria is met"
背后的工程痛点很清晰:Agent 循环(如 ReAct 模式)每轮都会把完整对话历史塞入 context window,并反复调用 LLM 生成 Thought-Action-Observation 序列。即使面对"今天天气如何"这类简单问题,Agent 也会启动完整推理链路,造成不必要的 token 消耗和延迟。
典型 Agent 系统 prompt + 工具定义本身就很大(常占 2,000-8,000 token),跑一轮就烧掉这些。即使最后 Agent 判断"不需要工具,直接回答",中间的过程已经花了钱。
核心收益(数字标注说明)
- 原帖 / 部分社区分享声称该模式可节省 90-95% token 消耗(
@hwchase17原帖未附具体数字;此数字为社区引用,未经官方文档独立核验,属「原帖主张,未完全核验」——典型场景下,路由到直接回复确实可省掉整个 Agent 循环的 token,真正的节省幅度取决于简单查询占比) - LangChain 官方博客(Sequoia 采访等)确认该架构为 LangChain 核心设计思路之一,并提及 Adaptive 集成可实现 60-90% 推理成本降低(来源:Adaptive + LangChain 集成公告,第三方来源)
- 综合多个来源,轻量路由 + 模型分层 典型组合可实现 60-80% 成本降低(多个第三方工程博客 2026 年数据)
⚠️ 重要提示:90-95% 是原帖/社区层面的主张,无单一官方来源独立确认此数字。实际效果高度依赖简单查询在总请求中的占比。写攻略时建议使用「理论上可节省大量 token,实际收益视简单查询比例而定」这类表述。
核验过程
官方来源
| 来源 | 读取内容 | 结论 |
|---|---|---|
| X @hwchase17 | "Can use a lightweight classifier step to first decide if even worth running / Then more expensive agent if that criteria is met" | ✅ 原始分享属实,概念有效 |
| LangChain 官方博客(Sequoia 采访) | Harrison Chase 明确提及路由是 LangChain 核心概念之一,Agent 与 Chain 是两种极端模式 | ✅ 架构设计理念有官方背书 |
| Adaptive + LangChain 集成公告 | "60-90% lower inference costs while maintaining or even enhancing output quality" | ⚠️ 第三方来源(非 LangChain 官方数字),Adaptive 合作页面 |
交叉验证
| 说法 | 核验结论 |
|---|---|
| 该模式为 LangChain 原生支持(LCEL RunnableBranch) | ✅ LCEL 文档确认 RunnableBranch 可实现条件路由 |
| 使用轻量分类器判断是否值得跑 Agent | ✅ X 原帖明确,LangChain 路由设计文档一致 |
| 可节省 90-95% token | ❌ 无法核验:原帖未附数字;Adaptive 合作页面提及 60-90%,但为第三方来源;多个工程博客提及 70-80% 为典型综合节省区间 |
| LangChain Primitives(LCEL)可实现 | ✅ create_react_agent + RunnableBranch + 自定义分类器均可实现 |
核验总结:核心架构思路有官方背书;具体节省比例(90-95%)无法独立确证,建议在文中标注为「原帖主张」而非「已确认事实」。
上手步骤
环境准备
pip install langchain langchain-openai langchain-core
# 或使用 langgraph(更推荐生产场景)
pip install langgraph
方案一:LCEL RunnableBranch(轻量,最快上手)
适合:快速验证想法、原型阶段
# 完整示例见上方「这是什么」章节
方案二:LangGraph 条件边(生产推荐)
LangGraph 是 LangChain 的状态机扩展,更适合复杂 Agent 流程:
from langgraph.graph import StateGraph, END
from typing import TypedDict
class AgentState(TypedDict):
input: str
output: str
route: str
def router_node(state: AgentState) -> AgentState:
"""轻量分类器节点——用最便宜的模型"""
response = router_chain.invoke({"input": state["input"]})
route = "agent" if "YES" in response.upper() else "direct"
return {"route": route}
def agent_node(state: AgentState) -> AgentState:
result = agent_executor.invoke({"input": state["input"]})
return {"output": result["output"]}
def direct_node(state: AgentState) -> AgentState:
result = direct_chain.invoke({"input": state["input"]})
return {"output": result}
def should_run_agent(state: AgentState) -> str:
return state.get("route", "direct")
workflow = StateGraph(AgentState)
workflow.add_node("router", router_node)
workflow.add_node("agent", agent_node)
workflow.add_node("direct", direct_node)
workflow.set_entry_point("router")
workflow.add_conditional_edges(
"router",
should_run_agent,
{"agent": "agent", "direct": "direct"}
)
workflow.add_edge("agent", END)
workflow.add_edge("direct", END)
app = workflow.compile()
调优建议
- 路由模型选型:用
gpt-4o-mini、claude-3-haiku或deepseek-chat作为分类器;分类任务简单,旗舰模型浪费 - few-shot 提升准确率:在路由 prompt 中加入 2-3 个 YES/NO 示例,减少误判
- 分类标签扩展:从二元 YES/NO 扩展为多档(如
simple / moderate / complex),对应直接回复 / 轻量工具 / 全 Agent - 缓存命中:简单问题答案可存 Redis/LangChain Cache,二次命中零 token 消耗
坑与适用边界
适用场景
- 高并发、低复杂度查询占比高的系统(如客服 FAQ、简单问答)
- 成本敏感且需要明确成本控制的场景
- 延迟敏感业务:直接回复比 Agent 快 5-20 倍
- 作为 模型分层选型 的前置过滤层
不适用场景
- 复杂多步推理任务(几乎每步都需要 Agent,判断逻辑本身可能比 Agent 还贵)
- 路由误判代价高的场景(如金融合规判断,漏检代价远大于节省)
- 简单查询占比低于 20% 时,路由引入的额外 token 可能得不偿失
- 实时流式响应场景:路由增加了首 token 等待时间
常见坑
- 路由模型本身太慢:如果路由模型用了旗舰模型,整体延迟反而上升。务必用最便宜的分类模型。
- 分类 prompt 不稳定:没有 few-shot 示例时,同一问题可能得到 YES/NO 不确定的结果,导致路由不稳定。
- 误判率需要监控:建议在 LangSmith 中追踪路由决策分布,持续优化 prompt。
- Agent 的工具调用被路由错误跳过:在分类 prompt 中明确"需要调用任何外部工具(搜索/计算/数据库)就选 YES"。
一句话结论
在 LangChain/LangGraph Agent 执行链前加一个轻量级意图分类路由,用最便宜的模型判断是否真的需要 Agent,可显著降低 token 消耗和延迟——典型场景节省 60-80% 不等(90-95% 为原帖主张,建议按实际业务比例实测);核心思路 Harrison Chase 本人背书,实现用 LCEL RunnableBranch 或 LangGraph 条件边即可。