从 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元。这款衬衫是一款时尚的衬衫,适合追求潮流风格的人士穿着。如果您还有其他问题或需要更多信息,请随时告诉我!
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐