@tool功能分析
先说一句核心结论:
@tool 的作用,就是把一个普通 Python 函数包装成“可被大模型调用的工具”。
在 LangChain 1.0 里,tool 的名字、描述、参数名、参数类型,都会成为模型决定“什么时候调用这个工具、传什么参数”的一部分。
- @tool 到底干了什么
本来 get_weather 只是个普通函数:
def get_weather(city: str):
…
加上 @tool(…) 以后,它不再只是普通函数,而是变成了一个 LangChain Tool 对象,可以被 agent 注册和调用。LangChain v1 文档把 tool 定义为:给模型提供能力的可调用函数,模型会根据上下文决定是否调用它以及传入什么参数。
你可以把它理解成:
普通函数:给程序员调用
@tool 包装后的函数:给 大模型 + agent 调用
- from langchain.tools import tool 在 1.0 里的位置
在 LangChain v1 里,langchain.tools 是精简后的核心命名空间之一,@tool 是从 langchain-core 重新导出的。也就是说,在 1.0 里这么写是标准写法之一。
所以你这句:
from langchain.tools import tool
在 LangChain 1.0 下是对的。
- 你的 @tool(…) 每个参数是什么意思
你这里写的是:
@tool(‘get_weather’, description=‘Return weather information for a given city’, return_direct=False)
逐个解释。
3.1 第一个参数 ‘get_weather’
这是工具名,也就是 tool name。
@tool(“get_weather”)
这个名字会暴露给模型。模型在决定调用哪个工具时,会参考这个名字。
文档里明确说,工具的 名称、描述、参数名 都会进入模型的提示上下文,所以命名要清晰。
你的名字 get_weather 很合理,因为一看就知道是查天气。
3.2 description=‘Return weather information for a given city’
这是工具描述。
它非常重要,因为模型通常不是“看源码”来理解工具,而是看:
工具名
描述
参数 schema
来判断这个工具能不能用。LangChain 文档明确说明,工具文档要写清楚,因为这些信息会成为模型提示的一部分。
你的描述意思是:
给定城市名,返回天气信息
这能帮助模型在用户问“北京天气怎么样”时,知道该用这个工具。
3.3 return_direct=False
这个参数的意思是:
工具执行结果要不要直接作为最终答案返回给用户。
False:不直接返回;工具结果会先交回 agent / 模型,再由模型组织成自然语言回复
True:工具一执行完,它的结果就直接作为最终输出返回,不再让模型进一步加工
这个参数常用于“某些工具的结果本身就是最终答案”的场景。文档提到 @tool 可自定义名字、描述、参数 schema 和其他属性;return_direct 属于这种工具行为控制项。
你这里写:
return_direct=False
意味着:
agent 先调用 get_weather
拿到 response.json()
再由模型把 JSON 整理成一句人话回复用户
这通常比 True 更适合天气这种场景。
- @tool 怎么知道参数长什么样
你函数定义是:
def get_weather(city: str):
LangChain 会从这个签名里推断出:
这个工具需要一个参数:city
参数类型是 str
文档里明确说,@tool 是创建工具的最简单方式,函数签名会用于形成工具的输入结构。
所以模型会知道它应该传类似这样的参数:
{“city”: “Beijing”}
而不是乱传别的东西。
- 为什么类型注解很重要
这里的:
city: str
不只是给你自己看,也是给 LangChain 和模型看。
因为 tool 的参数 schema 需要从函数签名推断。
文档强调,工具参数的名字和结构会成为模型理解工具的一部分。
所以:
def get_weather(city: str):
比
def get_weather(x):
好得多。
原因是:
city 语义清楚
str 类型明确
模型更容易正确调用
- description 和 docstring 的关系
在 LangChain v1 里,最简单的 @tool 用法 是直接写 docstring,不写 description=;默认情况下函数 docstring 会变成工具描述。官方文档就是这么写的。
例如:
@tool
def get_weather(city: str) -> str:
“”“Return weather information for a given city.”“”
…
这和你手动写:
@tool(“get_weather”, description=“Return weather information for a given city”)
作用接近。
也就是说,你现在这个写法是“显式指定 description”,而官方更常见展示的是“用 docstring 当 description”。
更多推荐
所有评论(0)