Day 17 / 共 68 天 · 阶段 3 提示词工程

进阶 Prompt

昨天(Day 16)你学了基础 Prompt:明确指令、给例子、设角色、用分隔符。今天升级到"让模型答得更准更稳"的进阶招式:思维链(让它先想再答)、分步拆解、输出模板、自我批评。这些是把模型从"聪明但毛躁"调教成"靠谱"的关键手法。学完你的 prompt 就有"设计感"了;明天(Day 18)学怎么把有限的上下文空间用在刀刃上。

📍 你在阶段 3(提示词工程 D16-20)的位置
D16 Prompt 基础 D17 进阶 Prompt D18 上下文工程 D19 版本管理&A/B D20 注入防护
💡 用一套类比兜住今天(今天全程沿用「带一个聪明但毛躁的实习生」的世界观) 大模型 = 一个知识渊博、反应飞快,但爱抢答、一急就出错的实习生。基础 Prompt(昨天) = 交代清楚"干什么";进阶 Prompt(今天) = 教它怎么干才不出错思维链 = 逼它"先在草稿纸上算,别张口就来";分步 = 把大活拆成一二三步交办;输出模板 = 发一张"填空表格"让它照格式交;自我批评 = 交稿前先自己检查一遍再交。今天你从"下命令"升级成"会带人"。
L01

基础 Prompt 不够用了

🤔 痛点你按 Day16 学的把指令写清楚了,可一遇到需要推理、计算、多步骤的任务,模型还是会给出"看起来对、其实错"的答案,尤其数学题、逻辑题、复杂判断。
💡 本质模型是"顺着往下预测词"的(回忆 Day10),天生倾向脱口而出。就像那个毛躁实习生,你不拦着他,他会跳过思考直接抢答。进阶 Prompt 的核心,就是用话术逼它慢下来、把思考过程摊开
📝 举个例子:抢答就翻车 问:"小明有 5 个苹果,给了小红一半又多 1 个,还剩几个?"
❌ 直接问:模型常脱口"2 个"或"1.5 个"(算错)。
✅ 加一句"请一步步计算":它会写出"一半是 2.5,多 1 个共给 3.5……"从而更容易发现并算对。差别不在模型聪不聪明,在你有没有给它"想"的空间。
L02

思维链 CoT:让它先想再答

🤔 痛点怎么才能让模型"别抢答"?总不能每次都手把手教它算吧。
💡 本质思维链(Chain-of-Thought, CoT):在 prompt 里加一句"请一步步思考",模型就会先把推理过程一步步写出来,再给结论。因为它是顺着写的,把中间步骤写出来,等于给了它一张草稿纸,错误率大降。
# 只需在指令里加一句"引导思考"的话
prompt = """一个班 30 人,男生比女生多 6 人,男生几人?

请先一步步推理,最后单独用一行给出答案:答案:<数字>。"""
# 模型会先写:设女生 x,男生 x+6,x+(x+6)=30,2x=24,x=12,男生 18……
# 然后:答案:18
resp = client.chat.completions.create(model="gpt-4o-mini",
    messages=[{"role": "user", "content": prompt}])
print(resp.choices[0].message.content)
直接抢答 vs 思维链(先想再答) ❌ 直接问 问题 → 结论 跳过思考,易错 ✅ 思维链 问题 → 步骤① → ② → 结论 摊开推理,更准
图注:CoT 不改模型,只改你的提问方式——给它"想的空间",准确率显著提升。
👶 一个小提醒思维链会让输出变长(推理过程也算 token,回忆 Day13 计费)。如果只想要最终答案、不想让用户看到啰嗦过程,可以让它"思考过程写完后,最后单独一行给结论",程序再只截取最后那行。准确率 vs 成本的权衡,是进阶 prompt 的日常。
L03

分步拆解:把大活拆成小活

🤔 痛点你让它"帮我写一篇产品评测",结果它东一句西一句、结构混乱、还漏了关键点。一个大而模糊的任务,它抓不住重点。
💡 本质把一个大任务明确拆成有编号的几步,让模型按步骤走。就像给实习生派活:别说"把这事办了",而说"第一步查资料、第二步列提纲、第三步写正文"。步骤清晰,产出就稳。
prompt = """请按以下步骤帮我评测一款蓝牙耳机,逐步完成,每步用小标题:

步骤1:列出评测维度(音质、续航、佩戴、价格)
步骤2:对每个维度给 1-5 分并说明理由
步骤3:总结适合什么人买、不适合什么人
步骤4:给一句话购买建议

耳机信息:XX 耳机,续航 30 小时,售价 299 元,主打降噪。"""
# 模型会规规矩矩按 1234 步产出结构清晰的评测

👶 小白:分步和昨天说的"思维链"不是差不多吗?都是一步步。

👨‍🏫 老师:好问题!区别在谁来定步骤。思维链是让模型自己去想中间推理(主要为了算得准);分步拆解是你替它规定好干活的流程(主要为了产出结构清晰、不漏项)。前者治"想不清",后者治"做得乱"。实战里常两个一起用:你定大流程,每步内部让它 CoT。

L04

输出模板:发一张"填空表"

🤔 痛点模型今天用这种格式、明天换那种格式,你的程序想稳定地"抠出某个字段"根本没法写——格式飘忽是自动化的天敌。
💡 本质直接给它一张固定格式的模板,要求照着填。就像发给实习生一张表格让他填空,而不是让他自由发挥写作文。格式一稳,后续程序处理就轻松。
prompt = """判断下面这条用户评论的情绪,严格按此模板输出,不要多余的话:

情绪:<正面/负面/中性>
关键词:<最多3个,逗号分隔>
一句话理由:<不超过20字>

评论:这手机拍照真心不错,但电池太不耐用了。"""
# 模型会稳定输出:
# 情绪:中性
# 关键词:拍照好,电池差
# 一句话理由:优点缺点都明显
📝 举个例子:为什么模板对程序至关重要 有了固定模板,你的 Python 就能可靠地按行拆分、取出"情绪"那一项去分类统计。这是走向"结构化输出"(Day14 讲的 JSON mode)的过渡——模板是给人也给程序看的半结构化约定,JSON 是给程序看的严格结构化约定,思路一脉相承。
👶 用分隔符锁住输入回忆 Day16 的分隔符技巧:把要处理的"评论内容"用 <评论>...</评论> 或三引号包起来,能让模型清楚分辨"哪些是指令、哪些是待处理的数据",避免它把评论里的话当成命令去执行(这也是 Day20 防注入的基础)。
L05

自我批评:交稿前先自查一遍

🤔 痛点模型第一版答案常有小疏漏——漏个条件、算错一步、语气不对。你总不能每次都人肉检查吧?
💡 本质自我批评(self-critique):让模型先给答案,再自己挑毛病,然后给出改进版。就像要求实习生"交稿前先自己审一遍,把问题标出来再修"。多这一步,质量往往明显提升。
prompt = """任务:给"新用户注册后 3 天没登录"的用户写一条召回短信(限50字)。

请分三部分输出:
1) 初稿:先写一版
2) 自查:从"是否有明确行动号召、是否超字数、语气是否亲切"三点挑毛病
3) 终稿:根据自查修改后的最终版本"""
# 模型会写初稿 → 自己指出"缺少优惠钩子/超了3字" → 给出改进的终稿
👶 这就是 Agent 的"反思"雏形今天你在一个 prompt 里让模型"自答自查自改"。等学到 Agent(Day33 起),会把这拆成多轮:一个"执行"角色出稿、一个"批评家(critic)"角色审查、再回炉。自我批评是通往"可信 Agent"(Day53 防幻觉 Critic)的第一块砖。
📝 举个例子:自查清单越具体越有效 别只说"检查一下"——那等于没说。要给明确的检查项:如"①是否漏了预算约束 ②数字是否前后一致 ③是否回答了用户真正的问题"。清单越具体,模型挑出的毛病越到位,改进越实在。
L06

组合技 & 别过度

🤔 痛点招式学了一堆,实战里该怎么搭配?是不是每次都把 CoT + 分步 + 模板 + 自查全堆上,效果最好?
💡 本质按任务性质组合几招,但别贪多——每多一招都增加输出长度和成本(Day13),还可能让模型跑偏。抓主要矛盾:要准用 CoT、要有条理用分步、要好解析用模板、要高质量用自查。
任务类型推荐组合为什么
数学/逻辑/推理CoT + 末行给结论先想清楚,程序好截取
生成结构化内容(报告/评测)分步 + 输出模板流程清晰、格式稳定
分类/抽取(给程序用)输出模板 + 分隔符便于可靠解析
高质量文案/重要决策分步 + 自我批评先出稿再自查,减少疏漏
👶 别把 prompt 写成小作文新手常犯的错:把所有技巧和废话全塞进去,prompt 长得离谱。模型面对超长啰嗦指令反而抓不住重点(这正好引出明天 Day18 的"上下文预算")。原则:能少一句是一句,每句都为准确/结构/质量服务。
L07

今日小结 + 动手 10 分钟

🧠 今天你应该能回答

  • 模型为什么爱"抢答出错"?进阶 prompt 的核心思路是什么?
  • 思维链 CoT 是什么?为什么加一句"一步步想"就能提准确率?
  • "分步拆解"和"思维链"的区别是什么?(你定流程 vs 它自己推理)
  • 输出模板解决什么问题?和 JSON 结构化输出什么关系?
  • 自我批评怎么用?为什么说它是 Agent"反思"的雏形?

✋ 动手 10 分钟:给同一任务写"基础版 vs 进阶版"对比

用 Day11 的环境,新建 prompt_compare.py,亲手感受进阶技巧的威力:

from openai import OpenAI
from dotenv import load_dotenv
load_dotenv()
client = OpenAI()

question = "一件商品原价 200 元,先涨价 20%,再打 8 折,最终价格是多少?"

def ask(prompt):
    r = client.chat.completions.create(model="gpt-4o-mini",
        messages=[{"role": "user", "content": prompt}])
    return r.choices[0].message.content

print("=== 基础版(直接问)===")
print(ask(question))

print("\n=== 进阶版(思维链 + 模板)===")
print(ask(question + "\n\n请一步步计算,最后单独一行输出:最终价格:<数字>元。"))

对比两版:进阶版会先写出"200×1.2=240,240×0.8=192"的推理,答案更可信。试着再给它加一句"算完自查一遍是否算错",看看变化。

明日预告 · Day 18:招式再好,也塞不进无限多的字——模型的上下文窗口是有限且要花钱的。明天学 上下文工程:怎么给有限的窗口做"预算"、只放真正相关的信息、把长对话历史压缩成摘要,还有一个反常识的现象——"lost in the middle"(放中间的信息模型容易忽略)。这是让 Agent 又准又省的关键内功。
← Day 16 · Prompt 基础 Day 18 · 上下文工程 →