吴恩达 Prompt 工程课精讲③:三次迭代,解决 Prompt 的三大致命问题(JupyterLab 实战)
"好提示词不是写出来的,是通过识别失败、精准修正迭代出来的。"
------ 吴恩达《ChatGPT Prompt Engineering for Developers》
在课程第3章,吴恩达通过一个电商产品描述生成任务,展示了如何通过三轮迭代,解决三个典型问题:
- 输出过长 → 超出商品卡片展示空间
- 关注错误细节 → 混入用户主观情绪,而非产品事实
- 忽略规模表 → 未使用"小/中/大"等标准化描述
本文将在 JupyterLab 中复现这一过程,带你体验问题驱动的 prompt 优化。
python
from openai import OpenAI
client = OpenAI(
api_key="sk-7a0c8ef9e5********b9d0a0d4",
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
def get_completion(prompt, model="qwen3-max"):
messages = [{"role": "user", "content": prompt}]
response = client.chat.completions.create(
model=model,
messages=messages,
stream=False
)
return response.choices[0].message.content
📝 任务背景:从用户评论生成产品描述
python
customer_review = """
我上周买了这个儿童书包,整体还不错,但有几个问题:
首先,它比我想象中小很多,我儿子一年级,书本放进去拉链都拉不上;
其次,肩带有点硬,孩子说背一天肩膀疼;
不过颜色确实很鲜艳,蓝色很正,孩子很喜欢。
总的来说,性价比一般吧。
"""
🎯 业务目标 :生成一条简洁、客观、标准化的产品描述,用于商品详情页。
🔁 第1轮:初始 Prompt(问题爆发)
python
prompt_v1 = f"""
根据以下用户评论,生成一段产品描述。
评论:
{customer_review}
"""
response_v1 = get_completion(prompt_v1)
print(response_v1)
这款儿童书包以鲜艳正蓝色设计,外观亮眼,深受孩子喜爱。轻巧造型适合日常上学使用,但在实际容量和舒适度方面仍有提升空间:书包内部空间相对紧凑,对于一年级学生较多课本的收纳可能略显不足;肩带材质偏硬,长时间背负可能造成肩部不适。如果您注重外观与价格的平衡,这款书包可作为基础选择,但建议根据孩子的具体需求评估其收纳与背负舒适性。
❌ 三大问题暴露:
- 文本过长:输出约 150 字,而商品卡片通常只容 40--60 字
- 关注错误细节 :提到"肩部不适""收纳不足"等负面主观体验
- 未用规模表:描述为"空间相对紧凑",而非"尺寸:小号"
🔴 v1 完全不可用:既不专业,也不符合电商规范。
🔁 第2轮:解决"长度"与"细节"问题
python
prompt_v2 = f"""
你是一名电商文案编辑。请根据以下用户评论,生成一段**客观、简洁**的产品描述。
要求:
- 仅描述产品**客观特性**(如颜色、尺寸、材质)
- **不要包含**用户主观感受、问题或评价(如"背起来疼""性价比低")
- 描述长度**不超过50字**
- 用中文
评论:
{customer_review}
"""
response_v2 = get_completion(prompt_v2)
print(response_v2)
儿童书包,蓝色,尺寸较小,肩带较硬,材质未说明。
✅ 改进:
- 长度控制在 50 字内 ✅
- 去掉"肩膀疼""性价比"等主观内容 ✅
❌ 仍存在问题:
- 尺寸描述为:"尺寸较小" → 未使用标准规模表(应为"小号")
🔁 第3轮:引入"规模表"约束(课程关键!)
python
prompt_v3 = f"""
你是一名电商文案编辑。请根据以下用户评论,生成一段产品描述。
要求:
- 仅描述**客观特性**:颜色、尺寸、材质
- **尺寸必须使用以下规模表**:小号 / 中号 / 大号(根据评论推断)
- **不要包含**任何用户主观评价、问题或情绪
- 总长度**不超过40字**
- 用中文
评论:
{customer_review}
"""
response_v3 = get_completion(prompt_v3)
print(response_v3)
蓝色儿童书包,小号,材质未说明
✅ 自动化验证三大问题是否解决
python
def validate_product_description(desc: str) -> dict:
checks = {
"length_ok": len(desc) <= 40,
"no_subjective": not any(word in desc for word in ["疼", "喜欢", "性价比", "问题", "失望"]),
"has_standard_size": any(size in desc for size in ["小号", "中号", "大号"])
}
return checks
result = validate_product_description(response_v3)
print(result)
✅ 全部通过!v3 可直接使用
吴恩达的迭代方法论总结
迭代 | 识别的问题 | 引入的约束 |
---|---|---|
v1 → v2 | 过长 + 主观 | 限制长度 + 禁止主观内容 |
v2 → v3 | 非标准化描述 | 强制使用"规模表" |
核心思想 :
每一次迭代,都是对业务规则的一次显式编码。
📌 行动清单
- 在你的任务中,列出输出可能存在的 3 个典型问题
- 为每个问题设计一条 明确约束(如"不超过X字""必须使用Y术语")
- 在 JupyterLab 中用
validate
函数自动检查 - 将最终 prompt 保存为 `product_desc_prompt.txt
👋 作者:Imnobody | 专注 LLM 应用开发
💬 欢迎在评论区分享你的 prompt 踩坑经历!