LangGraph 封神实战 6:Agent 智能体模式,让 AI 像人类一样 "使用工具"!

作者:WangQiaomei版本:1.0(2026/3/16)

核心亮点:AI 自主分析问题→选择工具→执行操作→输出结果,告别 "只会嘴说不会动手" 的尴尬!

🔥前言:为什么 Agent 模式是 AI 的未来?

你是否遇到过:

  • AI 能看懂数学题,但算不对复杂运算?
  • AI 知道要查天气,却不会调用天气 API?
  • AI 想分析数据,却不会用 Excel / 数据库工具?

LangGraph Agent 模式 完美解决这个问题:✅ 让 AI 拥有 "动手能力",自主选择并调用工具完成任务✅ 支持多轮工具调用(比如先加法→再乘法)✅ 通用架构,换工具就能适配天气、股票、翻译等场景

本文以 "AI 自主计算数学题" 为例,手把手教你搭建能 "使用工具" 的智能体!


🎯核心工作流:AI 如何自主使用工具?

预览

查看代码

用户输入:(3 + 5) × 12 = ?

回到AI节点确认结果

需要工具吗?

执行add(3,5)=8 → multiply(8,12)=96

输出最终答案:96

flowchart TD
    A["用户输入:(3 + 5) × 12 = ?"] --> B["llm_call(AI思考节点)"]
    B["分析问题,决定调用add+multiply工具"] --> C{需要工具吗?}
    C -->|✅ 是| D["tool_executor(工具执行节点)"]
    D["执行add(3,5)=8 → multiply(8,12)=96"] --> B["回到AI节点确认结果"]
    C -->|❌ 否| E["输出最终答案:96"]

用户输入:(3 + 5) × 12 = ?

回到AI节点确认结果

需要工具吗?

执行add(3,5)=8 → multiply(8,12)=96

输出最终答案:96

工作流炸裂亮点

  • 自主决策:AI 自己判断该用什么工具,无需人工指令
  • 闭环迭代:工具执行完自动返回 AI 验证,确保结果正确
  • 无限扩展:加减乘除只是开始,API / 数据库 / 爬虫都能接!

🛠️完整可运行代码(直接复制即用)

python

运行

# -*- coding: utf-8 -*-
"""
作者:WangQiaomei

版本:1.0(2026/3/18)
"""

# ==================== 1. 定义AI可用的工具(核心!) ====================
# @tool装饰器:把普通函数变成AI能看懂、能调用的工具
@tool
def multiply(a: int, b: int) -> int:
    """Multiply `a` and `b`. (AI靠这个描述理解工具用途)

    Args:
        a: First int
        b: Second int
    """
    return a * b

@tool
def add(a: int, b: int) -> int:
    """Adds `a` and `b`.

    Args:
        a: First int
        b: Second int
    """
    return a + b

@tool
def divide(a: int, b: int) -> float:
    """Divide `a` and `b`.

    Args:
        a: First int
        b: Second int
    """
    return a / b

# 把工具绑定到LLM,让AI知道"我有这些工具可用"
tools = [add, multiply, divide]
tools_by_name = {tool.name: tool for tool in tools}
llm_with_tools = llm.bind_tools(tools)  # 关键一步!

# ==================== 2. 定义全局状态 ====================
class State(TypedDict):
    # 消息列表自动累加,支撑多轮工具调用
    messages: Annotated[list, operator.add]

# ==================== 3. 核心节点函数 ====================
def llm_call(state: State):
    """AI思考节点:分析问题,决定调用哪个工具"""
    response = llm_with_tools.invoke(state["messages"])
    return {"messages": [response]}

def tool_executor(state: State):
    """工具执行节点:执行AI指定的工具调用"""
    last_message = state["messages"][-1]
    results = []
    
    # 遍历AI要求调用的所有工具
    for tool_call in last_message.tool_calls:
        tool_name = tool_call["name"]
        tool_args = tool_call["args"]
        
        # 找到工具并执行
        tool_fn = tools_by_name[tool_name]
        result = tool_fn.invoke(tool_args)
        
        # 封装工具执行结果,让AI能识别
        results.append(ToolMessage(
            content=str(result),
            tool_call_id=tool_call["id"]
        ))
    
    return {"messages": results}

# ==================== 4. 条件路由:控制流程走向 ====================
def should_continue(state: State):
    """判断是否需要继续调用工具"""
    last_message = state["messages"][-1]
    # 没有工具调用请求 → 结束流程
    if not last_message.tool_calls:
        return "end"
    # 有工具调用请求 → 执行工具
    return "continue"

# ==================== 5. 构建Agent工作流 ====================
agent_builder = StateGraph(State)

# 添加核心节点
agent_builder.add_node("llm_call", llm_call)           # AI思考
agent_builder.add_node("tool_executor", tool_executor) # 工具执行

# 配置流程走向
agent_builder.add_edge(START, "llm_call")              # 开始 → AI思考
agent_builder.add_conditional_edges(
    "llm_call",
    should_continue,
    {
        "continue": "tool_executor",  # 需要工具 → 执行工具
        "end": END                     # 无需工具 → 结束
    }
)
agent_builder.add_edge("tool_executor", "llm_call")    # 工具执行完 → 回到AI

# 编译工作流
agent = agent_builder.compile()

# 可视化工作流(可选,需要网络)
try:
    display(Image(agent.get_graph().draw_mermaid_png()))
except Exception as e:
    print(f"可视化失败(不影响运行):{e}")

# ==================== 6. 运行测试 ====================
if __name__ == "__main__":
    # 测试题:让AI自主计算 (3 + 5) × 12
    question = "What is (3 + 5) * 12?"
    
    # 执行Agent
    result = agent.invoke({"messages": [HumanMessage(content=question)]})
    
    # 输出结果
    print(f"💡 问题:{question}")
    print(f"🎉 答案:{result['messages'][-1].content}")

🔑核心知识点拆解(新手也能懂)

1. @tool 装饰器:AI 工具的 "身份证"

python

运行

@tool
def add(a: int, b: int) -> int:
    """Adds `a` and `b`.(AI靠这个注释理解工具用途)"""
    return a + b
  • ✨ 作用:把普通 Python 函数标记为 AI 可调用工具
  • ✨ 关键:函数注释必须清晰,AI 靠这个判断该什么时候用这个工具

2. llm.bind_tools (tools):给 AI"装备库"

python

运行

llm_with_tools = llm.bind_tools(tools)
  • ✨ 核心:告诉 AI"你现在有加法、乘法、除法这三个工具可用"
  • ✨ 效果:AI 思考时会自动判断该调用哪个工具,无需你手动指定

3. 条件路由:Agent 的 "决策大脑"

python

运行

def should_continue(state: State):
    if not last_message.tool_calls:
        return "end"  # 没工具要调用 → 结束
    return "continue" # 有工具要调用 → 执行
  • ✨ 作用:实现 Agent 的闭环迭代,直到任务完成
  • ✨ 场景扩展:可自定义迭代次数限制,避免无限循环

📌运行效果展示

plaintext

💡 问题:What is (3 + 5) * 12?
🎉 答案:The result of $(3 + 5) \times 12$ is **96**.
  • AI 会先调用add(3,5)得到 8,再调用multiply(8,12)得到 96
  • 最终返回格式化的答案,全程无需人工干预!

💡超实用扩展场景(看完就能改)

表格

场景 改造思路
📅 天气查询 把工具换成「调用天气 API」,让 AI 自主查指定城市天气
📈 股票分析 把工具换成「获取股票数据」,让 AI 自主分析涨跌
📝 翻译工具 把工具换成「调用翻译 API」,让 AI 自主翻译多语言
🧰 爬虫工具 把工具换成「网页爬虫」,让 AI 自主爬取指定内容

🚩避坑指南(新手必看)

  1. API Key 替换:一定要把代码中的你自己的API_KEY换成阿里云百炼的真实 Key
  2. 工具注释清晰:AI 靠注释理解工具用途,注释写得越清楚,工具调用越准确
  3. 参数类型匹配:工具函数的参数类型(如 int/float)要和 AI 传入的参数一致
  4. 迭代次数限制:复杂场景建议添加max_iterations,避免 Agent 无限循环调用工具

🎯总结

Agent 模式是 LangGraph 最具颠覆性的玩法,核心价值在于:

  1. 让 AI 从 "语言模型" 升级为 "智能体",拥有 "思考 + 行动" 能力;
  2. 工具化架构无限扩展,适配几乎所有实际业务场景;
  3. 闭环迭代确保结果准确,比单纯的 LLM 输出靠谱 10 倍!

下次遇到需要 AI"动手" 的场景,别再手动写逻辑了,直接用 Agent 模式让 AI 自己搞定!💪

想要进阶教程?留言告诉我:✅ 如何添加工具调用次数限制✅ 如何接入第三方 API 工具(如天气 / 股票)✅ 如何给 Agent 添加记忆功能

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐