Homestead
LGLangGraph Story Demo
Blog260812 · 中文学习笔记

Node · State · Edge

发表时间:2026.08.12阅读时长:约 10 分钟LangGraph / Node / State / Edge

LangGraph 工作流入门:从写故事 Demo 理解 AI 如何“办事”

把一次模型调用升级成“生成、审核、判断、重试、终止”的可控流程。本文跳过抽象定义,直接从一个写故事案例拆解 LangGraph 的运行原理。

State保存故事、次数、审核意见和通过状态。
Nodewriter 生成,reviewer 审核。
Edge决定继续、重试,还是结束。
Story Graph Loop

不是让模型回答一次,而是让模型进入一个有规则、有反馈、有出口的工作流。

大语言模型可以生成内容,但一个真正可用的 AI 应用,往往不只是“调用一次模型”。在实际业务中,我们更常需要的是:让模型先执行任务,再检查结果,如果不合格就修正,直到通过或达到停止条件。

LangGraph 正是为这类可控 AI 工作流设计的框架。它把一次 AI 任务拆成多个节点,用共享状态记录过程,再用边来决定流程如何流转。

生成writer_node 调用本地模型写故事。
审核reviewer_node 检查故事质量。
判断should_continue 读取 State。
重试不通过就带反馈再次生成。
结束通过或达到最大次数后停止。
01

项目结构不复杂,但分工很清楚

langgraph_story_demo/
├── main.py
├── state.py
├── nodes.py
├── router.py
└── graph.py
state.py定义工作流共享状态 StoryState。
nodes.py定义 writer_node 和 reviewer_node。
router.py定义 should_continue,判断结束还是重试。
graph.py使用 StateGraph 组装完整流程。
main.py初始化状态、运行 graph、打印每一步和最终结果。
整体设计状态、节点、路由、图构建、入口运行各自独立。
02

LangGraph 的基本原理:带记忆的流程图执行器

LangGraph 并不是简单地把几个函数顺序执行一遍。它真正提供的是“状态驱动的流程控制”。

[ Start / 输入 ]
       │
       ▼
┌──────────────┐
│  State (状态) │ <─── 状态更新(story / attempts / review / approved)
└──────────────┘
       │
       ▼
 [ writer_node ] ── 调用本地模型生成故事
       │
       ▼
 [ reviewer_node ] ── 审核故事质量,并把 review / approved 写回 State
       │
       ▼
 < 条件判断边 should_continue >
       │
       ├───────(审核不通过,且 attempts < MAX_ATTEMPTS)───────┐
       │                                                       │
       │                                                       ▼
       │                                                回到 writer_node
       │
       └───────(审核通过 / 达到最大次数)──────────────────────┐
                                                               │
                                                               ▼
                                                     [ End / 输出最终结果 ]
03

State 是共享记忆:它让流程能自我修正

`State` 是整个 graph 在运行过程中的共享记忆。本案例中,`StoryState` 保存故事内容、尝试次数、审核意见和是否通过。

class StoryState(TypedDict):
    story: str
    attempts: int
    review: str
    approved: bool
字段含义
story当前生成出来的故事内容。
attempts已经尝试生成的次数。
review审核节点给出的审核意见。
approved故事是否通过审核。
如果没有 State,节点之间就很难共享上下文。第一次故事太短时,审核意见可以被保存下来;第二次生成时,writer_node 就能把这条反馈加入 prompt。
04

Node 是动作:每个节点只做好一步

`Node` 是 LangGraph 中真正干活的单元。一个 Node 通常就是一个 Python 函数,模式很统一:读取当前 State,执行当前任务,返回需要更新的 State 字段。

writer_node调用本地 Ollama 模型生成故事,更新 story 和 attempts。
reviewer_node读取故事内容,用 Python 规则检查故事是否合格。
设计原则能用确定性代码解决的,不必全部交给大模型。
05

Edge 是控制流:决定下一步去哪里

`Edge` 是节点之间的连接关系。普通边表示固定顺序,条件边则根据当前 State 动态选择下一步。

普通边

graph.add_edge(START, "writer")
graph.add_edge("writer", "reviewer")

条件边

graph.add_conditional_edges(
    "reviewer",
    should_continue,
    {
        "writer": "writer",
        "end": END,
    },
)
06

一次真实运行:系统自己检查、判断、重试

本案例的一次真实运行中,模型一共被调用了两次。第一次故事太短且缺少明确情节,审核失败;第二次带着审核意见重新生成,最终通过。

第 1 次调用

Prompt 长度:134 字符 输出故事长度:76 字符 审核结果:失败 失败原因:故事太短,且缺少更明确的情节或品质关键词。

第 2 次调用

Prompt 长度:174 字符 输出故事长度:127 字符 审核结果:通过。

第一次生成不合格
-> reviewer_node 写入审核意见
-> State 保存失败原因
-> Edge 判断需要重试
-> writer_node 根据反馈再次生成
-> 第二次通过审核
-> 流程结束
07

LangChain 与 LangGraph:组件工具箱 vs 流程控制器

LangChain 更像 LLM 组件工具箱。
LangGraph 更像 AI 工作流流程控制器。

LangChain 常用于连接 Prompt、Model、Parser、Tool、Retriever、Chain 等组件;而 LangGraph 更关注状态管理、多节点流程、条件分支、循环重试、人工审核、任务编排和可控 Agent 工作流。

在本案例中,LangChain / langchain-ollama 负责调用本地模型;LangGraph 负责组织 writer -> reviewer -> 判断 -> 重试或结束。

08

把写故事案例抽象成通用 Agent 模式

生成
-> 评估
-> 判断
-> 修正
-> 终止
场景writer_nodereviewer_node
写邮件生成邮件草稿检查语气、长度、收件人信息
写报告生成报告内容检查结构、数据和结论
写代码生成代码运行测试、检查 lint
客服回复生成回复检查是否符合政策和事实
文档总结生成摘要检查是否覆盖关键点
09

学习 LangGraph 时最该抓住的三句话

State 是记忆保存输入、输出、中间结果、审核意见和控制变量。
Node 是动作执行明确步骤,比如生成、审核、检索、调用工具或写入文件。
Edge 是控制流决定下一步去哪里,是继续、分支、循环,还是结束。
用 State 保存上下文,
用 Node 执行任务,
用 Edge 控制流程。
10

AI 应用可以拥有分支、循环、审核、重试和终止条件

这也是 LangGraph 比“一次性模型调用”更接近真实应用的地方。一个 AI 应用不一定只能从输入走到输出,它可以像普通软件流程一样,根据状态做判断,根据结果走不同路径。

分支如果用户意图是写故事,就进入 writer;如果是修改故事,就进入 editor;如果只是查询状态,就直接返回当前 State。
循环reviewer 发现故事太短时,不结束流程,而是把审核意见写入 State,再回到 writer 重新生成。
审核长度、关键词、格式可以用 Python 规则检查;更复杂的风格、事实或安全判断,也可以交给另一个 reviewer 节点。
重试失败并不等于流程失败。系统可以带着 review 反馈再次尝试,让下一轮生成更接近目标。
终止条件当 approved=True 时结束;当 attempts >= MAX_ATTEMPTS 时也结束,避免无限循环。
业务边界例如合同审核、代码生成、客服回复都需要明确的“通过、退回、重试、停止”规则。
if approved:
    goto END
elif attempts >= MAX_ATTEMPTS:
    goto END
else:
    goto writer_node

十一、总结

LangGraph_story_demo 用一个很小的故事生成案例,展示了 LangGraph 最核心的工作方式:生成内容、记录状态、审核结果、根据条件分支、失败后带反馈重试、成功后及时结束、达到上限后停止。

LangGraph 的价值,不只是把节点连起来,而是让 AI 应用拥有状态、判断、循环和边界。

普通 LLM 调用:让模型回答一次。
LangGraph 工作流:让模型在一个可控流程中完成任务。
Blog260812 · LangGraph 工作流入门 · Node / State / Edge