构建有灵魂的 AI Agent:LangGraph 深度解析与实战指南
构建有灵魂的 AI Agent:LangGraph 深度解析与实战指南
在 LLM(大语言模型)应用开发的早期,我们习惯于使用 Chain(链) 的概念——即 A 步执行完接 B 步。但随着业务逻辑复杂化,开发者发现现实世界的任务往往是循环往复、需要反复推敲且具备状态机特征的。这便是 LangGraph 应运而生的背景:它将 Agent 的构建从“线性链条”升华为“有向图结构”。
一、 核心技术深度解析与底层原理
1. 什么是 LangGraph?
LangGraph 是由 LangChain 团队推出的一个用于构建有状态、多角色协同、支持循环迭代的 AI 应用库。
- 核心定义:它是一个建立在 LangChain 之上的底层框架,专门用于创建循环图(Cyclic Graphs)。
- 核心价值:传统的 LangChain Expression Language (LCEL) 虽然强大,但在处理“如果结果不满意就跳回上一步重试”这种循环逻辑时非常吃力。LangGraph 赋予了 Agent 这种“回头看”和“自我修正”的能力。
2. 基础模型:图论架构
在 LangGraph 中,一切皆为“图”。一个完整的 Agent 由以下三个核心组件构成:
- Nodes (节点):代表具体的步骤或逻辑函数(如:调用 LLM、查询数据库)。
- Edges (边):定义节点之间的流向。
- State (状态):这是 LangGraph 的灵魂。它是一个随图运行不断更新的全局对象,记录了当前的对话历史、中间结果和决策依据。
内嵌式科普:什么是状态机 (State Machine)?
状态机是一种数学模型,描述对象在不同状态间的转换规则。在 LangGraph 中,Agent 的每一步行动都是根据当前“状态”来决定下一个“状态”是什么,这比单纯的脚本跳转要稳健得多。
3. 深度机制:循环与控制流
不同于传统的线性 DAG(有向无环图),LangGraph 允许 Cycle(循环)。
代码段
二、 实际应用场景与典型案例
1. 场景化建模
在什么情况下你需要 LangGraph 而不是简单的 LangChain?
- 痛点:当你的 AI 任务需要“反思”时。例如,写代码的任务,AI 生成后需要运行,报错了需要根据错误信息回去改代码,直到运行通过。这种纠错循环在 LangChain 中难以优雅实现,但在 LangGraph 中只是一个简单的“边”。
2. 典型用例
- 多智能体协作 (Multi-Agent):一个 Agent 负责写文案,另一个 Agent 负责审核。审核不通过则打回文案 Agent 修改,形成闭环。
- 长程对话 RAG:在检索增强生成中,如果检索到的信息不足以回答问题,Agent 可以自动决定调整搜索关键词重新检索。
- 企业级自动化工作流:涉及人工审批(Human-in-the-loop)的流程,Agent 可以在某个节点停下等待人类输入,再继续运行。
3. 技术选型
- LangGraph 的优势:它提供了极致的控制力。你可以精确定义每一步的输入输出映射,支持断点调试和状态回溯(Time Travel),这对于生产环境下的 AI 应用至关重要。
三、 基础实战项目:自愈式 SQL 查询 Agent
我们将构建一个能够根据用户问题生成 SQL 语句的项目。如果 SQL 执行报错,Agent 会自动观察错误并尝试修复,直到拿到正确数据。
1. 环境搭建 (Conda 优先)
# 创建并激活环境
conda create -n langgraph_study python=3.10 -y
conda activate langgraph_study
# 安装核心依赖
pip install langgraph langchain_openai langchain_core
2. 项目目录结构
sql_agent_project/
├── .env # 存储 API_KEY
├── app.py # 主程序逻辑
└── database_util.py # 模拟数据库工具
3. 全量代码实现
(1) 逻辑核心:app.py
# -*- coding: utf-8 -*-
import os
from typing import Annotated, TypedDict
from langchain_openai import ChatOpenAI
from langgraph.graph import StateGraph, END
# 1. 定义状态结构
class AgentState(TypedDict):
# 使用 list 记录对话历史,Annotated 允许我们定义状态的合并规则
query: str
sql_code: str
error_msg: str
retry_count: int
# 2. 定义节点逻辑
llm = ChatOpenAI(model="gpt-4", api_key="YOUR_KEY")
def sql_generator(state: AgentState):
"""根据用户问题生成 SQL"""
prompt = f"针对问题 '{state['query']}' 生成 SQL。如果是修复,请参考错误:{state['error_msg']}"
# 模拟 LLM 返回
response = llm.invoke(prompt)
return {"sql_code": response.content, "retry_count": state.get('retry_count', 0) + 1}
def sql_executor(state: AgentState):
"""模拟执行 SQL,带有纠错触发逻辑"""
sql = state['sql_code']
# 模拟一个逻辑:如果 SQL 包含 'SELECT' 且没有 'FROM' 则报错
if "FROM" not in sql.upper():
return {"error_msg": "语法错误:缺少 FROM 子句"}
return {"error_msg": "SUCCESS"}
# 3. 定义条件边(控制流)
def should_continue(state: AgentState):
if state["error_msg"] == "SUCCESS" or state["retry_count"] >= 3:
return "end"
return "retry"
# 4. 构建图
workflow = StateGraph(AgentState)
# 添加节点
workflow.add_node("generator", sql_generator)
workflow.add_node("executor", sql_executor)
# 设置入口
workflow.set_entry_point("generator")
# 链接节点
workflow.add_edge("generator", "executor")
# 添加条件分支
workflow.add_conditional_edges(
"executor",
should_continue,
{
"retry": "generator",
"end": END
}
)
# 编译运行
app = workflow.compile()
# 5. 执行示例
inputs = {"query": "查询 2023 年销售额前三的用户", "error_msg": "", "retry_count": 0}
for output in app.stream(inputs):
for key, value in output.items():
print(f"--- 节点 {key} 执行完毕 ---")
print(f"当前状态: {value}")
4. 预期运行结果
在终端中,你会看到 Agent 在 generator 和 executor 之间“反复横跳”。
--- 节点 generator 执行完毕 ---
当前状态: {'sql_code': 'SELECT user_id FROM sales', 'retry_count': 1}
--- 节点 executor 执行完毕 ---
当前状态: {'error_msg': 'SUCCESS'}
# 或者如果第一次出错
--- 节点 generator 执行完毕 ---
当前状态: {'sql_code': 'SELECT user_id', 'retry_count': 2}
--- 节点 executor 执行完毕 ---
当前状态: {'error_msg': '语法错误:缺少 FROM 子句'}
--- 节点 generator 执行完毕 ---
... (开始修复逻辑)
四、 总结与建议
LangGraph 的出现标志着 AI 应用开发从“脚本时代”进入了“架构时代”。
- 核心要点回顾:LangGraph 通过 State(状态)、Nodes(节点) 和 Edges(边) 的组合,解决了 Agent 在复杂任务中需要自我纠错和多轮迭代的问题。
- 上手路径:
- 熟练掌握 LangChain 的
ChatOpenAI和PromptTemplate。 - 理解
TypedDict在状态传递中的作用。 - 学习如何通过
add_conditional_edges实现复杂的逻辑路由。
- 熟练掌握 LangChain 的
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)