从 1 个工具到多个工具:我的第二个 AI Agent 实战(LangChain)
·
从 1 个工具到多个工具:我的第二个 AI Agent 实战(LangChain)
前言
在上一篇中,我用 LangChain 写了一个最简单的 Agent,实现了:
根据问题调用一个工具(查询天气),但很快我发现一个问题:如果一个问题需要多个工具怎么办?
比如:
- 查询商品价格
- 同时介绍商品
于是我写了这个多工具 Agent Demo
一、完整代码(多工具 Agent)
from langchain.agents import create_agent
from langchain_community.chat_models import ChatTongyi
from langchain_core.tools import tool
@tool(description="查询价格")
def get_price(name: str) -> str:
return f"衬衫{name}的价格是10元"
@tool(description="服装介绍")
def get_introduction(name: str) -> str:
return f"衬衫{name}是一个时尚的衬衫"
agent = create_agent(
model=ChatTongyi(model="qwen3-max"),
tools=[get_price, get_introduction],
system_prompt="你是一个智能助手,能回复顾客有关服装的问题,并且告知我思考的过程。",
)
for chunk in agent.stream(
{
"messages": [
{"role": "user", "content": "衬衫“吖丫”的价格是什么?请介绍一下这个衬衫"},
]
},
stream_mode="values"
):
latest_message = chunk['messages'][-1]
if latest_message.content:
print(type(latest_message).__name__, latest_message.content)
try:
if latest_message.tool_calls:
print(f"工具调用: {[tool['name'] for tool in latest_message.tool_calls] }")
except AttributeError:
pass
二、这个 Agent 做了什么?
用户输入:
衬衫“吖丫”的价格是什么?请介绍一下这个衬衫
Agent 自动完成:
1️⃣ 判断这是两个需求
2️⃣ 同时调用两个工具
3️⃣ 汇总结果并返回
输出:
工具调用: ['get_price', 'get_introduction']
衬衫“吖丫”的价格是10元。这是一款时尚的衬衫...
三、核心升级点(对比第一版)
| 能力 | 第一版 | 当前版本 |
|---|---|---|
| 工具数量 | 1个 | 多个 |
| 调用方式 | 单次 | 可组合 |
| 输出方式 | invoke | stream |
| 能力 | 简单问答 | 复杂任务 |
本质升级: Agent 开始具备“拆解问题 + 多工具协作能力”
四、代码重点解析
1. 定义多个工具
@tool(description="查询价格")
def get_price(name: str) -> str:
@tool(description="服装介绍")
def get_introduction(name: str) -> str:
关键点:
- 每个工具只负责一件事(单一职责)
- 描述越清晰,模型越容易选对工具
2. Agent 如何选择工具?
tools=[get_price, get_introduction]
模型会根据:
- 用户问题
- tool 的 description
来决定调用哪个工具(甚至多个)
3. stream(流式输出)
agent.stream(...)
和 invoke 的区别:
| 方法 | 特点 |
|---|---|
| invoke | 一次性返回 |
| stream | 实时输出(类似 ChatGPT 打字) |
4. 捕获工具调用(非常关键)
if latest_message.tool_calls:
print(...)
这一步可以看到:Agent “在调用什么工具”
这对调试非常重要!
五、Agent 执行流程(重点理解)
整个过程可以拆成:
Step 1:理解问题
“价格 + 商品介绍”
Step 2:匹配工具
找到:
- get_price
- get_introduction
Step 3:执行工具
分别调用:
get_price("吖丫")
get_introduction("吖丫")
Step 4:整合结果
返回最终回答
HumanMessage 衬衫“吖丫”的价格是什么?请介绍一下这个衬衫
工具调用: ['get_price', 'get_introduction']
ToolMessage 衬衫吖丫是一个时尚的衬衫
AIMessage 衬衫“吖丫”的价格是10元。这款衬衫是一款时尚的衬衫,适合追求潮流风格的人士穿着。如果您还有其他问题或需要更多信息,请随时告诉我!
更多推荐

所有评论(0)