🛠️ 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}"
注意: 如果你需要更严格的参数校验(例如确保输入是整数),可以结合
Pydantic的BaseModel来定义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 时,还需要注意以下几点:
- 错误处理: 工具执行可能会失败(如网络超时、API 报错)。在
AgentExecutor中可以配置handle_tool_errors,或者在工具函数内部使用try-except块来捕获异常,避免整个应用崩溃。 - 安全性: 如果使用了
PythonREPLTool这种可以执行代码的工具,务必注意沙箱隔离,防止恶意代码执行。 - 持久化: 如果工具涉及状态存储(如记忆用户偏好),建议使用持久化存储(如 Redis 或 Postgres),而不是仅保存在内存中,以免服务重启后数据丢失。
通过掌握 Tools,你的 LLM 应用将不再是一个只会聊天的"大脑",而是一个能真正解决复杂问题的"智能体"。