进阶应用 中级

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 工具调用中,模型实际扮演的角色是?