摘要::最大步数、预算上限、任务完成判定 有一套安全边界:白名单、权限、审计、脱敏、幂等、回退
也就是说token 必须可控(Agent 循环天然容易超预算) 输入输出格式严格:JSON/表格/固定字段(优先结构化输出闭环,而不是 Agent) 数据/工具权限复杂:多租户、多角色、多数据域(Agent 的权限面扩大很快) 评测体系不成熟:没有离线回归集/线上指标(Agent 很难迭代,只能靠感觉) 你其实只需要检索:问题的核心是“找到正确证据并回答”(优先做 RAG 链路与评测)
一句话总结:如果你现在连“单次调用 + 可观测 + 可回滚”都做不好,先别上 Agent。
: # TODO: 工具白名单/权限/超时/幂等/审计 return {"ok":
最近“Agent”很火,很多团队的默认动作变成了:
只要做大模型应用,就先上 Agent。
但工程上最常见的现实是: Agent 并没有让项目更快落地,反而带来了成本上涨、延迟变差、错误更难定位、安全面变大、评测更难做。
这篇文章不讲“Agent 框架选型”,只回答一个更现实的问题:
什么时候你不该用 Agent? 以及:不用 Agent,你该用什么替代方案?
建议:把“工具成功率/回退率/步数分布/平均token与P95延迟”做成看板,否则 Agent 很难迭代。
工程视角下,Agent 往往意味着:
也就是说:Agent 不只是“模型”,它是一套“可执行系统”。 所以它的复杂度和风险,天然高于 Chat/RAG/单次工具调用。
下面这些场景,Agent 往往收益为 0,复杂度却会显著上升:
你可以用这 6 个问题快速收敛:
如果 1–3 都是“否”,基本不用 Agent; 如果 1–3 是“是”,但 4–6 不具备,也不建议上(先补工程基础)。
经验:多数“Agent 需求”,其实是“工作流 + RAG + 工具调用”的组合。
Agent 最容易失控的点是:没有明确停止条件。 下面是一个“最小可控循环”的骨架(示意):
from dataclasses import dataclass from typing import Any, Dict, List, Optional import time @dataclass class Budget: max_steps: int = 6 max_seconds: float = 8.0 max_total_tokens: int = 8000 def call_llm(messages: List[Dict[str, str]]) -> Dict[str, Any]: """ 返回示例: {"action":"tool","tool_name":"search","tool_args":{"q":"..."}} 或 {"action":"final","content":"..."} """ return {"action": "final", "content": "stub"} def run_tool(tool_name: str, tool_args: Dict[str, Any]) -> Dict[str, Any]: # TODO: 工具白名单/权限/超时/幂等/审计 return {"ok": True, "data": {}} def agent(user_query: str, budget: Budget) -> str: t0 = time.time() messages = [{"role": "user", "content": user_query}] for step in range(budget.max_steps): if time.time() - t0 > budget.max_seconds: return "超时,已降级返回(可提示用户稍后重试/转人工)。" decision = call_llm(messages) if decision.get("action") == "final": return decision.get("content", "") # 工具调用 tool_name = decision["tool_name"] tool_args = decision.get("tool_args", {}) tool_result = run_tool(tool_name, tool_args) messages.append({"role": "assistant", "content": str(decision)}) messages.append({"role": "tool", "content": str(tool_result)}) return "达到最大步数,已降级返回(可提示用户缩小问题范围)。"
你会发现:哪怕是“最小骨架”,也已经包含了超时、最大步数、工具执行与降级。 如果你对这些都没准备好,先不要上 Agent。
你评估 Agent 往往需要对比不同模型、不同提示词、不同工具策略。 建议统一成 OpenAI 兼容入口(很多时候只改 base_url 与 api_key)。举个例子:147ai(以其控制台/文档为准):
base_url
api_key
https://147ai.com
POST /v1/chat/completions
Authorization: Bearer <KEY>
https://147api.apifox.cn/
也就是说token 必须可控(Agent 循环天然容易超预算) 输入输出格式严格:JSON/表格/固定字段(优先结构化输出闭环,而不是 Agent) 数据/工具权限复杂:多租户、多角色、多数据域(Agent 的权限面扩大很快) 评测体系不成熟:没有离线回归集/线上指标(Agent 很难迭代,只能靠感觉) 你其实只需要检索:问题的核心是“找到正确证据并回答”(优先做 RAG 链路与评测)
一句话总结:如果你现在连“单次调用 + 可观测 + 可回滚”都做不好,先别上 Agent。
: # TODO: 工具白名单/权限/超时/幂等/审计 return {"ok":
最近“Agent”很火,很多团队的默认动作变成了:
但工程上最常见的现实是:
Agent 并没有让项目更快落地,反而带来了成本上涨、延迟变差、错误更难定位、安全面变大、评测更难做。
这篇文章不讲“Agent 框架选型”,只回答一个更现实的问题:
0)TL;DR(先给结论)
1)先把概念对齐:Agent 不是“更聪明的 Chat”
工程视角下,Agent 往往意味着:
也就是说:Agent 不只是“模型”,它是一套“可执行系统”。
所以它的复杂度和风险,天然高于 Chat/RAG/单次工具调用。
2)你不该用 Agent 的 10 个典型场景(禁用清单)
下面这些场景,Agent 往往收益为 0,复杂度却会显著上升:
3)一个决策树:到底要不要 Agent?
你可以用这 6 个问题快速收敛:
如果 1–3 都是“否”,基本不用 Agent;
如果 1–3 是“是”,但 4–6 不具备,也不建议上(先补工程基础)。
4)不用 Agent,你应该用什么?(替代方案对照表)
5)如果你非要做 Agent:先把“停止条件”写清楚(最小骨架)
Agent 最容易失控的点是:没有明确停止条件。
下面是一个“最小可控循环”的骨架(示意):
from dataclasses import dataclass from typing import Any, Dict, List, Optional import time @dataclass class Budget: max_steps: int = 6 max_seconds: float = 8.0 max_total_tokens: int = 8000 def call_llm(messages: List[Dict[str, str]]) -> Dict[str, Any]: """ 返回示例: {"action":"tool","tool_name":"search","tool_args":{"q":"..."}} 或 {"action":"final","content":"..."} """ return {"action": "final", "content": "stub"} def run_tool(tool_name: str, tool_args: Dict[str, Any]) -> Dict[str, Any]: # TODO: 工具白名单/权限/超时/幂等/审计 return {"ok": True, "data": {}} def agent(user_query: str, budget: Budget) -> str: t0 = time.time() messages = [{"role": "user", "content": user_query}] for step in range(budget.max_steps): if time.time() - t0 > budget.max_seconds: return "超时,已降级返回(可提示用户稍后重试/转人工)。" decision = call_llm(messages) if decision.get("action") == "final": return decision.get("content", "") # 工具调用 tool_name = decision["tool_name"] tool_args = decision.get("tool_args", {}) tool_result = run_tool(tool_name, tool_args) messages.append({"role": "assistant", "content": str(decision)}) messages.append({"role": "tool", "content": str(tool_result)}) return "达到最大步数,已降级返回(可提示用户缩小问题范围)。"你会发现:哪怕是“最小骨架”,也已经包含了超时、最大步数、工具执行与降级。
如果你对这些都没准备好,先不要上 Agent。
6)上线前 Checklist(建议打印)
7)资源区:评测/路由 Agent 时,先把接入层统一
你评估 Agent 往往需要对比不同模型、不同提示词、不同工具策略。
建议统一成 OpenAI 兼容入口(很多时候只改
base_url与api_key)。举个例子:147ai(以其控制台/文档为准):https://147ai.comPOST /v1/chat/completionsAuthorization: Bearer <KEY>https://147api.apifox.cn/