Part 2 · 核心能力

05 工具调用代理:让 AI 自己选工具

05.1 AI 怎么知道调哪个

老实说,第一次看到 AI 自己选工具,我还挺惊讶。原理其实就三步:

第一,把工具清单和说明给模型。 第二,模型返回"我想调 X,参数是 Y"。 第三,你执行 X,把结果还回去,模型再总结。

llm_with_tools = llm.bind_tools([search_web, get_weather])

resp = llm_with_tools.invoke("北京天气?")
print(resp.tool_calls)

05.2 ToolNode 帮你执行

你不用自己写"查字典调函数"的循环。ToolNode 包好了:

from langgraph.prebuilt import ToolNode

tool_node = ToolNode([search_web, get_weather])

配合 tools_condition 做路由,就是 §03 那张图的完整逻辑。

05.3 工具描述写得好,AI 才听得懂

这是实战里最值钱的一条经验:

@tool
def f(x):
    """一个函数"""
    ...

@tool
def search_flights(dep: str, arr: str, date: str):
    """查航班。

    Args:
        dep: 出发城市,如"北京"
        arr: 到达城市,如"上海"
        date: 日期,格式 YYYY-MM-DD
    """
    ...

标叔的经验:描述决定命中率 我测过一个客服:把工具描述从"查询"改成"当用户询问订单、物流时调用",无效调用少了七成。

05.4 给工具加容错

工具会失败。在工具里自己接住:

@tool
def get_weather(city: str):
    """查询天气。"""
    try:
        return api.get(city)
    except Exception as e:
        # 返回友好信息,让 AI 自己圆场
        return f"查 {city} 天气出错:{e}"

核心建议:工具里吞异常 别让异常冒泡到图外。返回一段说明文字,AI 会自己跟用户解释。

▸ 向前桥接 工具会选了。可 Agent 一重启就忘事,下一章解决"记忆"。