Tool Calling:让模型调用工具
学习 @tool 装饰器定义工具,理解 bind_tools 与 ToolMessage 的交互协议。
什么是工具
工具(Tool)是暴露给模型的"函数":模型看到工具的名称、描述、参数 schema,在需要时输出"我想调用某工具及参数",由应用侧真正执行并把结果返回给模型。
注意:模型并不执行代码,它只是"点菜",执行永远发生在你的应用里。
定义工具
from langchain_core.tools import tool
@tool
def search_weather(city: str) -> str:
"""查询指定城市今天的天气。city 为中文城市名。"""
# 实际项目中这里调用真实 API
return f"{city}:晴,28℃"
print(search_weather.name, search_weather.description)
print(search_weather.args_schema.model_json_schema())
docstring 很重要 —— 它就是模型判断"何时该用这个工具"的依据。
手动完成一次工具调用循环
llm_with_tools = llm.bind_tools([search_weather])
resp = llm_with_tools.invoke("北京天气怎么样?")
tool_call = resp.tool_calls[0]
print(tool_call["name"], tool_call["args"])
tool_result = search_weather.invoke(tool_call["args"])
# 把工具结果作为 ToolMessage 回传
from langchain_core.messages import ToolMessage
final = llm_with_tools.invoke([
("user", "北京天气怎么样?"),
resp,
ToolMessage(content=tool_result, tool_call_id=tool_call["id"]),
])
print(final.content)
工具设计要点
- 名称与描述用模型易理解的语言,写清参数含义;
- 单个工具职责单一,避免"万能工具";
- 参数用简单类型,带默认值;
- 工具内部做好异常捕获,把错误信息(而非抛异常)返回给模型。
📝 课后练习
quiz-1 工具调用中,模型实际扮演的角色是?