Prompt Engineering 进阶:从写指令到设计可迭代的提示词系统

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. 质量优先于数量:1个高质量案例 > 5个普通案例
  2. 多样性覆盖:案例应覆盖不同场景(不同岗位、不同候选人背景)
  3. 持续更新:定期用新数据替换低分案例

认知 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的潜力。


📌 关联阅读: