提示词链
当一个任务过于复杂,单条提示词无法可靠完成时,可以把它拆分成多个子任务,依次执行,前一步的输出作为下一步的输入——这就是提示词链(Prompt Chaining)。
为什么需要提示词链?
单条提示词的问题
把所有要求塞进一个超长提示词,会导致以下问题:
- AI容易遗漏某些子任务 —— 任务太多,顾此失彼
- 前后步骤的逻辑相互干扰 —— 不同任务的要求可能冲突
- 出错时难以定位问题 —— 不知道是哪一步出了错
- Token消耗高 —— 一次性输入大量内容,成本上升
提示词链的解决思路
提示词链把复杂任务分而治之:
复杂任务
↓
┌─────────────────────────────────────┐
│ 提示词1:完成子任务A │
│ ↓ │
│ 提示词2:基于A的结果,完成子任务B │
│ ↓ │
│ 提示词3:基于B的结果,完成子任务C │
│ ↓ │
│ 最终结果 │
└─────────────────────────────────────┘每一步都能独立验证质量,整体可靠性大幅提升。
适合使用提示词链的场景
| 场景 | 链式拆分方式 |
|---|---|
| 长文档分析 | 提取关键信息 → 分析 → 生成报告 |
| 代码生成 | 梳理需求 → 设计接口 → 实现代码 → 写测试 |
| 内容创作 | 确定大纲 → 逐节撰写 → 润色修改 |
| 数据处理 | 清洗数据 → 分类标注 → 汇总统计 |
| 翻译本地化 | 直译 → 文化适配 → 润色 |
实战案例详解
案例一:简历筛选流水线
这是一个典型的三步提示词链:
第一步:信息提取
请从以下简历中提取关键信息,以JSON格式输出:
- name(姓名)
- years_exp(工作年限,数字)
- skills(技能列表)
- last_title(最近职位)
- education(学历)
<resume>
张三
高级软件工程师 | 8年经验
工作经历:
- ABC科技公司,高级工程师,2020-2024
负责后端架构设计,主导微服务改造项目
- XYZ互联网公司,工程师,2016-2020
参与核心业务系统开发
技能:Python, Java, Kubernetes, MySQL, Redis
教育背景:北京大学 计算机科学 本科
</resume>输出示例:
json
{
"name": "张三",
"years_exp": 8,
"skills": ["Python", "Java", "Kubernetes", "MySQL", "Redis"],
"last_title": "高级软件工程师",
"education": "本科"
}第二步:岗位匹配
将第一步的JSON输出作为第二步的输入:
根据以下候选人信息和岗位要求,打出0-10的匹配分,
并说明主要匹配点和不足点。
<candidate>
{
"name": "张三",
"years_exp": 8,
"skills": ["Python", "Java", "Kubernetes", "MySQL", "Redis"],
"last_title": "高级软件工程师",
"education": "本科"
}
</candidate>
<job_requirements>
职位:资深后端工程师
要求:
- 5年以上后端开发经验
- 精通Python或Go
- 有微服务架构经验
- 熟悉容器化技术
- 本科及以上学历
</job_requirements>输出示例:
匹配评分:8/10
匹配点:
1. 工作年限:8年经验,超过要求的5年 ✓
2. 技术栈:精通Python,有Kubernetes经验 ✓
3. 架构经验:主导过微服务改造项目 ✓
4. 学历:本科学历符合要求 ✓
不足点:
1. 岗位要求Go语言,候选人主要使用Java
2. 未提及具体的性能优化经验第三步:生成邮件
根据第二步的评估结果生成邮件:
根据候选人的评估结果,生成一封邮件。
<evaluation>
匹配评分:8/10
匹配点:工作年限符合、精通Python、有微服务经验
不足点:不会Go语言
</evaluation>
<job_title>资深后端工程师</job_title>
如果匹配分>=7,起草一封面试邀请邮件;
如果匹配分<7,起草一封婉拒邮件。
要求:邮件简洁专业,不超过200字。输出示例:
主题:【面试邀请】资深后端工程师岗位 - 张三
张三先生您好:
感谢您投递资深后端工程师岗位。您的技术背景和微服务架构经验
给我们留下了深刻印象。
我们诚挚邀请您参加面试,进一步了解您的技术专长和项目经验。
面试时间初定为下周二下午,具体安排将另行通知。
期待与您见面!
HR团队
XX科技公司案例二:代码生成流水线
第一步:需求分析
分析以下功能需求,输出:
1. 核心功能点
2. 需要的技术组件
3. 可能的边界情况
需求:
用户登录功能,支持手机号+验证码登录和密码登录,
需要防止暴力破解,登录成功后返回token。第二步:接口设计
基于第一步的分析结果设计API:
基于以下需求分析,设计RESTful API接口:
<analysis>
[第一步的输出]
</analysis>
输出格式:
- 接口路径
- 请求方法
- 请求参数
- 响应格式
- 错误码第三步:代码实现
基于接口设计生成代码:
基于以下接口设计,用Python FastAPI实现代码:
<api_design>
[第二步的输出]
</api_design>
要求:
- 包含完整的错误处理
- 添加类型提示
- 包含文档字符串第四步:单元测试
基于代码生成测试:
为以下代码编写单元测试:
<code>
[第三步的代码]
</code>
要求:
- 覆盖正常情况和边界情况
- 使用pytest框架
- 包含测试说明案例三:长文档处理
第一步:结构分析
分析以下文档的结构,列出所有章节标题和层级关系:
<document>
[长文档内容]
</document>第二步:分段总结
总结文档的第三章内容:
<chapter_3>
[第三章内容]
</chapter_3>
要求:200字以内,提取核心观点。第三步:综合报告
基于以下各章节总结,生成完整的文档摘要:
<summaries>
第一章:[总结]
第二章:[总结]
第三章:[总结]
...
</summaries>
要求:
- 500字以内
- 突出文档的核心价值
- 包含关键结论提示词链的设计原则
原则一:每步只做一件事
❌ 一条提示词做多件事
请分析这段代码,找出bug,修复它,然后写测试,最后生成文档。
✅ 分步执行
Step 1: 分析代码,找出潜在问题
Step 2: 针对每个问题给出修复方案
Step 3: 为修复后的代码写测试
Step 4: 生成文档原则二:明确定义输入输出
每一步都要明确:
- 这一步接收什么输入
- 这一步输出什么格式
# 好的定义
输入:简历原文
输出:JSON格式的结构化数据,包含name、years_exp、skills字段
# 差的定义
输入:简历
输出:处理后的信息原则三:保持独立性
每一步应该能独立理解和执行,不依赖"上下文记忆":
❌ 依赖上下文
Step 2: 根据上面的分析...
✅ 显式传入
Step 2: 基于以下分析结果...
<analysis>
[Step 1的输出]
</analysis>原则四:设置检查点
在关键步骤之间加入验证,确保中间结果正确:
python
# 伪代码示例
step1_output = call_llm(prompt1)
if not validate(step1_output):
raise Error("Step 1 failed")
step2_output = call_llm(prompt2.format(input=step1_output))
if not validate(step2_output):
raise Error("Step 2 failed")开发者实践:代码实现
如果你是开发者,可以用代码来实现提示词链:
python
import anthropic
client = anthropic.Anthropic()
def prompt_chain(resume_text: str, job_requirements: str):
# Step 1: 提取信息
step1_response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
messages=[{
"role": "user",
"content": f"""
请从以下简历中提取关键信息,以JSON格式输出...
<resume>{resume_text}</resume>
"""
}]
)
candidate_json = step1_response.content[0].text
# Step 2: 匹配评估
step2_response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
messages=[{
"role": "user",
"content": f"""
根据以下候选人信息评估匹配度...
<candidate>{candidate_json}</candidate>
<job_requirements>{job_requirements}</job_requirements>
"""
}]
)
evaluation = step2_response.content[0].text
# Step 3: 生成邮件
step3_response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
messages=[{
"role": "user",
"content": f"""
根据评估结果生成邮件...
<evaluation>{evaluation}</evaluation>
"""
}]
)
return step3_response.content[0].text加入错误处理和重试
python
import json
def extract_with_retry(resume_text: str, max_retries: int = 3):
for attempt in range(max_retries):
try:
response = client.messages.create(...)
result = json.loads(response.content[0].text)
# 验证必要字段
if all(key in result for key in ['name', 'years_exp', 'skills']):
return result
except json.JSONDecodeError:
print(f"JSON解析失败,重试 {attempt + 1}/{max_retries}")
except Exception as e:
print(f"错误:{e},重试 {attempt + 1}/{max_retries}")
raise Exception("提取失败,请检查输入")提示词链 vs 一次性提示
| 维度 | 提示词链 | 一次性提示 |
|---|---|---|
| 复杂任务 | ✅ 更可靠 | ❌ 容易出错 |
| 简单任务 | ⚠️ 过度设计 | ✅ 更高效 |
| 调试难度 | ✅ 容易定位 | ❌ 难以定位 |
| Token消耗 | ⚠️ 较高 | ✅ 较低 |
| 响应时间 | ⚠️ 多次调用 | ✅ 一次调用 |
经验法则:
- 任务超过3个子步骤 → 用提示词链
- 任务简单直接 → 用一次性提示
小结
提示词链的核心要点:
| 要点 | 说明 |
|---|---|
| 分而治之 | 把复杂任务拆成独立子任务 |
| 单一职责 | 每步只做一件事 |
| 显式传递 | 明确传入上一步的输出 |
| 设置检查点 | 验证中间结果 |
开发者建议
在代码中实现提示词链时,建议在每一步之间加入输出验证逻辑——检查JSON格式是否正确、关键字段是否存在。发现异常时可以自动重试或切换到备用提示词。
下一步
学会了提示词链后,让我们学习 元提示,让AI帮你写和改进提示词。