上一章内容在这-> 【LangGraph】实战:基于 LangGraph 实现的智能文档问答系统

前言

在用 LangGraph 写 AI 应用的时候,很多人一开始会有点懵:

  1. 我应该怎么设计节点?
  2. 流程顺序怎么定?
  3. 什么时候分步骤?
  4. 什么时候合并?

其实,这些问题都有套路可循

提示链(Prompt Chain) 就是最常见、也最容易上手的一种设计模式

一句话解释提示链: 把一个复杂任务拆成 N 个小步骤,让 LLM 一个接一个完成,像工厂流水线一样

这篇文章不会讲太虚的概念,而是直接从一个写文章的案例出发,一步步拆解代码和思路
看完你就能直接套用到自己的项目里


一、一篇文章是怎么“链”出来的?

假设我们要写一篇《计算机学生的未来就业?》的文章

如果你直接丢给模型:

在这里插入图片描述

大概率会得到:

  • 结构乱,东一榔头西一棒子

  • 质量时好时坏,不可控

  • 内容太长或太短,没法调


那问题出在哪?
你把“写文章”这一个任务,一次全扔给了模型

模型不是超人,它更适合一次做一小件事

所以正确的做法是拆成 4 步:

  1. 先写大纲(只列 2 个核心标题)

  2. 再根据大纲写初稿(每个标题下不超过 3 句话)

  3. 润色初稿(优化表达,但不要拉太长)

  4. 最后整合成终稿(把大纲 + 润色版一起喂给模型)

这就是一个典型的提示链流程


二、在 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 优点:

  1. 稳定:每一步只做一件事,LLM 不容易跑偏

  2. 可控:每一步的 prompt 可以单独调优。比如大纲写太细了,只改第一步就行

  3. 好调试:哪一步输出不对劲,一眼就能看出来,直接打印中间结果

  4. 可复用:大纲节点、润色节点可以单独拿出来用在别的地方


3.2 缺点:

  1. 流程固定:不能根据内容动态跳转,比如初稿质量很高就不需要润色了——提示链做不到,得用更复杂的 Router 模式

  2. 不适合强推理任务:比如数学证明、多步逻辑推理,每一步依赖前一步但可能反复修改,这种提示链会很死板


四、什么时候该用提示链?

以我自己的经验,下面这些任务用提示链特别顺手:

文章 / 报告生成:大纲 → 初稿 → 润色 → 终稿

内容总结:原文 → 关键句提取 → 摘要 → 精简总结

翻译 + 校对:翻译 → 语法检查 → 风格统一

代码生成:需求 → 伪代码 → 实现 → 注释 / 测试

一句话:凡是能拆成线性的、依赖明确的步骤,都可以上提示链


五、总结

LangGraph 本身很灵活,但如果你一上来就想用复杂的图结构(比如循环、条件分支),很容易把自己绕晕

从提示链开始,是最低成本的入门方式

你可以把它想象成:

不是让一个超人 AI 把所有活干完,
而是把一群普通 AI 串起来,每人干一点,最后合起来效果反而更好


今天的分享就到了,拜拜~
在这里插入图片描述

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐