核心思想
用一个巨大的 Prompt 让 LLM 一步到位地解决复杂问题,往往效果不好。模型会顾此失彼,例如,一个要求分析市场调研报告、总结发现、用数据点识别趋势并起草邮件的查询,可能总结做得不错,但数据提取就乱了;或者前半段还行,后半段开始"编造"内容。
提示词链(Prompt Chaining)的思路很简单:把大问题拆成一串小问题,每一步只做一件事,上一步的输出作为下一步的输入。 这就像工厂的流水线------每个工位只负责一道工序,最终组装出完整的产品。
为什么单个 Prompt 不够用?
当你在一个 Prompt 里塞入太多指令时,LLM 容易出现以下问题:
- 指令忽略:部分要求被跳过
- 上下文漂移:写着写着就偏离了原始目标
- 错误传播:前面出了错,后面越错越离谱
- 幻觉:认知负荷过大,模型开始编造信息
拆开来做,效果立刻不同
让我们回到刚开始那个例子:你让 LLM "分析这份市场报告、总结发现、识别趋势、起草邮件"------四件事塞在一起,模型很可能总结还行,但趋势提取和邮件撰写就一塌糊涂。 同样的任务用提示词链来处理:
- Prompt 1(摘要):"总结这份市场报告的关键发现。"
- Prompt 2(趋势识别):"根据上面的摘要,提取前三个新兴趋势及其数据支撑。"
- Prompt 3(邮件撰写):"根据这些趋势,起草一封给营销团队的邮件。" 每一步都很简单、很聚焦,模型的准确率自然就上去了。你甚至可以在每一步给模型分配不同的角色------第一步是"市场分析师",第二步是"数据分析师",第三步是"文案专家"。
步骤之间用结构化数据传递
提示词链的可靠性取决于步骤之间传递数据的质量。如果上一步输出的是模糊的自然语言,下一步很容易"理解偏了"。最佳实践是让每一步输出结构化格式(如 JSON):
json
{
"trends": [
{
"trend_name": "AI-Powered Personalization",
"supporting_data": "73% of consumers prefer brands that use personal information to make shopping more relevant."
},
{
"trend_name": "Sustainable and Ethical Brands",
"supporting_data": "ESG-related products sales grew 28% over the last five years, vs 20% for others."
}
]
}
结构化输出让数据可以被精确解析,消除了自然语言的歧义。 所以拆分后的每一步不一定都是 LLM 给出的回答,也可以是外部的知识库、数据库等外部数据源提供的结构化数据。
典型应用场景
信息处理流水线: 提取文本 → 生成摘要 → 识别关键实体 → 查询知识库 → 生成报告。适用于自动化内容分析和研究助手。
数据提取与转换: 从发票、表单等非结构化文档中提取字段,验证格式,缺失则重新提取,最终输出结构化数据。处理 OCR 场景时尤其有效------先提取文本,再规范化数据(如将"一千零五十"转为 1050),遇到计算则委托给外部工具。
内容生成: 构思主题 → 生成大纲 → 逐段撰写(每段都带上前文作为上下文) → 整体审校。比一次性让模型"写一篇完整文章"可靠得多。
代码生成与优化: 理解需求 → 生成伪代码 → 编写初稿 → 检查错误 → 优化重写。关键优势在于可以在步骤之间插入确定性逻辑(如静态分析、单元测试),而不是完全依赖 LLM。
实际项目中,独立的数据收集步骤可以并行 执行以提高效率,而综合和完善等有依赖关系的步骤则通过提示词链串行处理。
代码示例
以下用 LangChain 实现一个两步提示词链:先从文本中提取技术规格,再将其转换为 JSON。
bash
pip install langchain langchain-community langchain-openai langgraph
python
import os
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
llm = ChatOpenAI(temperature=0)
## --- Prompt 1: Extract Information ---
prompt_extract = ChatPromptTemplate.from_template(
"从以下文本中提取技术规格信息:\n\n{text_input}"
)
## --- Prompt 2: Transform to JSON ---
prompt_transform = ChatPromptTemplate.from_template(
"将以下规格信息转换为一个 JSON 对象,使用 'cpu'、'memory' 和 'storage' 作为键:\n\n{specifications}"
)
## --- Build the Chain using LCEL ---
extraction_chain = prompt_extract | llm | StrOutputParser()
full_chain = (
{"specifications": extraction_chain}
| prompt_transform
| llm
| StrOutputParser()
)
## --- Run the Chain ---
input_text = "这款新笔记本电脑配备了 3.5 GHz 八核处理器、16GB 内存和 1TB NVMe 固态硬盘。"
final_result = full_chain.invoke({"text_input": input_text})
print("\n--- Final JSON Output ---")
print(final_result)
extraction_chain 负责提取规格信息,full_chain 将提取结果喂给第二个 Prompt 做 JSON 格式化。两步各司其职,通过 LCEL(LangChain Expression Language)用 | 管道符串联起来。
Context Engineering 与 Prompt Engineering
Prompt Engineering 关注的是"怎么措辞才能让模型给出好答案"。而 Context Engineering 关注的是更大的问题:在模型生成回答之前,给它构建一个怎样的信息环境?

如上图所示,Context Engineering 是构建丰富信息环境的概念,上下文的质量直接决定了 Agentic 系统的表现。 一个经过 Context Engineering 的 Agent,在回答你的问题之前,会先整合多层信息:
- System Prompt:定义 AI 的角色和行为规范(如"你是一名技术撰稿人,语气正式精确")
- 检索文档:从知识库主动获取的相关资料
- 工具输出:调用外部 API 获得的实时数据(如日历、数据库查询结果)
- 隐式数据:用户身份、交互历史、当前环境状态
核心原则是:即使是最强的模型,如果给它的上下文不够好,输出也会很差。 Context Engineering 把重心从"优化一句话"转移到了"构建完整的操作图景"。