从零构建AI-Agent-LangGraph篇

从零构建 AI Agent:LangGraph 篇

前言

在上一篇文章《从零构建 AI Agent:LangChain 篇》中,我们学习了如何使用 LangChain 构建一个基础的 AI Agent。今天,我们将深入探索 LangGraph —— LangChain 团队推出的新一代 Agent 框架,它提供了更强大的状态管理和流程控制能力。

一、LangGraph 是什么?

1.1 核心概念

LangGraph 是一个用于构建有状态、多角色 AI 应用的库。它基于**图(Graph)**结构来编排 Agent 的工作流程,相比 LangChain 的链式结构,LangGraph 提供了:
在这里插入图片描述
LangGraph 工作流程图展示了 Agent 的核心执行流程:START → Agent → Router(条件路由)→ Tools 或 END,支持循环执行和状态管理。

  • 循环执行:支持 Agent 的迭代推理
  • 状态管理:自动维护和传递状态
  • 分支控制:支持条件分支和并行执行
  • 可视化:自动生成工作流图
  • 持久化:支持检查点和恢复

1.2 与 LangChain 的区别

特性 LangChain LangGraph
执行模式 链式(线性) 图式(循环、分支)
状态管理 手动传递 自动管理
复杂度 简单任务 复杂工作流
可视化 自动生成
学习曲线 中等

1.3 适用场景

LangChain 适合:
├── 简单的问答机器人
├── 单次调用的工具使用
└── 固定流程的 RAG 应用

LangGraph 适合:
├── 多轮对话 Agent
├── 复杂决策流程
├── 多 Agent 协作
└── 需要状态持久化的应用

二、环境准备

2.1 安装依赖

# 创建项目目录
mkdir langgraph-agent
cd langgraph-agent

# 创建虚拟环境
python -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate

# 安装依赖
pip install langgraph langchain-openai python-dotenv

2.2 配置 API Key

# 创建 .env 文件
cat > .env << EOF
OPENAI_API_KEY=your-openai-api-key
EOF

三、第一个 LangGraph Agent

3.1 基础结构

# agent.py
from typing import TypedDict, Annotated
from langgraph.graph import StateGraph, END
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, AIMessage
import operator

# 1. 定义状态
class AgentState(TypedDict):
    messages: Annotated[list, operator.add]

# 2. 初始化模型
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)

# 3. 定义节点函数
def chatbot(state: AgentState) -> AgentState:
    """聊天机器人节点"""
    response = llm.invoke(state["messages"])
    return {
   
   "messages": [response]}

# 4. 构建图
workflow = StateGraph(AgentState)

# 添加节点
workflow.add_node("chatbot", chatbot)

# 设置入口点
workflow.set_entry_point("chatbot")

# 添加边(指向结束)
workflow.add_edge("chatbot", END)

# 5. 编译图
app = workflow.compile()

# 6. 运行
result = app.invoke({
   
   
    "messages": [HumanMessage(content="你好,介绍一下你自己")]
})

print(result["messages"][-1].content)

3.2 运行结果

你好!我是一个 AI 助手,由 OpenAI 开发。我可以帮助你回答问题、
编写代码、解释概念等。有什么我可以帮助你的吗?

四、添加工具调用

4.1 定义工具

from langchain_core.tools import tool
import datetime

@tool
def get_current_time() -> str:
    """获取当前时间"""
    return datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")

@tool
def calculate(expression: str) -> str:
    """计算数学表达式
    
    Args:
        expression: 数学表达式,如 "2 + 3 * 4"
    """
    try:
        result = eval(expression)
        return f"计算结果: {
     
     result}"
    except Exception as e:
        return f"计算错误: {
     
     str(e)}"

@tool  
def search_weather(city: str) -> str:
    """查询城市天气(模拟)
    
    Args:
        city: 城市名称
    """
    # 模拟天气数据
    weather_data = {
   
   
        "北京": "晴天,温度 15°C",
        "上海": "多云,温度 18°C",
        "深圳": "小雨,温度 22°C",
    }
    return weather_data.get(city, f"未找到 {
     
     city} 的天气信息")

# 工具列表
tools = [get_current_time, calculate, search_weather]

4.2 构建 Tool Agent

from langgraph.prebuilt import ToolNode

# 1. 定义状态
class AgentState(TypedDict):
    messages: Annotated[list, operator.add]

# 2. 绑定工具到模型
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
llm_with_tools = llm.bind_tools(tools)

# 3. 定义 Agent 节点
def agent(state: AgentState) -> AgentState:
    """Agent 决策节点"""
    response = llm_with_tools.invoke(state["messages"])
    return {
   
   "messages": [response]}

# 4. 定义路由函数
def should_continue(state: AgentState) -> str:
    """判断是否需要调用工具"""
    last_message = state["messages"][-1]
    if hasattr(last_message, "tool_calls") and last_message.tool_calls:
        return "tools"
    return END

# 5. 构建图
workflow = StateGraph(AgentState
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值