Prompt Engineering 进阶:从"写指令"到"设计可迭代的提示词系统"
在上一篇文章《一场让人眼前一亮的AI产品经理面试》中,我们分享了一位候选人的故事——他没有直接写指令,而是用分层框架、Few-shot设计、反馈闭环来设计Prompt,让面试官眼前一亮。
这篇文章系统讲解他展现的 5个关键认知,每个认知都配有实战案例和代码示例,帮你从"会写指令"升级到"会设计提示词系统"。
认知 1:解构能力——先定义"什么是好的"
核心思想
大多数人写Prompt时,直接说"帮我写一封邮件"。而优秀的设计师会先问:"什么是'好的邮件'?"
解构能力,就是把模糊的"好",拆解成具体的、可执行的维度。
实战案例:面试邀约邮件
差的Prompt:
帮我写一封面试邀约邮件。
好的Prompt(解构后):
请帮我写一封面试邀约邮件,要求:
1. 语气:专业但不冷淡,体现对候选人的尊重
2. 结构:
- 开头:感谢候选人的时间 + 简要介绍公司(1-2句)
- 中间:岗位亮点 + 候选人匹配度(为什么是他/她)
- 结尾:面试安排 + 期待回复
3. 字数:200-300字
4. 避免:薪资面议、急招、过度吹嘘公司
解构清单
对任何Prompt,都可以用这个清单解构:
| 维度 | 问题 | 示例 |
|---|---|---|
| 目标 | 这次生成要达成什么目的? | 说服候选人接受面试 |
| 受众 | 给谁看?他关心什么? | 候选人关心发展空间、团队氛围 |
| 风格 | 正式/亲切/技术/简洁? | 专业但不冷淡 |
| 结构 | 必须包含哪些部分? | 开头感谢 + 岗位亮点 + 面试安排 |
| 约束 | 不能出现什么? | 不能"薪资面议"、不能过度承诺 |
| 衡量标准 | 怎么判断生成结果好不好? | 候选人回复率、面试到场率 |
认知 2:框架化思维——四层结构管理质量
核心思想
把Prompt分成四层,每层负责一件事:
第一层:角色设定 → AI是谁、有什么能力
第二层:任务描述 → 输入什么、输出什么
第三层:格式规范 → 怎么写、写多长
第四层:约束条件 → 不能写什么
代码实现:四层Prompt模板
class PromptTemplate:
"""四层提示词模板"""
def __init__(self, role, task, format_rules, constraints):
self.role = role # 第一层:角色
self.task = task # 第二层:任务
self.format = format_rules # 第三层:格式
self.constraints = constraints # 第四层:约束
def build(self, variables=None):
"""构建最终Prompt"""
prompt = f"""# 角色
{self.role}
# 任务
{self.task}
# 格式要求
{self.format}
# 约束
{self.constraints}
"""
if variables:
prompt = prompt.format(**variables)
return prompt
# 使用示例:面试邀约邮件生成器
prompt = PromptTemplate(
role="""你是一位资深HRBP,在互联网行业有8年招聘经验。
你熟悉公司文化和岗位要求,擅长写出专业且有温度的招聘文案。
你的目标是让候选人感受到被重视,同时清晰传达面试信息。""",
task="""请为以下候选人生成面试邀约邮件:
- 候选人姓名:{name}
- 应聘岗位:{position}
- 面试时间:{interview_time}
- 面试地点:{location}
- 岗位亮点:{highlights}
- 候选人匹配度:{match_reason}""",
format="""邮件结构:
1. 开头:感谢候选人的时间 + 一句话介绍公司
2. 中间:岗位亮点(为什么这个岗位值得加入)+ 候选人匹配度(为什么是他/她)
3. 结尾:面试时间地点 + 期待回复
字数:200-300字
语气:专业但不冷淡,体现对候选人的尊重""",
constraints="""禁止出现:
- "薪资面议"(薪资信息请见岗位详情)
- "急招"(避免给候选人压力)
- 过度吹嘘公司(保持真实可信)
- 超过300字(避免冗长)"""
)
# 生成
final_prompt = prompt.build({
"name": "张三",
"position": "AI产品经理",
"interview_time": "2024年6月15日 14:00",
"location": "北京市海淀区xxx大厦",
"highlights": "团队来自BAT,产品用户过千万",
"match_reason": "3年AI产品经验,有成功落地案例"
})
print(final_prompt)
四层结构的好处
| 层 | 作用 | 好处 |
|---|---|---|
| 角色 | 设定AI的身份和能力 | 输出风格更一致 |
| 任务 | 明确输入和输出 | 减少歧义 |
| 格式 | 规定结构和长度 | 输出格式统一 |
| 约束 | 明确禁止事项 | 避免低级错误 |
认知 3:示例驱动——Few-shot的决定性作用
核心思想
与其用语言描述"请写得亲切",不如给一个真实的亲切案例让模型模仿。
Few-shot = 给AI看1-3个真实案例,让它学会"什么是好的"。
实战对比
没有Few-shot:
请写一封亲切的面试邀约邮件。
→ AI可能生成过度热情、不够专业的内容。
有Few-shot:
请参考以下高转化邮件的语气和结构,生成新的面试邀约邮件:
【案例】
Hi 小明,
感谢你抽出时间了解我们的产品总监岗位!我们团队在AI方向做了3年,
产品刚突破百万日活,正需要像你这样有增长经验的人。
下周三下午2点方便来聊聊吗?我们想听听你对AI产品增长的看法。
期待见面!
李华
请为以下候选人生成邮件:{候选人信息}
→ AI会模仿案例的语气:简洁、真诚、有吸引力。
代码实现:Few-shot管理
class FewShotManager:
"""Few-shot案例库管理"""
def __init__(self):
self.examples = []
def add_example(self, input_text, output_text, score=1.0):
"""添加案例,score表示转化率/满意度"""
self.examples.append({
"input": input_text,
"output": output_text,
"score": score
})
def get_top_k(self, k=2):
"""获取得分最高的K个案例"""
sorted_examples = sorted(self.examples, key=lambda x: x["score"], reverse=True)
return sorted_examples[:k]
def build_few_shot_prefix(self, k=2):
"""构建Few-shot前缀"""
top_examples = self.get_top_k(k)
prefix = "以下是几个高转化的邮件案例,请参考其语气和结构:\n\n"
for i, ex in enumerate(top_examples, 1):
prefix += f"【案例{i}】\n{ex['output']}\n\n"
prefix += "请参考以上案例,为以下候选人生成邮件:\n"
return prefix
# 使用
manager = FewShotManager()
manager.add_example("候选人A", "Hi 小明,感谢你抽出时间...", score=0.85)
manager.add_example("候选人B", "Hi 小红,恭喜你通过简历筛选...", score=0.78)
manager.add_example("候选人C", "Hi 小李,看了你的作品集...", score=0.92)
prefix = manager.build_few_shot_prefix(k=2)
# 结果:得分最高的2个案例被选中
Few-shot的3个关键原则
- 质量优先于数量:1个高质量案例 > 5个普通案例
- 多样性覆盖:案例应覆盖不同场景(不同岗位、不同候选人背景)
- 持续更新:定期用新数据替换低分案例
认知 4:反馈闭环——把"不满意"变成优化信号
核心思想
当用户点击"换一版"时,这不是失败,而是数据。
反馈闭环 = 记录用户行为 → 分析被拒原因 → 自动优化Prompt
反馈闭环设计
用户点击"换一版"
↓
记录被拒版本的特征(太啰嗦/太官方/不够吸引人)
↓
更新Prompt的约束条件
↓
生成新版时自动规避已知问题
代码实现:反馈闭环系统
class FeedbackLoop:
"""Prompt反馈闭环"""
def __init__(self):
self.rejection_reasons = {
"too_long": 0,
"too_formal": 0,
"too_casual": 0,
"not_attractive": 0,
"too_short": 0
}
self.constraint_adjustments = {
"too_long": "字数严格控制在200字以内",
"too_formal": "语气亲切,像朋友聊天",
"too_casual": "保持专业,避免过度口语化",
"not_attractive": "开头3行必须突出岗位亮点",
"too_short": "至少包含3个段落"
}
def record_rejection(self, reason):
"""记录被拒原因"""
if reason in self.rejection_reasons:
self.rejection_reasons[reason] += 1
def get_adjusted_constraints(self):
"""根据反馈调整约束条件"""
constraints = []
for reason, count in self.rejection_reasons.items():
if count >= 2: # 同一原因被拒2次以上
constraints.append(self.constraint_adjustments[reason])
return constraints
def build_improved_prompt(self, base_prompt):
"""构建改进后的Prompt"""
adjustments = self.get_adjusted_constraints()
if not adjustments:
return base_prompt
adjustment_text = "\n\n# 根据用户反馈,请特别注意:\n"
for adj in adjustments:
adjustment_text += f"- {adj}\n"
return base_prompt + adjustment_text
# 使用
loop = FeedbackLoop()
# 模拟用户反馈
loop.record_rejection("too_long") # 第1次:太长了
loop.record_rejection("too_formal") # 第2次:太官方
loop.record_rejection("too_long") # 第3次:又太长了
# 获取改进后的约束
print(loop.get_adjusted_constraints())
# → ['字数严格控制在200字以内', '语气亲切,像朋友聊天']
反馈闭环的数据价值
| 被拒原因 | 出现频率 | 优化动作 |
|---|---|---|
| 太啰嗦 | 30% | 增加字数限制 |
| 太官方 | 25% | 调整角色设定为"朋友" |
| 不够吸引人 | 20% | 增加Few-shot案例 |
| 信息不全 | 15% | 增加必填字段 |
| 其他 | 10% | 人工分析 |
认知 5:产品化视角——把Prompt当产品迭代
核心思想
传统观念:Prompt写完就完事。
产品化视角:Prompt是需要A/B测试、版本管理、持续优化的核心资产。
Prompt版本管理
class PromptVersionManager:
"""Prompt版本管理"""
def __init__(self):
self.versions = []
def create_version(self, prompt_text, description, metrics=None):
"""创建新版本"""
import hashlib
version_id = hashlib.md5(prompt_text.encode()).hexdigest()[:8]
self.versions.append({
"id": version_id,
"prompt": prompt_text,
"description": description,
"metrics": metrics or {},
"created_at": "2026-06-11"
})
return version_id
def get_best_version(self, metric="conversion_rate"):
"""获取表现最好的版本"""
return max(self.versions, key=lambda v: v["metrics"].get(metric, 0))
def ab_test(self, version_a_id, version_b_id):
"""A/B测试两个版本"""
version_a = next(v for v in self.versions if v["id"] == version_a_id)
version_b = next(v for v in self.versions if v["id"] == version_b_id)
return {
"version_a": version_a["metrics"],
"version_b": version_b["metrics"],
"winner": "A" if version_a["metrics"].get("conversion_rate", 0) >
version_b["metrics"].get("conversion_rate", 0) else "B"
}
# 使用
manager = PromptVersionManager()
v1 = manager.create_version(prompt_v1, "基础版:简单指令", {"conversion_rate": 0.15})
v2 = manager.create_version(prompt_v2, "进阶版:分层框架", {"conversion_rate": 0.28})
v3 = manager.create_version(prompt_v3, "完整版:分层+Few-shot+反馈", {"conversion_rate": 0.42})
best = manager.get_best_version()
print(f"最佳版本:{best['description']},转化率:{best['metrics']['conversion_rate']:.0%}")
Prompt产品化检查清单
| 维度 | 检查项 | 状态 |
|---|---|---|
| 版本管理 | 是否有版本历史? | ☐ |
| A/B测试 | 是否定期测试不同Prompt? | ☐ |
| 数据追踪 | 是否记录用户反馈? | ☐ |
| 迭代机制 | 是否有自动优化流程? | ☐ |
| 质量监控 | 是否监控输出质量? | ☐ |
| 文档化 | 是否记录Prompt设计思路? | ☐ |
学习路径推荐
入门
- 课程:DeepLearning.AI《ChatGPT Prompt Engineering》(吴恩达)
- 工具:OpenAI Playground、PromptPerfect
- 社区:Prompt Engineering Guide、r/PromptEngineering
进阶
- 教程:LangChain官方文档、LlamaIndex教程
- 工具:Coze、Dify的Prompt调试功能
- 书籍:《AI产品经理的Prompt实战手册》、《大模型应用开发极简入门》
实践
- 从简单任务开始(摘要、分类、生成)
- 逐步增加复杂度(多轮对话、Agent、工具调用)
- 建立自己的Prompt模板库和案例库
总结
| 认知 | 核心 | 行动 |
|---|---|---|
| 解构能力 | 先定义"什么是好的" | 用清单拆解模糊需求 |
| 框架化思维 | 四层结构管理质量 | 角色+任务+格式+约束 |
| 示例驱动 | Few-shot稳定输出 | 建立高质量案例库 |
| 反馈闭环 | 把不满意变成数据 | 记录被拒原因,自动优化 |
| 产品化视角 | Prompt是核心资产 | 版本管理、A/B测试、持续迭代 |
一句话总结: Prompt Engineering 不是"会写指令",而是"会设计系统"。把Prompt当成产品来设计,用数据驱动迭代,才能真正发挥AI的潜力。
📌 关联阅读:
- 面试案例:一场让人眼前一亮的AI产品经理面试:他开口,我就知道他很懂Prompt
- Vibe Coding 系列:2026 年 Vibe Coding 技术栈选型指南
