Agent 系统里一个非常典型、而且"越复杂越不稳定"的问题 。你这个现象本质上不是偶发 Bug,而是架构层面的复杂性失控。
我分 「原因 → 对应解决策略 → 可落地架构方案」 三层来讲,偏工程化,适合你现在做多工具 Agent / RAG / 工作流系统的背景。
一、为什么 tools 一多,错误率就会飙升(根因拆解)
1️⃣ Tool Selection 是一个「隐式多分类问题」
当 tools 数目从 3 → 10 → 30:
- LLM 需要在 更大的 action space 里做选择
- 工具描述语义开始 高度重叠
- Prompt 中工具说明被 截断 / 稀释
结果就是:
- 选错工具
- 参数格式错
- 本该组合调用却只调用一步
👉 这是概率论问题,不是你写得不够好
2️⃣ 上下文污染(Context Pollution)
当 tools 多时,Prompt 通常会包含:
- 所有 tools 的 description
- 多轮 tool-call 记录
- 中间 reasoning
- RAG 检索内容
模型注意力被稀释,会出现:
- 忘记刚刚 tool 返回的关键字段
- 混淆不同 tool 的 schema
- JSON 输出不稳定
3️⃣ Tool Schema 复杂 + 不一致
常见坑:
- 不同 tools 的参数命名不一致(
query/q/text) - 可选参数过多
- 同一 tool 支持多种模式
👉 LLM 对 宽 schema 极其不友好
4️⃣ Agent 自由度过高("全能型 Agent")
典型反模式:
"给 Agent 所有工具,让它自己想怎么用"
结果就是:
- 规划不稳定
- 死循环
- 随机失败(尤其长链路)
二、核心解决思路(一句话版)
减少"单次决策复杂度",而不是减少工具数量
工具可以多,但 每一步只让模型面对极少的选择
三、可落地的 6 大工程级解决方案(强烈推荐)
✅ 方案 1:Tool 分层 + 路由(最重要)
核心思想
一个 Agent 永远不直接面对所有 tools
User Query
↓
Router Agent(只做分类)
↓
Domain Agent(只看到该领域的 tools)
↓
Executor
示例
text
Router Agent tools:
- classify_intent()
Intent = "GitHub PR 检索"
↓
GitHubAgent tools:
- fetch_pr_list
- fetch_pr_detail
- update_pr_index
👉 每个 Agent 的 tools 数量 ≤ 5
✅ 方案 2:Two-Step Tool Selection(显著降低误选)
不要让模型"选 + 调"一步完成
Step 1:只选工具(无参数)
json
{
"tool_name": "search_github_pr"
}
Step 2:再补参数
json
{
"repo": "xxx",
"query": "bug fix"
}
优点:
- 减少 schema 压力
- 明确失败点
- 可加校验
✅ 方案 3:工具接口「极简化 + 原子化」
❌ 坏例子
json
{
"mode": "hybrid",
"query": "...",
"top_k": 10,
"use_cache": true,
"filters": {...}
}
✅ 好例子
text
tool: search_pr_by_text(text)
tool: search_pr_by_id(pr_id)
👉 让工具在代码里智能,而不是在 Prompt 里智能
✅ 方案 4:显式 Planning(先计划,后执行)
强烈建议你用这个(你现在的系统非常适合)。
text
Step 1: 列出需要的子任务(不调用工具)
Step 2: 为每个子任务选一个工具
Step 3: 严格按计划执行
失败率会肉眼可见下降。
✅ 方案 5:Tool Schema 强约束(不是靠模型"自觉")
必做
- JSON Schema
- Required 字段
- 枚举值
- 参数默认值由代码补
进阶
- 参数自动纠错(string → int)
- Missing field retry(带提示)
✅ 方案 6:失败兜底(这是生产级必须的)
典型兜底策略
-
Tool call 失败 → 自动总结错误 → 再试一次
-
连续失败 → 降级为:
- fewer tools
- 或纯文本回答
千万别让 Agent 自己死循环
四、一个你可以直接用的稳定架构(示意)
text
User
↓
Intent Router(LLM,3--5 intents)
↓
Domain Agent(<=5 tools)
↓
Planner(text plan)
↓
Executor(tool calls)
↓
Validator(schema + logic)
↓
Answer
这套结构在:
- GitHub RAG
- 多源检索
- 企业内 Agent
里已经是 事实标准