1. Tool工具调用
2. Tool 介绍
2.1 为什么需要 Tool
Written: 2026.06 虽然大模型具备强大的语言理解和生成能力,但它本质上是静态的、不可交互的。比如:- 不具备访问数据库、调用 API 的能力
- 不能执行代码或文件操作
- 无法实时访问互联网或动态数据等
- 实时访问外部世界(如天气、股票、网页等)
- 调用计算函数(数学、单位换算)
- 查询数据库或搜索文档
- 实现“多轮决策”流程(如规划任务、搜索后总结)
2.2 Function calling 介绍
Function Calling 最早是 OpenAI 在其 API 中引入的一项功能,允许开发者将大语言模型(如 GPT-4)与外部函数或工具集成。通过 Function Calling,模型可以理解用户请求并生成调用外部函数所需的参数,从而实现更复杂、更动态的任务处理。 简单来说,Function calling让大语言模型拥有了调用外部接口的能力,使用这种能力,大模型能做一些比如实时获取天气信息、发送邮件等和现实世界交互的事情。2.3 Function calling 原理
在发送信息给大模型的时候,携带着“工具”列表,这些工具列表代表着大模型能使用的工具。当大模型遇到用户提出的问题时,会先思考是否应该调用工具解决问题,如果需要调用工具,和普通消息不同,这种情况下会返回“function_call”类型的消息,请求方根据返回结果调用对应的工具得到工具输出,然后将之前的信息加上工具输出的信息一起发送给大模型,让大模型整合起来综合判断给出结果。
2.4 Tool 工作原理
工具的工作流程如下:- 定义工具:指定工具的名称、描述和执行逻辑(函数或类)。
- 注册工具:将工具提供给代理或链,代理根据任务描述选择工具。
- 调用工具:代理生成工具调用的指令(包括输入参数),工具执行并返回结果。
- 处理结果:代理或链将工具输出整合到工作流中,生成最终响应。
- 工具描述:帮助代理理解工具的功能和适用场景。
- 输入解析:确保工具能正确处理代理提供的输入。
- 输出格式:工具返回的结果应与代理或链的期望兼容。
2.5 Tool 类继承关系
分析LangChain源码可知,在 LangChain 的类结构中,tool 的顶层基类是Runnable,定义可执行的对象,实现了通用的执行接口。然后又通过 Serializable 提供 LangChain内部的可序列化能力,从而实现了允许工具、链、模型被保存或导出,供后续加载。最后通过 BaseTool 定义工具的统一规范 ,实现了同步 / 异步支持,参数校验等功能。

3. 使用内置 Tool
在MCP爆火之前,LangChian生态中就已经内置集成了非常多的实用工具,开发者可以快速调用这些工具完成更加复杂工作流的开发 LangChain内置工具列表:https://docs.langchain.com/oss/python/integrations/tools LangChain提供了多种内置工具,大致可分为以下几类:- 搜索工具:如Google搜索、维基百科搜索等
- 数据库工具:SQL查询、向量数据库操作等
- API工具:与外部API交互的工具
- 文件工具:读写文件、处理文档等
- 数学工具:执行数学计算的工具
- 编程工具:执行代码、Shell命令等
PythonREPLTool 实现基于大语言模型的代码生成和执行系统,主要功能是让模型生成Python代码并自动执行。参考文档:https://docs.langchain.com/oss/python/integrations/tools/python
PythonREPL( )示例
执行链式调用,计算1到100的整数总和
4. 自定义Tool
Tool 工具机制的思想比较简单,他允许用户以AP接口的形式给大模型提供额外的帮助。当本地应用跟大模型聊天时,除了告诉大模型问题,同时也告诉他,本地应用能够提供哪些工具(比如查询今天的日期。这样大模型会对问题进行综合判断,当单行觉得需要使用某些工具帮助解决问题时,就会向本地应用返回一个需要调用工具的请求。然后本地应用就可以执行工具,并将工具的执行结果返回给大模型。大摸型再结合工具的执行结果,给出一个完整的答案。这样就可以让八大模型强大的知识推理能力和本地应用的私有业务能力形成良好的互动。4.1 自定义 Tool 方式
第1种:使用@tool装饰器(自定义工具的最简单方式) 装饰器默认使用函数名称作为工具名称,但可以通过参数name_or_callable 来覆盖此设置。 同时,装饰器将使用函数的文档字符串作为工具的描述,因此函数必须提供文档字符串。 第2种:使用StructuredTool.from_function类方法
这类似于@tool 装饰器,但允许更多配置和同步/异步实现的规范。
4.2 Tool 常用属性
| 属性 | 类型 | 描述 |
|---|---|---|
name | str | 必选,在提供给LLM或Agent的工具集中必须是唯一的。 |
description | str | 可选但建议,描述工具的功能。LLM或Agent将使用此描述作为上下文,使用它确定工具的使用 |
args_schema | Pydantic BaseModel | 可选但建议,可用于提供更多信息(例如,few-shot示例)或验证预期参数。 |
return_direct | boolean | 仅对Agent相关。当为True时,在调用给定工具后,Agent将停止并将结果直接返回给用户。 |
4.3 @tool装饰器实现
定义了一个名为add_number的工具函数,用于执行两个整数相加操作。主要功能包括:
- 使用Pydantic定义参数模型FieldInfo,指定两个整数参数a和b
- 通过@tool装饰器将函数注册为LangChain工具,绑定参数schema
- 打印工具的元信息(名称、参数、描述等)
- 调用工具执行加法运算并输出结果
@tool装饰器实现
调用工具执行加法运算,执行结果如下
4.4 StructuredTool实现
StructuredTool.from_function 类方法提供了比@tool 装饰器更多的可配置性,而无需太多额外的代码
StructuredTool实现
执行结果如下
4.5 调用工具过程使用与分析
大模型会自动分析用户需求,判断是否需要调用指定工具 如果模型认为需要调用工具(如MoveFileTool),返回的 message 会包含
-
content: 通常为空(因为模型选择调用工具,而非生成自然语言回复) -
additional_kwargs: 包含工具调用的详细信息:
调用工具过程使用与分析
5. 项目实践:天气助手开发
实现了一个天气查询功能。通过调用OpenWeather API获取指定城市的实时天气数据,并将结果以自然语言形式输出。主要步骤包括构建请求、发送HTTP请求、解析JSON响应并格式化为易读的中文描述5.1 获取 API Key
登录https://home.openweathermap.org/api_keys,免费获取API Key,并写入.env文件中,方便后续进行天气查询。获取 API Key
5.2 定义 Tool
新建 tools 文件,内容如下:
5.3 大模型调用 Tool
在 main.py 中引入 tool 与天气助手 API Key,并通过大模型调用 tool
执行完整链路,查询上海天气并打印结果

