在 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.agentslangchain_experimental中的 Agent,你可以让 LLM 自主决定调用你定义的工具。

简单流程:
  1. 定义多个 Tools(比如搜索、计算、调用 API)

  2. 把这些 Tools 组合成一个列表提供给 Agent

  3. 用户提问,Agent 分析问题并决定调用哪个 Tool

  4. 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 的使用,可以探索以下内容:

  1. LangChain 官方文档 - Tools 部分

  2. LangChain 工具包(Toolkits)​

    • 比如 langchain_community.tools提供了很多现成的工具

    • 包括:搜索、API、数据库、文件操作等

  3. 结合 Agent 使用 Tool

    • 学习如何构建 ReAct Agent、OpenAI Function Calling、多 Tool 协作等

  4. 自定义复杂 Tool

    • 比如调用公司内部 API、数据库、执行脚本等

Logo

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

更多推荐