先说一句核心结论:

@tool 的作用,就是把一个普通 Python 函数包装成“可被大模型调用的工具”。
在 LangChain 1.0 里,tool 的名字、描述、参数名、参数类型,都会成为模型决定“什么时候调用这个工具、传什么参数”的一部分。

  1. @tool 到底干了什么

本来 get_weather 只是个普通函数:

def get_weather(city: str):

加上 @tool(…) 以后,它不再只是普通函数,而是变成了一个 LangChain Tool 对象,可以被 agent 注册和调用。LangChain v1 文档把 tool 定义为:给模型提供能力的可调用函数,模型会根据上下文决定是否调用它以及传入什么参数。

你可以把它理解成:

普通函数:给程序员调用

@tool 包装后的函数:给 大模型 + agent 调用

  1. from langchain.tools import tool 在 1.0 里的位置

在 LangChain v1 里,langchain.tools 是精简后的核心命名空间之一,@tool 是从 langchain-core 重新导出的。也就是说,在 1.0 里这么写是标准写法之一。

所以你这句:

from langchain.tools import tool

在 LangChain 1.0 下是对的。

  1. 你的 @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 更适合天气这种场景。

  1. @tool 怎么知道参数长什么样

你函数定义是:

def get_weather(city: str):

LangChain 会从这个签名里推断出:

这个工具需要一个参数:city

参数类型是 str

文档里明确说,@tool 是创建工具的最简单方式,函数签名会用于形成工具的输入结构。

所以模型会知道它应该传类似这样的参数:

{“city”: “Beijing”}

而不是乱传别的东西。

  1. 为什么类型注解很重要

这里的:

city: str

不只是给你自己看,也是给 LangChain 和模型看。

因为 tool 的参数 schema 需要从函数签名推断。
文档强调,工具参数的名字和结构会成为模型理解工具的一部分。

所以:

def get_weather(city: str):

def get_weather(x):

好得多。

原因是:

city 语义清楚

str 类型明确

模型更容易正确调用

  1. 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”。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐