现象

给 Agent 挂了 8 个工具后,出现两类问题:

  1. 模糊问题也会硬调工具
  2. 参数名对,但语义填错(把项目名塞进 query)

提示词加长也不稳。后来发现多数问题在工具定义本身。

工具名:短,但别歧义

from langchain.tools import tool

@tool
def search_notes(query: str) -> str:
    """Search personal tech notes by keyword.

    Use only for questions about past experiment logs.
    Do NOT use for general web search or live news.
    """
    return f"notes about: {query}"

要点:

  • 名字说明「动作 + 对象」:search_notes 优于 search
  • docstring 写清 何时用 和 何时不用
  • 参数用 .describe() 补语义(TS/部分模型更吃 schema 描述)

描述里要写负面约束

很多人只写正面说明。对 Agent 更有用的是:

Use when: ...
Do not use when: ...
Return format: ...

因为模型判断「该不该调」时,负面样例往往比再堆参数说明更有效。

失败要可恢复,而不是炸整轮

@tool
def fetch_config(name: str) -> str:
    """Load a named config by exact id."""
    try:
        return load(name)
    except FileNotFoundError:
        return f"ERROR: config '{name}' not found. Try list_configs first."

让错误信息告诉模型下一步,而不是抛异常终止。

我的检查清单

  • 工具名是否自解释
  • docstring 是否有 Use / Do not use
  • 参数是否有语义描述
  • 返回是否是模型好消化的字符串/结构
  • 失败是否给出可行动提示

结论

工具不是越多越好。
少而准的工具 + 清晰边界,通常比 20 个模糊工具更稳。