初识LangGraph - 从零开始

AI冒险之旅

嘿,各位程序员大大们!👋

想象一下,你正在玩一款超复杂的RPG游戏。游戏里有无数个NPC,每个NPC都有自己的任务线,而且这些任务线还会根据你的选择产生分支。

更麻烦的是,你还要记住和每个NPC的对话历史,因为后续任务可能要用到之前的信息…

这就是我们传统程序员在AI时代遇到的真实困境:

如何管理复杂的多轮对话流程!

传统的if-else大法就像用木剑打Boss,虽然能打,但是:

  • 代码越写越长,像迷宫一样绕来绕去
  • 状态管理混乱,像背包里塞满了各种道具却找不到
  • 难以维护,改一个地方可能影响全局
  • 无法可视化,就像在黑暗中摸索

这时候,LangGraph登场了!✨

它就像游戏里的"神器"——

不仅能帮你管理复杂的对话流程,还能自动生成流程图,让你一眼看清整个系统的运行逻辑。

更重要的是,它内置了"存档系统"(状态持久化),让你的对话可以随时暂停和恢复。


什么是LangGraph?—— 你的AI应用构建神器

LangGraph是LangChain团队推出的一个框架,专门用来构建有状态的AI应用。它将你的应用建模为一个状态图(State Graph),其中节点代表处理步骤,边代表状态流转。

把LangGraph想象成一个任务系统🎮

  • 状态图(State Graph) = 游戏地图🗺️
  • 整个游戏世界的地图,告诉你所有可去的地方和路线
  • 节点(Node) = 游戏中的NPC或关卡🏰
  • 每个节点就是一个任务点,比如"和村长对话"、“击败Boss”、“收集道具”
  • 每个节点都有自己的功能,接收信息,处理后输出结果
  • 边(Edge) = 道路或传送门🚪
  • 连接各个节点的路径
  • 可以是固定的(无条件),也可以是动态的(根据条件选择)
  • 状态(State) = 角色的背包和存档💼
  • 存储所有需要的信息:对话历史、用户数据、当前进度等
  • 就像游戏里的背包,随时可以查看和更新
  • 检查点(Checkpoint) = 存档系统💾
  • 可以随时保存当前进度
  • 支持断点续传,就像游戏里的存档点

核心概念详解

1. 状态(State)- 你的"背包系统"

状态就像游戏角色的背包,里面装着所有需要的信息。

在我们的SurveyEase项目中,状态长这样:

class SurveyGraphState(TypedDict):    messages: List[BaseMessage]  # 对话记录(就像任务日志)    steps: List[Dict[str, Any]]  # 调研步骤配置(任务清单)    system_prompt: str  # 系统提示词(游戏规则)    max_turns: int  # 最大对话轮数(任务时限)    current_step: str  # 当前步骤(你在哪个任务点)    current_step_messages: List[BaseMessage]  # 当前步骤的消息(当前任务的对话)    thread_id: str  # 会话ID(存档编号)    end_message: str  # 结束语(任务完成后的台词)

为什么需要状态?

想象你在玩一个多分支剧情的游戏:

  • 你需要记住之前和NPC说了什么(messages
  • 你需要知道当前进行到哪个任务(current_step
  • 你需要知道任务的总进度(steps

没有状态管理,就像每次对话都要从头开始,那用户体验就太糟糕了!😱

2. 节点(Node)- 你的"任务点"

节点就像游戏中的任务点,每个节点负责一个具体的功能。

在我们的项目中,主要有三种节点:

问题生成节点(_generate_question 🤖

  • 功能:根据当前步骤生成问题
  • 比喻:就像游戏中的"对话NPC",会根据剧情向你提问
  • 特点:可以调用LLM生成智能问题,支持多轮追问

用户回答节点(_get_user_answer 👤

  • 功能:接收并处理用户的回答
  • 比喻:就像游戏中的"输入框",等待玩家输入
  • 特点:使用interrupt机制暂停执行,等待用户输入

结束节点(_end_survey 🏁

  • 功能:结束调研并保存记录
  • 比喻:就像游戏中的"任务完成"界面
  • 特点:自动保存对话记录,输出结束语

3. 边(Edge)- 你的"道路系统"

边定义了节点之间的流转关系,就像游戏地图上的道路。

固定边(Fixed Edge) 🛣️

  • 无条件跳转,就像游戏中的主线剧情
  • 例如:workflow.add_edge("step1", "step2")
  • 意思:完成step1后,无条件进入step2

条件边(Conditional Edge) 🚪

  • 根据状态动态决定下一节点,就像游戏中的分支剧情
  • 例如:根据用户回答,决定进入不同的任务线
  • 实现:使用add_conditional_edges方法
workflow.add_conditional_edges(    "0_q",  # 从哪个节点出发    self._should_continue,  # 判断函数(就像游戏中的选择判断)    edge_map  # 可能的目标节点(就像不同的剧情分支))

4. 检查点(Checkpoint)- 你的"存档系统"

检查点机制让LangGraph支持状态持久化,就像游戏里的存档功能。

为什么需要检查点?

  • 状态恢复

    :用户刷新页面后,可以从上次中断的地方继续

  • 多线程支持

    :多个用户同时使用,不会互相干扰

  • 断点续传

    :长时间对话可以暂停和恢复

在我们的项目中,使用MemorySaver实现:

from langgraph.checkpoint.memory import MemorySaverself.checkpointer = MemorySaver(serde=CustomSerializer())

就像游戏里的自动存档,每次状态更新都会自动保存。


为什么选择LangGraph?—— 传统方式 vs LangGraph

在引入LangGraph之前,我们是这样写的:

# 传统方式:像在迷宫里绕来绕去if current_step == 1:    if user_answer == "yes":        current_step = 2        if some_condition:            current_step = 3        else:            current_step = 4    else:        current_step = 5        if another_condition:            current_step = 6elif current_step == 2:    # 更多嵌套...    if nested_condition:        # 更深层的嵌套...

问题就像游戏里的Bug:

  1. 难以扩展 🚫
  • 想加一个新步骤?要改很多地方的if-else
  • 就像游戏更新要改整个地图,容易出错
  1. 状态管理混乱 📦
  • 状态分散在各个地方,不知道当前状态是什么
  • 就像背包里的道具乱放,找不到想要的东西
  1. 难以可视化 👀
  • 代码就是流程图,但很难一眼看懂
  • 就像没有地图的游戏,只能靠记忆摸索
  1. 不支持状态持久化 💾
  • 用户刷新页面,对话就丢失了
  • 就像游戏没有存档,每次都要从头开始

LangGraph的"神器优势" ✨

使用LangGraph后,代码变得清晰优雅:

# LangGraph方式:像搭积木一样清晰workflow = StateGraph(SurveyGraphState)workflow.add_node("0_q", self._generate_question)  # 添加问题节点workflow.add_node("0_a", self._get_user_answer)   # 添加回答节点workflow.add_conditional_edges("0_q", self._should_continue, edge_map)  # 添加条件边

优势就像游戏里的神器属性:

  1. 代码结构清晰 📐
  • 每个节点职责单一,就像游戏里的技能树
  • 想加新功能?加个节点就行,不影响其他部分
  1. 自动生成流程图 🗺️
  • LangGraph可以自动生成可视化流程图
  • 就像游戏里的地图系统,一目了然
  1. 内置状态持久化 💾
  • 使用检查点机制,自动保存和恢复状态
  • 就像游戏里的自动存档,再也不用担心丢失进度
  1. 易于测试和调试 🐛
  • 每个节点可以独立测试
  • 就像游戏里的训练场,可以单独练习每个技能
  1. 支持流式响应 🌊
  • 可以实时返回AI的回复,提升用户体验
  • 就像游戏里的实时对话,不用等待全部加载完


项目架构概览 - SurveyEase的"世界地图"

SurveyEase是一个智能调研平台,就像一款专门做调研的"游戏"。

整体架构 🎮

┌─────────────────┐│   前端界面      │  ← 游戏UI界面│  (React + TS)   │└────────┬────────┘         │ HTTP/WebSocket  ← 网络连接┌────────▼──────────────────┐│   FastAPI 后端            │  ← 游戏服务器│  ┌────────────────────┐   ││  │  SurveyGraph       │   │  ← LangGraph核心(任务系统)│  │  (状态图)          │   ││  └────────────────────┘   ││  ┌────────────────────┐   ││  │  LLM Provider      │   │  ← AI引擎(NPC对话系统)│  └────────────────────┘   │└───────────────────────────┘

核心流程 📋

  1. 用户发起对话

    → 就像开始一个新任务

  2. SurveyGraph初始化

    → 加载任务配置

  3. 进入第一个节点

    → 开始第一个任务点

  4. 生成问题

    → NPC向你提问

  5. 等待用户回答

    → 暂停执行,等待输入

  6. 处理回答

    → 根据回答决定下一步

  7. 条件跳转

    → 根据情况选择不同的任务线

  8. 继续或结束

    → 完成任务或进入下一任务


下篇预告:实战演练 - 成为LangGraph大师 🎯

在下一篇文章中,我们将:

  1. 实战准备

    :装备你的开发环境(安装和配置)

  2. 构建第一个LangGraph

    :从零开始搭建你的状态图

  3. 核心功能详解

    :深入理解节点、边、状态的实际应用

  4. 融入你的项目

    :手把手教你如何在自己的项目中使用

  5. 进阶技巧

    :成为LangGraph高手的秘密武器

准备好开始你的LangGraph冒险了吗?让我们在下篇见!🚀


小贴士 💡

  • LangGraph官方文档

    :https://langchain-ai.github.io/langgraph/

  • SurveyEase项目

    :https://github.com/senga07/SurveyEase.git

  • 学习建议

    :先理解概念,再动手实践,最后优化改进

记住:**最好的学习方式就是动手实践!**就像玩游戏一样,光看攻略不如自己上手玩一遍。🎮


最近这几年,经济形式下行,IT行业面临经济周期波动与AI产业结构调整的双重压力,很多人都迫于无奈,要么被裁,要么被降薪苦不堪言。但我想说的是一个行业下行那必然会有上行行业,目前AI大模型的趋势就很不错,大家应该也经常听说大模型,也知道这是趋势,但苦于没有入门的契机,现在他来了,我在本平台找到了一个非常适合新手学习大模型的资源。大家想学习和了解大模型的,可以**点击这里前往查看**

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐