【工作流的常见模式】手把手教你用 LangGraph 做「提示链」
【LangGraph】本文主要内容: LangGraph真正上手,以及做一些简单的案例
上一章内容在这-> 【LangGraph】实战:基于 LangGraph 实现的智能文档问答系统
前言
在用 LangGraph 写 AI 应用的时候,很多人一开始会有点懵:
- 我应该怎么设计节点?
- 流程顺序怎么定?
- 什么时候分步骤?
- 什么时候合并?
其实,这些问题都有套路可循
提示链(Prompt Chain) 就是最常见、也最容易上手的一种设计模式
一句话解释提示链: 把一个复杂任务拆成 N 个小步骤,让 LLM 一个接一个完成,像工厂流水线一样
这篇文章不会讲太虚的概念,而是直接从一个写文章的案例出发,一步步拆解代码和思路
看完你就能直接套用到自己的项目里
一、一篇文章是怎么“链”出来的?
假设我们要写一篇《计算机学生的未来就业?》的文章
如果你直接丢给模型:

大概率会得到:
-
结构乱,东一榔头西一棒子
-
质量时好时坏,不可控
-
内容太长或太短,没法调
那问题出在哪?
你把“写文章”这一个任务,一次全扔给了模型
模型不是超人,它更适合一次做一小件事
所以正确的做法是拆成 4 步:
-
先写大纲(只列 2 个核心标题)
-
再根据大纲写初稿(每个标题下不超过 3 句话)
-
润色初稿(优化表达,但不要拉太长)
-
最后整合成终稿(把大纲 + 润色版一起喂给模型)
这就是一个典型的提示链流程
二、在 LangGraph 里,提示链长什么样?
LangGraph 把每个步骤叫 Node(节点)
步骤之间的顺序叫 Edge(边)
中间传递的数据叫 State(状态)
所以一个提示链 = 一组节点 + 一条直线边 + 一个共享的 State
2.1 状态定义(State)
我们要区分三样东西:
-
输入(topic):用户给的主题
-
中间产物:大纲、初稿、润色稿
-
输出(output):最终文章
代码里用 TypedDict 来定义这些:
from typing import TypedDict
# TypedDict 是带类型注解的字典可以给代码定规矩用
# 只需要输入
class InputState(TypedDict):
topic: str
# 只需要输出
class OutState(TypedDict):
final_content: str
# 整个过程要用的全部字段
class OverState(InputState, OutState):
outline: str # 大纲
draft: str # 初稿
polished_draft: str # 润色稿
这种分法看起来有点啰嗦,但好处是清晰:
我们可以一眼就知道哪些是输入,哪些是中间产物,哪些是最终结果
2.2 四个节点怎么写(附完整提示词)
这里我用的是openai的 gpt-4o-mini模型(练习可以用阿里的qwen-plus)
from langchain.chat_models import init_chat_model
model = init_chat_model("gpt-4o-mini")
)
#节点1:生成大纲
PROMPT_1 = (
"根据主题生成文章大纲。\n"
"主题:{topic}\n"
"要求:"
"1.只需两个最核心标题"
"2.不用进行说明,只返回最终大纲"
)
def node1(state: InputState):
print("内容大纲生成中...")
topic = state["topic"]
prompt = PROMPT_1.format(topic=topic)
result = model.invoke([HumanMessage(content=prompt)]).content
print(f"大纲已生成:\n{result}\n")
return {
"outline": result,
"topic": topic
}
节点2:生成初稿
python
PROMPT_2 = (
"根据以下内容生成文章完整初稿。\n"
"主题:{topic}\n"
"大纲: {outline}\n"
"要求:"
"1.每个标题下,最多使用三句话"
"2.不用说明,只返回结果"
)
def node2(state: OverState):
print("生成初稿中...")
topic = state["topic"]
outline = state["outline"]
prompt = PROMPT_2.format(topic=topic, outline=outline)
result = model.invoke([HumanMessage(content=prompt)]).content
print(f"初稿已生成:\n{result}\n")
return {"draft": result}
节点3:润色
python
PROMPT_3 = (
"根据文章初稿进行润色。\n"
"主题:{topic}\n"
"初稿: {draft}\n"
"要求:润色后,文章不能太长"
)
def node3(state: OverState):
print("文章润色中...")
prompt = PROMPT_3.format(topic=state["topic"], draft=state["draft"])
result = model.invoke([HumanMessage(content=prompt)]).content
print(f"润色完成:\n{result}\n")
return {"polished_draft": result}
节点4:终稿整合
PROMPT_4 = (
"根据润色版文章,生成文章终稿。\n"
"主题:{topic}\n"
"大纲: {outline}\n"
"润色版: {polished_draft}\n"
)
def node4(state: OverState):
print("最终文章生成中...")
prompt = PROMPT_4.format(
topic=state["topic"],
outline=state["outline"],
polished_draft=state["polished_draft"]
)
result = model.invoke([HumanMessage(content=prompt)]).content
print(f"终稿:\n{result}\n")
return {"final_content": result}
2.3 把节点串成图
from langgraph.constants import START
from langgraph.graph import StateGraph
builder = StateGraph(
OverState,
input_schema=InputState,
output_schema=OutState
)
2.4 一次性按顺序添加 4 个节点
builder.add_sequence([node1, node2, node3, node4])
builder.add_edge(START, "node1")
graph = builder.compile()
add_sequence 是 LangGraph 提供的一个小糖,自动按列表顺序添加节点,并从前一个节点连接到后一个节点
就等价于手动写 3 条 add_edge
2.5 运行结果
result = graph.invoke({"topic": "计算机学生的未来就业?"})
print(result)
你会看到控制台依次打印:
**************************************************
内容大纲生成中...
大纲已生成:
1. 技术方向多元化
2. 跨领域融合机遇
**************************************************
生成初稿中...
...
最终文章生成中...
最后输出的 result["final_content"] 就是成品。
三、为什么提示链模式这么好用?
3.1 优点:
-
稳定:每一步只做一件事,LLM 不容易跑偏
-
可控:每一步的 prompt 可以单独调优。比如大纲写太细了,只改第一步就行
-
好调试:哪一步输出不对劲,一眼就能看出来,直接打印中间结果
-
可复用:大纲节点、润色节点可以单独拿出来用在别的地方
3.2 缺点:
-
流程固定:不能根据内容动态跳转,比如初稿质量很高就不需要润色了——提示链做不到,得用更复杂的 Router 模式
-
不适合强推理任务:比如数学证明、多步逻辑推理,每一步依赖前一步但可能反复修改,这种提示链会很死板
四、什么时候该用提示链?
以我自己的经验,下面这些任务用提示链特别顺手:
文章 / 报告生成:大纲 → 初稿 → 润色 → 终稿
内容总结:原文 → 关键句提取 → 摘要 → 精简总结
翻译 + 校对:翻译 → 语法检查 → 风格统一
代码生成:需求 → 伪代码 → 实现 → 注释 / 测试
一句话:凡是能拆成线性的、依赖明确的步骤,都可以上提示链
五、总结
LangGraph 本身很灵活,但如果你一上来就想用复杂的图结构(比如循环、条件分支),很容易把自己绕晕
从提示链开始,是最低成本的入门方式
你可以把它想象成:
不是让一个超人 AI 把所有活干完,
而是把一群普通 AI 串起来,每人干一点,最后合起来效果反而更好
今天的分享就到了,拜拜~
更多推荐

所有评论(0)