Tool Description 设计铁律:清晰描述 + 参数约束 + 错误示例

一句话:Tool Description(工具描述)是 LLM 决定「什么时候调哪个工具」的唯一依据——写得好 Agent 稳准狠,写得烂 AI 就变成瞎指挥。


一、为什么 Tool Description 如此重要?

LLM 选工具不是靠「理解代码逻辑」,而是靠你写在工具定义里的三样东西:

要素LLM 用它做什么写烂了的后果
name指定「我要调哪个工具」名字太像另一个工具 → 选错
description判断「什么时候该调」该调不调,不该调乱调
parameters知道「要传什么参数」参数名写错 → LLM 瞎编

核心原则:工具的「说明书」是写给 LLM 看的,不是写给人类开发者看的。你要换位思考——一个只有文本理解能力、没有业务直觉的 LLM,看到你的工具定义时,能不能准确判断「现在该用它吗?参数该怎么填?」


铁律 1:少而精 > 多而全

超过 30~50 个工具后,LLM 选错工具的比率线性上升。

不是工具越多越强大——每多一个工具,LLM 的决策空间就大一圈。工具越多,选错概率越高。优先合并为任务级工具

铁律 2:高内聚任务级工具 > 零散 CRUD

❌ list_users() + list_events() + create_event()    3 个零散工具
✅ schedule_event(user, time, description)           1 个任务级工具

任务级工具封装了完整的业务流程,LLM 只需要做一次决策。零散 CRUD 工具不仅增加数量,还让 LLM 自己编排步骤——更容易出错。

铁律 3:枚举约束 > 自由文本

{
    "type": "object",
    "properties": {
        "status": {
            "type": "string",
            "enum": ["approved", "rejected", "pending"]
        }
    }
}
❌ status: string          → LLM 可能填 "驳回"、"通过"、"OK" 等各种变体
✅ enum: ["approved", ...] → LLM 只能从选项里选,不会跑偏

每个 string 参数,问自己:这个值真的是任意字符串吗? 如果是有限选项,永远用 enum

铁律 4:数字必须设上下限

{
    "amount": {
        "type": "number",
        "minimum": 1,
        "maximum": 100000
    }
}
❌ amount: number              → LLM 可能填负数、0、或者天文数字
✅ amount: number, minimum=1   → 防止非法值

LLM 没有「常识」判断数字的合理范围。你不约束,它就敢填 -999999

铁律 5:参数命名无歧义

❌ from, to                     → 容易搞反,LLM 分不清「从哪到哪」
✅ from_account_id, to_account_id → 一目了然

给参数取名时,把「唯一能区分它的信息」放进名字。from 还是 source_account_id?后者 LLM 几乎不会搞错。


三、工具返回错误的方式

这是最容易踩的坑:

# ❌ 错误:抛异常 —— LLM 看不到!
def transfer_money(from_id: str, to_id: str, amount: float) -> str:
    if amount <= 0:
        raise ValueError("金额必须大于 0")
 
# ✅ 正确:返回错误字符串 —— LLM 读到后可以自己纠正
def transfer_money(from_id: str, to_id: str, amount: float) -> str:
    if amount <= 0:
        return "错误:转账金额必须大于 0。请修正后重试。"
    return f"成功从 {from_id}{to_id} 转账 {amount} 元"

Exception → Agent 循环炸了。Error String → LLM 读到错误,自己纠正。

工具的错误信息是给 LLM 看的,不是给你的日志系统看的。

区分两种异常:

异常类型处理方式例子
业务错误(LLM 能纠正)返回错误字符串金额超限、参数不合法
系统错误(LLM 无法处理)抛异常,走重试/熔断网络超时、数据库连不上

四、工具的 description 怎么写

Description 是 LLM 判断「该不该用这个工具」的唯一依据。写得好能让选准确率从 60% 提到 95%+。

4.1 坏的 vs 好的 description

# ❌ 糟糕的 description
"获取天气"
 
# ✅ 好的 description
(
    "查询指定城市的实时天气,返回温度、湿度、天气状况。"
    "当用户询问以下内容时使用此工具:"
    "  - 某地当前的天气情况"
    "  - 今天/明天会不会下雨"
    "不要用此工具查询:"
    "  - 历史天气(请用 get_historical_weather)"
)

4.2 Description 写作模板

[一句话概括:这个工具做什么]
 
当以下情况使用此工具:
  - [场景 1]
  - [场景 2]
 
不要用此工具:
  - [排除场景 1 → 指定替代工具]

4.3 参数 description 写作要点

每个参数的 description 也很关键。你要告诉 LLM 这个参数的值从哪里来:

{
    "user_id": {
        "type": "string",
        "description": "用户唯一标识,从 auth_token 中解析获取。不要自己编造。"
    }
}

尤其注意:LLM 会自己编造参数值(幻觉)。如果参数值必须从上下文获取,一定在 description 里说明。


五、上下文成本真相

Manus 团队的生产数据(2026)告诉你该优化什么:

pie title Agent Token 消耗分布(Manus 团队 2026 生产数据)
    "系统 Prompt (3.4%)" : 3.4
    "用户消息 (~10%)" : 10
    "LLM 推理输出 (~19%)" : 19
    "工具返回结果 (67.6%)" : 67.6

优化工具返回结果的 Token 量,比优化 System Prompt 重要 20 倍。

两个实践建议:

  1. 工具返回结果要精简:只返回必要字段,别把整张表 JSON 原样返回
  2. 工具定义本身也有成本:每次请求都带着全部工具定义,所以少而精的铁律既提高准确率也省钱


速记卡(面试闪卡)

Q1:一句话讲清「Tool Description 设计铁律」到底是什么? A:Tool Description(工具描述)是 LLM 决定「什么时候调哪个工具」的唯一依据——写得好 Agent 稳准狠,写得烂 AI 就变成瞎指挥。

Q2:一、为什么 Tool Description 如此重要? A:LLM 选工具不是靠「理解代码逻辑」,而是靠你写在工具定义里的三样东西:name(指定调哪个,名字太像会选错)、description(判断何时该调,写烂了该调不调)、parameters(知道传什么参数,写错 LLM 就瞎编)。核心是换位思考——一个只有文本理解力、没有业务直觉的 LLM,看到你的定义能不能准确判断「现在该用它吗、参数怎么填」。

Q3:二、工具设计五条铁律——怎么理解? A:① 少而精 > 多而全:超过 30~50 个工具选错率线性上升,优先合并为任务级工具;② 高内聚任务级工具 > 零散 CRUD(schedule_event 比 list/add 零散工具好);③ 枚举约束 > 自由文本(enum 防 LLM 填「驳回」「OK」各种变体);④ 数字必须设上下限(minimum/maximum,否则 LLM 敢填 -999999);⑤ 参数命名无歧义(from_account_id 比 from/to 不易搞反)。

Q4:三、工具返回错误的方式——怎么理解? A:最容易踩的坑:抛异常(raise)会让 Agent 循环直接炸,因为 LLM 看不到;正确做法是返回错误字符串,LLM 读到后能自己纠正。区分两种异常:业务错误(金额超限、参数不合法,LLM 能纠正 → 返回错误字符串);系统错误(网络超时、数据库连不上,LLM 无法处理 → 抛异常走重试/熔断)。工具的错误信息是给 LLM 看的,不是给日志系统看的。

Q5:四、description 怎么写 / 五、上下文成本真相——怎么理解? A:好的 description 写「一句话概括 + 何时用 + 何时不用(指定替代工具)」,准确率能从 60% 提到 95%+;参数 description 要说明值从哪来,防 LLM 编造(幻觉)。成本真相:Manus 团队 2026 生产数据显示工具返回结果占 Agent Token 的 67.6%,优化它比优化 System Prompt 重要 20 倍——返回要精简,工具定义本身也有成本(每次请求都带全部定义)。

Q6:核心速记主线有哪些? A:一、为什么重要(三要素是 LLM 的唯一依据)、二、五条铁律(少而精/任务级/枚举/上下限/无歧义命名)、三、返回错误方式(字符串 vs 异常)、四、description 写法(场景 + 排除)、五、上下文成本真相(工具返回占 67.6%)。

口诀 A:工具描述写给 LLM 看,不是给同事看; 少而精、任务级,枚举上下限; 错误返回字符串,别让循环炸; 返回占掉七成 Token,精简最划算。

相关链接


技术学习路线图 > Agent 架构(核心)