大模型调用工具一:使用LangChain Core Tool
在 LangChain Core 中,Tool(工具) 是一个非常重要的概念,它允许大语言模型(LLM)与外部系统或功能进行交互,比如调用 API、执行代码、查询数据库、搜索网页等。通过定义和使用 Tool,你可以扩展 LLM 的能力,让它不仅仅局限于文本生成,而是能够“做事”。
一、什么是 Tool?
在 LangChain 中,Tool 代表一个具有明确名称和输入参数的外部功能或接口,LangChain 可以让 LLM 理解什么时候该调用哪个 Tool,以及如何调用它。
简单来说:
-
Tool = 一个有名字的功能 + 输入参数 + 执行逻辑
-
LLM 可以决定何时调用哪个 Tool,并传入合适的参数
-
LangChain 提供了标准化的 Tool 接口,也支持自定义 Tool
二、为什么使用 Tool?
大语言模型本身知识丰富,但无法直接访问外部实时数据或执行操作(比如查天气、订机票、调用 API)。通过 Tool:
-
让 LLM 能够“使用工具完成任务”,比如调用搜索引擎、API、数据库等
-
实现所谓的 "Agent"(智能体),即让 LLM 像人一样思考并决定何时使用什么工具
-
提高应用的实际能力与落地价值
三、LangChain Core 中的 Tool 使用方法
LangChain Core 提供了一个标准的 Tool类,你可以基于它来定义自己的工具,或者使用 LangChain 提供的现成工具(如搜索工具、API 工具等)。
1. 标准 Tool 接口
LangChain 中定义 Tool 的核心是实现一个符合 Tool 协议的对象,通常最简单的就是继承或使用 langchain_core.tools.Tool类(或函数式方式)。
基本结构:
一个 Tool 通常包括:
-
name: 工具名称,LLM 通过名称调用它
-
description: 工具的描述,用于让 LLM 理解这个工具是干什么的,什么时候该用
-
func: 实际执行功能的函数,接收输入参数并返回结果
2. 定义一个简单的自定义 Tool
下面是一个非常基础的例子,展示如何定义并使用一个自定义 Tool:
示例:定义一个获取当前时间的 Tool
from langchain_core.tools import Tool
from datetime import datetime
# 定义一个获取当前时间的函数
def get_current_time(**kwargs):
return f"当前时间是:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
# 创建一个 Tool 对象
time_tool = Tool(
name="get_current_time",
description="获取当前的系统时间,返回格式为 YYYY-MM-DD HH:MM:SS",
func=get_current_time,
)
# 调用 Tool
result = time_tool.invoke({"input": ""}) # 通常参数通过 input 传入
print(result)
输出示例:
当前时间是:2025-10-15 20:55:18
⚠️ 注意:虽然我们传入了空 input,但 description 会告诉 LLM 这个工具不需要额外参数。
3. 使用 Tool 的常见场景:与 Agent 配合
在实际使用中,你很少直接调用 Tool,而是将它提供给一个 Agent(智能体),让 Agent 来判断何时使用哪些 Tools。
例如,结合 langchain.agents或 langchain_experimental中的 Agent,你可以让 LLM 自主决定调用你定义的工具。
简单流程:
-
定义多个 Tools(比如搜索、计算、调用 API)
-
把这些 Tools 组合成一个列表提供给 Agent
-
用户提问,Agent 分析问题并决定调用哪个 Tool
-
Tool 执行后,将结果返回给 LLM,继续处理
4. 使用现成的 Tool(如搜索、API 调用等)
LangChain 生态中提供了很多现成的 Tools,比如:
-
搜索引擎工具(如 DuckDuckGoSearchRun)
-
Python REPL 工具(在沙盒中运行代码)
-
API 请求工具
-
数据库查询工具
举个例子,使用内置的搜索工具:
from langchain_community.tools import DuckDuckGoSearchRun
# 创建一个搜索工具
search = DuckDuckGoSearchRun()
# 调用搜索工具
result = search.invoke("今天的科技新闻")
print(result)
这会返回 DuckDuckGo 搜索“今天的科技新闻”的结果。
四、Tool 的关键组成部分总结
|
组件 |
说明 |
|---|---|
|
name |
工具的唯一标识符,LLM 通过名字调用 |
|
description |
工具用途的自然语言描述,指导 LLM 何时使用 |
|
func |
实际执行逻辑的函数,接受输入并返回输出 |
|
parameters(可选/高级) |
更规范地定义输入参数(类型、是否必填等),推荐使用 Pydantic 模型 |
五、更规范的 Tool 定义(使用 Parameters)
为了让 LLM 更好地理解 Tool 的输入参数,推荐使用 Pydantic 模型 明确指定输入参数的结构,这样 LangChain 可以生成更准确的工具调用。
示例:带参数的 Tool
from langchain_core.tools import Tool
from pydantic import BaseModel, Field
from typing import Optional
# 定义输入参数的结构
class GetUserInput(BaseModel):
user_id: int = Field(..., description="用户的唯一ID")
# 工具函数
def get_user_info(user_id: int) -> str:
# 模拟查询用户信息
return f"用户 {user_id} 的信息:这是一个模拟的用户数据。"
# 创建 Tool
user_tool = Tool(
name="get_user_info",
description="根据用户ID获取用户信息",
func=get_user_info,
args_schema=GetUserInput, # 指定参数模型
)
# 调用(通常由 Agent 调用,这里手动模拟)
input_data = {"user_id": 123}
result = user_tool.invoke(input_data)
print(result)
输出:
用户 123 的信息:这是一个模拟的用户数据。
🔍 说明:
-
使用 Pydantic 模型可以明确定义参数的类型和含义
-
LLM 可以基于 description 和参数 schema 更准确地生成调用
六、总结:LangChain Core Tool 的核心要点
|
要点 |
说明 |
|---|---|
|
✅ Tool 是 LLM 与外部世界交互的桥梁 |
如调用 API、搜索、执行代码等 |
|
✅ 每个 Tool 包括 name、description、func |
核心三要素 |
|
✅ 可以自定义 Tool,也可以使用现成的 |
比如搜索、数据库、代码执行等 |
|
✅ 通常与 Agent 配合使用,让 LLM 自主调用 Tool |
构建智能、自主的应用 |
|
✅ 推荐使用 Pydantic 模型定义参数 |
提升工具的可用性与 LLM 的理解度 |
七、进一步学习建议
如果你想深入学习 Tool 的使用,可以探索以下内容:
-
LangChain 官方文档 - Tools 部分
-
LangChain 工具包(Toolkits)
-
比如
langchain_community.tools提供了很多现成的工具 -
包括:搜索、API、数据库、文件操作等
-
-
结合 Agent 使用 Tool
-
学习如何构建 ReAct Agent、OpenAI Function Calling、多 Tool 协作等
-
-
自定义复杂 Tool
-
比如调用公司内部 API、数据库、执行脚本等
-
更多推荐

所有评论(0)