分享:【AI智能体】Langchain 工具调用实战操作详解

最近在折腾项目的时候碰到了这个知识点,查了不少资料,索性整理出来分享给大家。

目录

一、前言

二、Tools 工具介绍

2.1 Tools 是什么

2.1.1 Tool 组成结构

2.1.2 Tool 的重要性

2.2 Tools 有什么作用

2.3 Tool 的特点

2.4 Tool 使用场景

三、工具的调用方式

3.1 工具的两种调用

3.1.1 直接调用

3.1.2 绑定到模型(主流)调用

3.1.3 工具调用完整流程

3.2 从Message流转看工具的调用

3.3 工具描述的各部分参数详解

3.3.1 convert_to_openai_to

3.3.2 description 说明

3.3.3 参数说明

3.3.4 参数类型说明

3.3.5 参数默认值

3.4 使用@tool装饰器定义工具

3.4.1 自定义工具描述:description

3.4.2 添加工具描述:description

3.4.3 更改工具名称

3.5 自定义args_schema

3.5.1 pydantic类型的定义

3.5.2 限定参数取值范围

3.6 使用Json Schema定义

四、写在最后


一、前言

在使用Langchain 进行智能体开发中,会涉及到一个挺重要的组件调用,就是工具(Tool),工具作为AI应用与大模型的中间层,承载着挺重要的角色,能够说搞清楚了Tool在其中的作用,对AI智能体调用的完整过程就有了一个深刻全面的搞懂,本篇将详细介绍下Langchain 中的工具使用。

二、Tools 工具介绍

2.1 Tools 是什么

LangChain 工具(Tool)是赋予大模型调用外部能力的标准化接口。

大模型本身只能生成文本,无法主动联网、查数据库、执行代码。工具就是把这些外部能力封装成 LLM 能搞懂、能调用的函数,让模型从“只会说”变成“能动手做”。

2.1.1 Tool 组成结构

一个工具通常包含三部分:

  • 名称(name):唯一标识
  • 描述(description):LLM 据此判断何时调用,最关键
  • 功能(function):实际执行的代码逻辑
工具包(Toolkit)则是一组相关工具的集合,比如 SQLDatabaseToolkit 把列表、查结构、执行查询等工具打包在一起。

2.1.2 Tool 的重要性

要构建更强大的AI工程应用,只有生成文本这样的“ 纸上谈兵 ”能力自然是不够的。

工具是赋予大语言模型 与外部世界交互能力 的关键组件,从而能让智能体执行搜索、计算、数据库查询、邮件发送或调用第三方API等,进而构建功能强大的AI应用。借助工具,大模型才能从“ 认识世界 ”走向“ 改变世界 ”。

从图中能够看到,工具是构建智能体的核心要素之一,具有挺重要的地位

2.2 Tools 有什么作用

Tool的核心作用是扩展大模型的能力边界,具体包括:

1. 突破知识时效性:通过搜索工具获取实时信息,弥补训练数据截止的局限。
2. 突破能力限制:通过计算器、代码执行工具完成精确计算和复杂逻辑。
3. 连接私有数据:通过数据库、文件系统工具访问企业或个人私有数据。
4. 对接外部系统:通过 API 工具调用第三方服务,完成真实业务操作。
5. 让 Agent 自主决策:工具是 Agent 的“手脚”,Agent 根据任务自主选择并调用合适的工具。

2.3 Tool 的特点

Tool 主要有如下特点:

1. 描述驱动:LLM 完全依赖工具的 description 来决定是否调用、如何调用,描述写得越清楚,调用越准确。
2. 标准化接口:所有工具都遵循统一调用方式(如 .invoke()),便于组合和替换。
3. 可自定义:用 @tool 装饰器就能把普通 Python 函数变成工具,扩展成本低。
4. 可组合:多个工具可同时给出给 Agent,由 Agent 按需调度。
5. 安全可控:工具的执行逻辑由开发者定义,能够对输入输出做校验和限制。

2.4 Tool 使用场景

场景

典型工具

解决的坑

实时信息查询

DuckDuckGo、SerpAPI

获取最新新闻、股价、天气

知识问答

WikipediaQueryRun

补充百科类知识

数据分析/计算

PythonREPLTool

精确计算、数据处理

数据库交互

SQLDatabaseToolkit

自然语言查数据库

文件操作

FileManagementToolkit

读写、管理本地文件

业务系统对接

OpenAPIToolkit

按规范调用 REST API

多工具协作

Agent + 多工具

复杂任务自动拆解执行

一句话总结:

LangChain 工具是让大模型“能做事”的桥梁,通过标准化封装和描述驱动机制,使 LLM 能自主调用外部能力,适用于一切要模型与真实世界交互的场景。

三、工具的调用方式

在LangChain中,工具(Tools)实际上是指明确定义了输入和输出的 可调用函数 。因此, 工具调用(Tool Calling) 也被称为 函数调用(Function Calling) 。具体来说主要有2种调用方式,下面分别介绍。

3.1 工具的两种调用

3.1.1 直接调用

直接调用这种方式,适合测试时使用,下面是一个基础的工具调用案例代码

from langchain_core.tools import Tool, tool

@tool
def get_weather(city: str) -> str:
    """
    获取指定城市的天气信息

    参数:
        city: 城市名称,如"北京"、"上海"

    返回:
        天气信息字符串
    """
    # 你的实现
    return city + "晴天,温度 15°C"

# 使用 .invoke() 方法
result = get_weather.invoke({"city": "北京"})
print(result)

运行一下效果如下

3.1.2 绑定到模型(主流)调用

这种方式,让AI来调用,开发中使用最多的方式

from dotenv import load_dotenv
import os

from langchain_openrouter import ChatOpenRouter

# 1、加载配置文件
load_dotenv(override=True)

OPENROUTER_API_KEY = os.getenv ("OPENROUTER_API_KEY")
OPENROUTER_API_BASE = os.getenv ("OPENROUTER_API_BASE")

# 2、模型初始化
model = ChatOpenRouter(
    model="deepseek/deepseek-v3.2",
    api_key=OPENROUTER_API_KEY,
    base_url=OPENROUTER_API_BASE,
)

from langchain_core.tools import tool

# 定义工具
@tool
def get_weather(city: str) -> str:
    """获取指定城市的天气"""
    # 你的实现
    return "晴天,温度 15°C"

# 绑定工具
model_with_tools = model.bind_tools([get_weather])

# AI 可以决定是否调用工具
response = model_with_tools.invoke("北京天气如何?")

# response = model_with_tools.invoke("2 + 3 = ?")
# 检查 AI 是否要调用工具
if response.tool_calls:
    print("AI 想调用工具:", response.tool_calls)
else:
    print("AI 直接回答:", response.content)

调用一下,看到下面的效果,在真实的业务场景下,可能会在tool的方法内部对接外部厂商的API ,以获取天气为例,就可以拿到真实的天气信息数据

3.1.3 工具调用完整流程

大模型能根据对话上下文决定何时调用工具以及传递哪些参数。

上面编写的LangChain应用正好对应图中的AI助手或应用

经典流程如下:

3.2 从Message流转看工具的调用

接下来深入了解一下工具内部在代码中是怎么调用的,前提:代码中配置模型初始化

from dotenv import load_dotenv
from langchain.messages import HumanMessage, ToolMessage
import os

from langchain_openrouter import ChatOpenRouter

# 1、加载配置文件
load_dotenv(override=True)

OPENROUTER_API_KEY = os.getenv ("OPENROUTER_API_KEY")
OPENROUTER_API_BASE = os.getenv ("OPENROUTER_API_BASE")

# 2、模型初始化
model = ChatOpenRouter(
    model="deepseek/deepseek-v3.2",
    api_key=OPENROUTER_API_KEY,
    base_url=OPENROUTER_API_BASE,
)

1、不使用@tool修饰

通过定义普通的方法形式使用,完整代码如下

```
from dotenv import load_dotenv
from langchain.messages import HumanMessage, ToolMessage
import os

from langchain_openrouter import ChatOpenRouter

1、加载配置文件

load_dotenv(override=True)

OPENROUTER_API_KEY = os.getenv ("OPENROUTER_API_KEY")
OPENROUTER_API_BASE = os.getenv ("OPENROUTER_API_BASE")

2、模型初始化

model = ChatOpenRouter( model="deepseek/deepseek-v3.2", api_key=OPENROUTER_API_KEY, base_url=OPENROUTER_API_BASE, )

from langchain_core.tools import tool

def get_weather(city: str):
"""获取天气的工具"""
return f"{city}天气晴朗"

模型与工具绑定

model_with_tools = model.bind_tools([get_weather])

messages = [
HumanMessage("今天北京天气如何")
]

模型生成调用工具请求

response = model_with_tools.invoke(messages)

添加AIMessage

messages.append(response) tool_calls = response.tool_calls

for tool_call in tool_calls:
if tool_call["name"] == "get_weather":
# 拼接出ToolMessage实例
tool_response = ToolMessage(
content=get_weather(**tool_call["args"]),
tool_call_id=tool_call["id"],
name=tool_call["name"]
)
messages.append(tool_response)

print("=====================> messages messages messages messages


本次分享就到这里。技术这东西越研究越有意思,后续有新的收获我也会继续更新。

评论 (0)

暂无评论