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 一重启就忘事,下一章解决"记忆"。