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

31 阅读4分钟

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

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

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


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

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

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

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 数据库企业数据检索

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

from langchain_community.tools import DuckDuckGoSearchRun

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

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

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

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

代码示例:

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 来构建一个智能助手。

完整代码示例:

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 应用将不再是一个只会聊天的“大脑”,而是一个能真正解决复杂问题的“智能体”。