🛠️ LangChain Tools 实战指南:让 AI 拥有“动手能力”

🛠️ LangChain Tools 实战指南:让 AI 拥有"动手能力"

LangChain 的核心魅力在于它能赋予大语言模型(LLM)"手脚"。通过 Tools(工具),我们可以让 AI 不再局限于文本生成,而是能够执行搜索、计算、查询数据库甚至编写代码。

本文将带你从零开始,掌握 LangChain Tools 的定义、使用以及如何在 Agent 中调用它们。


1. 自定义工具:赋予 AI 专属技能

虽然 LangChain 提供了许多内置工具,但在实际业务中,我们往往需要自定义工具。最推荐的方式是使用 @tool 装饰器,它简洁且功能强大。

关键点: 工具的 docstring(文档字符串)至关重要,因为 LLM 是依靠它来理解工具功能的。

python 复制代码
from langchain_core.tools import tool

@tool
def get_weather(city: str) -> str:
    """获取指定城市的当前天气。
    
    参数:
        city: 城市名称,例如 '北京', '上海'。
    """
    # 模拟数据,实际场景中可替换为 API 调用
    weather_data = {
        "北京": "晴天,25°C,湿度 40%",
        "上海": "多云,28°C,湿度 65%",
        "广州": "小雨,30°C,湿度 85%",
    }
    return weather_data.get(city, f"{city} 暂无天气数据")

@tool
def calculate(expression: str) -> str:
    """计算数学表达式。
    
    参数:
        expression: 数学算式字符串,例如 '2+3*4'。
    """
    try:
        return f"{expression} = {eval(expression)}"
    except Exception as e:
        return f"计算出错: {e}"

注意: 如果你需要更严格的参数校验(例如确保输入是整数),可以结合 PydanticBaseModel 来定义 args_schema


2. 使用内置工具:站在巨人的肩膀上

LangChain 社区维护了丰富的内置工具库,涵盖了搜索、文件系统、代码执行等领域。

常用内置工具一览:

工具名称 功能描述 适用场景
DuckDuckGoSearchRun 免费网络搜索 查询实时新闻、通用知识
PythonREPLTool 执行 Python 代码 数据分析、数学计算
WikipediaQueryRun 维基百科查询 查询百科知识
SQLDatabaseTool 查询 SQL 数据库 企业数据检索

代码示例:使用网络搜索工具

python 复制代码
from langchain_community.tools import DuckDuckGoSearchRun

# 初始化搜索工具
search = DuckDuckGoSearchRun()

# 直接调用
result = search.invoke("LangChain 最新版本发布特性")
print(result)

3. 进阶:在工具中实现实时流输出

对于耗时的操作(如大数据分析或长文本生成),用户往往希望看到进度反馈。LangChain 的 ToolRuntime 允许我们在工具执行过程中发送实时更新。

代码示例:

python 复制代码
from langchain.tools import tool, ToolRuntime

@tool
def analyze_data(query: str, runtime: ToolRuntime) -> str:
    """模拟一个耗时的数据分析工具"""
    writer = runtime.stream_writer
    
    # 发送进度更新
    writer(f"正在连接数据库查询: {query}...")
    # 模拟耗时操作
    import time
    time.sleep(1) 
    writer("数据获取成功,正在分析...")
    
    return f"关于 {query} 的分析结果:数据趋势良好。"

注意: runtime.stream_writer 必须在 LangGraph 的执行上下文中调用才会生效。


4. 核心实战:构建 Agent 自动调用工具

定义好工具后,我们需要一个"大脑"来决定何时使用它们。这就是 Agent 的作用。Agent 会根据用户的输入,自动判断是否需要调用工具、调用哪个工具,并处理返回结果。

我们将使用 create_tool_calling_agent 来构建一个智能助手。

完整代码示例:

python 复制代码
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.agents import create_tool_calling_agent, AgentExecutor

# 1. 初始化 LLM (这里以 OpenAI 为例,也可替换为 ChatGLM, Kimi 等)
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)

# 2. 准备工具列表
tools = [get_weather, calculate]

# 3. 定义 Agent 的提示词模板
# MessagesPlaceholder 用于存储 Agent 的思考过程(Thought-Action-Observation)
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个乐于助人的助手,请尽可能准确地使用工具回答问题。"),
    ("human", "{input}"),
    MessagesPlaceholder(variable_name="agent_scratchpad"),
])

# 4. 创建 Agent
agent = create_tool_calling_agent(llm, tools, prompt)

# 5. 创建执行器
agent_executor = AgentExecutor(
    agent=agent, 
    tools=tools, 
    verbose=True,  # 开启详细日志,方便调试看它是怎么思考的
    max_iterations=5 # 防止死循环
)

# 6. 测试运行
response = agent_executor.invoke({
    "input": "北京今天天气怎么样?另外帮我算一下 15 * 23 + 7 等于多少?"
})

print("最终回答:", response["output"])

运行结果预期: Agent 会先调用 get_weather 查询北京天气,再调用 calculate 计算数学题,最后将两者的结果整合成一句通顺的话回复给你。


5. 生产环境最佳实践

在实际落地 LangChain Tools 时,还需要注意以下几点:

  1. 错误处理: 工具执行可能会失败(如网络超时、API 报错)。在 AgentExecutor 中可以配置 handle_tool_errors,或者在工具函数内部使用 try-except 块来捕获异常,避免整个应用崩溃。
  2. 安全性: 如果使用了 PythonREPLTool 这种可以执行代码的工具,务必注意沙箱隔离,防止恶意代码执行。
  3. 持久化: 如果工具涉及状态存储(如记忆用户偏好),建议使用持久化存储(如 Redis 或 Postgres),而不是仅保存在内存中,以免服务重启后数据丢失。

通过掌握 Tools,你的 LLM 应用将不再是一个只会聊天的"大脑",而是一个能真正解决复杂问题的"智能体"。

相关推荐
JJJennie7772 小时前
当AI开始学会欺骗
网络·人工智能
糖果店的幽灵2 小时前
大模型测评DeepEval快速入门-安全与通用指标详解
人工智能·安全·langgraph·大模型测评·deepeval
江畔柳前堤8 小时前
roLabelImg 详细安装教程
开发语言·人工智能·后端·云原生
阿里云大数据AI技术8 小时前
分链路差异化设计的DSP准实时数仓|钛动科技基于阿里云实时计算 Flink 版 + DLF Paimon + EMR Serverless StarRocks 的实践
人工智能·flink
陕西企来客8 小时前
2026年7月AI智能搜索曝光趋势研判
大数据·人工智能·机器学习·ai智能搜索曝光
阿里云大数据AI技术9 小时前
从算力到智能体,面向 Agentic AI 的基础设施演进
人工智能·agent
hangyuekejiGEO9 小时前
GEO技术服务选型指南
大数据·人工智能·python
阿里云大数据AI技术9 小时前
EMR Serverless Spark AI Function 的双维降本实践
人工智能·sql·spark
维基框架10 小时前
GitHub源码处理提速 一趟扫描反而更慢
人工智能·github
冬奇Lab10 小时前
代码库知识库系列(05):向量检索 vs 知识图谱——加了调用图并没有变更好
人工智能