吴恩达 Prompt 工程课精讲②:写出高可靠 Prompt 的2大黄金法则(附 Python 工程代码)
"如果你只记住两件事,请记住:1. 指令要清晰具体;2. 复杂任务要分步思考。"
------ 吴恩达《ChatGPT Prompt Engineering for Developers》
上一篇我们讲了"为什么开发者要学提示词工程"。
今天,我们进入实战核心 :如何写出高准确率、可工程化的提示词?
吴恩达在课程第2章《Guidelines for Prompting》中,只强调了两个原则,却覆盖了 90% 的高质量 prompt 场景:
- 清晰具体的指令(Be Specific and Clear)
- 思维链推理(Use Chain-of-Thought)
本文不仅详解原理,更提供可直接运行的 Python 代码,教你如何将这两个原则落地到真实项目中。
🧱 法则一:清晰具体的指令 ------ 让模型"无法误解你"
❌ 为什么模糊指令会失败?
python
# Bad Prompt 示例
prompt = "写点关于健康的内容。"
模型可能返回:
- 一篇 2000 字医学论文
- 一条"多喝水"的微博
- 一段健身教练的推销话术
问题 :你没告诉模型:写给谁?写多长?聚焦什么?用什么语气?
✅ 正确姿势:四维明确法
吴恩达建议,一个好指令应包含:
- What:任务目标
- How:格式/长度/语气
- For Whom:目标受众
- Constraints:禁忌或边界
🧪 代码示例:生成结构化用户回复
python
from openai import OpenAI
from pydantic import BaseModel, ValidationError
import json
client = OpenAI()
class CustomerResponse(BaseModel):
reply: str
tone: str # "polite" or "urgent"
def generate_customer_reply(user_complaint: str) -> CustomerResponse:
prompt = f"""
你是一名电商客服。请根据以下用户投诉,生成一条回复。
要求:
- 用中文,语气礼貌且专业
- 回复不超过 60 字
- 不要承诺具体处理时间
- 表达"我们已收到并正在处理"
用户投诉:
"{user_complaint}"
请以 JSON 格式输出,包含字段:reply(字符串)、tone("polite")。
不要包含任何其他文字。
"""
response = client.chat.completions.create(
model="gpt-4-turbo",
messages=[{"role": "user", "content": prompt}],
temperature=0.0 # 降低随机性
)
try:
output = json.loads(response.choices[0].message.content)
return CustomerResponse(**output)
except (json.JSONDecodeError, ValidationError) as e:
raise ValueError(f"模型输出格式错误: {e}")
# 测试
complaint = "订单三天了还没发货,急着用!"
result = generate_customer_reply(complaint)
print(result.reply) # → "您好,您的反馈我们已收到,正在加急处理中,感谢您的耐心!"
💡 关键点 :通过
Pydantic
强制校验输出结构,确保程序可消费。
🧠 法则二:思维链(Chain-of-Thought)------ 让模型"慢下来思考"
❌ 为什么直接问答案会出错?
问题:一个班级30人,20人喜欢数学,15人喜欢语文,8人两科都喜欢,多少人两科都不喜欢?
模型可能直接答:"5人"(错误!正确是 3 人)。
原因:模型跳过了"去重"步骤。
✅ 正确姿势:强制分步推理
吴恩达指出: "对于任何需要推理的任务,加上'请一步步思考'能显著提升准确率。"
🧪 代码示例:带 CoT 的数学推理 + 结果提取
python
import re
def solve_set_problem() -> int:
prompt = """
一个班级有30名学生。
- 20人喜欢数学
- 15人喜欢语文
- 8人两科都喜欢
请问有多少人两科都不喜欢?
请一步步推理,并在最后一行以"答案:X人"的格式给出最终结果。
"""
response = client.chat.completions.create(
model="gpt-4-turbo",
messages=[{"role": "user", "content": prompt}],
temperature=0.0
)
text = response.choices[0].message.content
print("模型推理过程:\n", text)
# 从最后一行提取答案
match = re.search(r"答案:(\d+)人", text)
if match:
return int(match.group(1))
else:
raise ValueError("未找到答案格式")
# 测试
answer = solve_set_problem()
print("最终答案:", answer) # → 3
🔍 输出示例:
ini喜欢至少一科的人数 = 20 + 15 - 8 = 27 两科都不喜欢 = 30 - 27 = 3 答案:3人
💡 工程技巧 :即使模型自动推理,显式要求 CoT 仍可提升准确率 15--30% (尤其在数学/逻辑场景)。
🛠️ 进阶:将两大法则结合到生产系统
在真实项目中,你往往需要同时满足清晰指令 + 结构化输出 + CoT 推理。
🌰 场景:金融风险评估
python
class RiskAssessment(BaseModel):
risk_level: str # "low", "medium", "high"
reasoning: str # 简要推理
def assess_loan_risk(income: int, debt: int, history: str) -> RiskAssessment:
prompt = f"""
你是一名银行风控专家。请评估以下用户的贷款风险:
- 月收入:{income} 元
- 月负债:{debt} 元
- 信用历史:{history}
请按以下步骤分析:
1. 计算负债收入比(DIR = 负债 / 收入)
2. 结合信用历史判断还款意愿
3. 综合给出风险等级(low/medium/high)
最后,以严格 JSON 格式输出,包含:
- "risk_level": 字符串
- "reasoning": 不超过 50 字的中文推理
不要包含其他内容。
"""
# ...(调用 API + Pydantic 校验,同上)
✅ 小结:两大黄金法则的工程价值
法则 | 解决什么问题 | 工程收益 |
---|---|---|
清晰具体 | 输出不可控、格式混乱 | 可解析、可集成、可测试 |
思维链 | 复杂任务准确率低 | 可解释、可 debug、可审计 |
记住:
- 不要指望模型"猜你心思"
- 不要跳过"中间步骤"
- 好 prompt = 明确需求 + 强制约束 + 可验证输出
📌 行动清单(开发者自查)
- 我的 prompt 是否明确了受众、长度、格式、语气?
- 复杂任务是否要求"一步步思考"?
- 输出是否能被程序直接解析(JSON/Pydantic)?
- 是否设置了
temperature=0
以保证确定性?
下一篇文章预告:《吴恩达 Prompt 工程课精讲③:提示词也要"敏捷开发"?迭代优化实战指南》------我们将用 Git 管理 prompt,像写代码一样迭代优化!
👋 作者:Imnobody | 专注 LLM 应用开发
💬 欢迎在评论区分享你的 prompt 踩坑经历!