跳转至

分解问题与写提示 — 全书枢纽的 CCG 框架

这一章讲什么: 多数人用 AI 写代码的第一种死法是「一句话需求 → 一大段代码 → 跑不通」。 病根不在 AI,在于问题没被拆开、话没说清楚。这一章给两个工具: 问题分解(把大需求拆成小步骤)和 CCG 框架(背景、约束、目标)。 后面七章的每一个项目,都是这两个工具的重复演示。这是全书最该慢读的一章。

1. 这一章讲什么

第二章练的是「读得懂」——能审判 AI 给你的代码。但审判之前得先有代码, 而代码的质量,在你按下回车之前就被决定了:你问得越模糊,AI 答得越凑合。 这一章解决「怎么说」。

书里给这句话定了调:「prompt engineering(提示工程)」这个词被炒作得很玄, 剥掉炒作,它的核心是把大而乱的问题拆成小而有逻辑的步骤——清晰到连机器都能懂6。 也就是说,第三章和第?章的调试、第 5–9 章的项目之间,是「方法」与「应用」的关系: 本章是全书的枢纽。

2. 顶层全景:从一句话到能跑的程序

  「帮我做个费用工具」(模糊请求)
      │  分解:这个目标底下藏着哪几步?
      ▼
  记录一笔 → 存进 CSV → 按月汇总 → 显示摘要 → 菜单循环
      │  每一步写成一条 CCG 提示
      ▼
  背景(我在做什么) + 约束(用什么、不用什么) + 目标(输出长什么样)
      │  逐条生成 → 逐条运行 → 逐条追问
      ▼
  一个能跑的命令行程序(边做边懂,而不是一次性猜)

  图说:箭头上的三步,就是本章的三节;最后的程序是第 5 节的主线例子。

3. 核心原理

3.1 为什么「分解」是隐形技能

书里开篇的观察:问资深开发者每天都在干什么,他不会说「写代码」,而会说 「花半天搞清真正的问题是什么」7。写代码早已不是难事,想清楚才是。

一个典型的「看起来简单」的需求:「写个脚本,把三个区域的每日销售报表自动化, 并把摘要邮件发给团队。」8 一句话,但你真动手就会发现它不是一个问题, 是五六个问题挤在一句话里:

  1. 从每个区域取销售数据(API、CSV 或数据库);
  2. 清洗并合并数据集;
  3. 计算每日汇总和关键指标;
  4. 格式化成可读的报告;
  5. 自动发邮件。

拆完之后,每一步都可以单独喂给 AI、单独测试、单独改进。这就是问题分解 (problem decomposition):解开复杂性的手艺9。它还顺手给了你一张路线图, 让你在动手前不至于淹在细节里。

AI 怎么想,决定了你为什么要拆。 书里讲得很直白:ChatGPT 并不像人那样 「理解」问题,它完全依赖你描述得有多清楚——请求模糊,结果就模糊; 目标 layered and unstructured(一层套一层、没有结构),它走到一半就迷路; 把问题组织成逻辑步骤,你就给了它一张可以跟着走的地图10。

书里给了一组对照(这是本章最该记住的图):

模糊版 分解版
提示 "Create a Python app that analyzes user feedback and finds trends."(做个分析用户反馈找趋势的应用) ① 加载用户反馈的 CSV 文件 ② 找出最常见的主题或关键词 ③ 以汇总表展示结果
AI 的反应 自由发挥,常常答非所问 像照着清单干活:每步产出可用的模块化代码,哪步不合适可以单独换掉

注意分解版的三条读起来就是一张清单(checklist)——这是刻意的设计: 清单式的步骤让 AI 能系统地逐条处理,你可以精修或替换其中一步而不必从头再来11。

3.2 拆得好不好的五条自检

书里给了一张快速检查单,动手前先过一遍12:

  1. 每一步能用一句话说清;
  2. 每一步能独立测试;
  3. 每一步的输入和输出你能描述出来;
  4. 调换或替换某一步,不会弄坏其他步;
  5. 你能让 ChatGPT 一次只处理一块,而不混乱。

五条全过,这个问题就拆到了「足以与 AI 有效协作」的粒度。 书里补了一句要紧的:分解不是把问题简单化,是把问题想清楚—— 你是在磨刀,不是在降格13。

3.3 分解与提示是同一枚硬币的两面

「怎么问」和「问什么」同样重要。书里打了个比方:写提示像给一个从没见过你项目的人指路—— 你把整本小说递给他只说「改好点」,他会瞪着你;你递一章过去说 「这段节奏改紧凑些,语气保持严肃,删掉不必要的句子」,他就能干活了14。 AI 就是那个没见过你项目的人。

「一次压倒性的大请求 vs 一串有组织的微任务」的对比,书里又演示了一遍, 这次的例子是数据看板:

  • 模糊版:"Build a data visualization dashboard using Python." → AI 大概率给你一张 matplotlib 默认图加假数据15。
  • 分解版是四条提示,一条一步:读 CSV 进 pandas DataFrame(数据框,二维表格数据结构)→ 写函数算月度增长与区域表现 → 用 Plotly 画交互图 → 用 Streamlit 包个网页界面16。

四条提示给了 AI 清晰的边界:每步干什么、输入是什么、期待什么输出。 它的角色从「瞎编一个完整看板」变成「按你的架构干活的初级开发」17。 书里把这一步的收获说得很形象:你从「使用一个 AI 工具」变成「领导一个 AI」, 你的提示开始像给同事的工作指令18。

一个可复用的提示骨架。 书里给出了高质量提示的四件套,顺序固定19:

部件 回答的问题 书里的例子(爬虫)
Context 背景 你在做什么、为什么 「我在写一个抓电商网站商品价格的爬虫」
Task 任务 具体要 AI 干什么 「写一个用 BeautifulSoup 提取商品名和价格的函数」
Constraints 约束 规则与限制 「缺价格要优雅处理;用 requests,别用 Selenium」
Goal 目标 最终输出长什么样 「返回字典列表,键:name、price、url」

习惯这个结构后会发生两件事:AI 的代码更准、更可维护;而你自己想问题也更清楚了—— 写提示的结构化训练,反过来训练你的分解能力20。

一个具体的「提示链」示范:批量改名命令行工具。 书里把同一个工具拆成三条提示, 一条一个阶段21:

  1. (Setup)「生成用 os.listdir() 读某文件夹全部文件名的代码。」
  2. (Logic)「加上按 newname_1.jpg、newname_2.jpg 这样的规律改名的逻辑。」
  3. (Safety)「改成改名前先要确认,并给所有改过的文件建日志。」

每条都小、可测、清楚。这就是分解直接流入提示设计的样子。

「对话」原则。 书里提醒:好提示不是命令,是协作的邀请。 像「这是我的报表生成函数,能跑但慢,能给点优化建议吗?」—— 这是在请 AI 反馈,而不是下指令。把 AI 当伙伴而不是黑盒,提示会更丰富,结果会更「有人味」22。

五个常见错误(书里逐条点名,都是真实高频)23:

错误 为什么错 改法
一次问完所有事 超出 AI 的注意力预算 拆成小的、可测的提示
跳过背景 AI 不知道代码为何存在 给用途、使用者、最在意什么
以为一次就能完美 第一版从来只是草稿 迭代:精修、测试、澄清
堆行话 AI 对干净直白的语言理解更好 说人话
情绪化提示 「你怎么就不能写对?!」无信息量 说清「怎么改、为什么」

3.4 CCG 框架:把三样东西拼成一个公式

分解是把事情拆开;CCG 是把每一块重新说清楚。三个部件各一节:

Context——代码背后的故事。 「优化这段代码」这种话,AI 不知道它是网页应用、 数据管道还是课程作业,缺失的故事直接导致输出不可用24。书里给的对照:

  • 无背景:"Write Python code to calculate discounts."(写个算折扣的代码)
  • 有背景:"我在做一个用户能应用季节性折扣码的网店。写一个函数,算完折扣和税的最终价。"25

有背景时,AI 懂了用例、用户流程、业务逻辑,产出立刻更贴。 给背景的三要素:任务的目的;运行环境(命令行、网页、API);涉及的用户交互与数据来源。 书里把话说透:把 AI 当一个中途加入项目的队友,让他碰键盘之前先 briefing26。

Constraints——「别做什么」比「做什么」更塑形。 没有约束,你会得到宽泛的、 有时过度复杂的代码27。对照:

  • 无约束:"Write a script to scrape job listings."
  • 有约束:"用 BeautifulSoup 抓单个网页的职位标题和链接。不用 Selenium,不用 API。代码控制在 40 行以内。"28

约束的四类(直接抄书):技术的(指定库、文件结构、运行时限制)、风格的(命名、缩进、docstring 格式)、 性能的(时间复杂度、内存)、实际的(文件大小、可读性、安全限制)。 书里有一句反直觉的话值得记住:约束不限制创造力,它引导创造力——一个定义明确的框, 常常会逼出出人意料的巧解29。

Goal——「做完了」长什么样。 每个好提示的结尾是目标:期望的输出、体验或可衡量的结果30。 书里的例子:「读一个费用 CSV,产出汇总报告:总额、平均值、花销最高的类目,格式是 Markdown 表格。」 (Markdown 是一种纯文本排版记号,用简单的符号表示标题、表格等。) 格式、结构、内容全部说死,AI 知道怎么收尾,你也更容易验证输出对不对31。

三样合起来就是 CCG 框架——书里的原话是「一个简单的公式,能把弱提示变成高效提示」32。 示范(摄影师图片改名工具,一次看全三件套):

(背景)我在给摄影师做一个小命令行工具,批量重命名图片文件。 (约束)写 Python 代码,把所选文件夹里的文件改成 wedding_001.jpg、wedding_002.jpg 这样的格式,用 os 模块。 (目标)每改一个文件打印一条确认信息,并安全处理重名。

每个部件都建立在前一个之上:背景给目的,限制给清晰,目标定成败33。

判断(我们的,不是书里的): CCG 是全书最耐用的发明,它的价值不在三个字面, 而在于它把「好提示」从玄学变成了可检查的清单——写完一条提示,三问: AI 知道我为什么做吗?知道边界吗?知道什么叫完事吗?缺一就补。 如果错,会错在: 对探索性任务(「给我讲讲这个库」),硬套 CCG 会显得死板; 它最适合的是「要产出代码/文档/数据」的任务——而这恰是全书的主体,所以这个边界不太疼。

3.5 主线例子:四条工作流,从数据到 API 到完整程序

这是本章的主线例子群:四个真实工作流,每个都按 CCG 走一遍。

工作流一:CSV 数据分析。 场景:一份按区域的销售报告,想看各区域表现。 三条提示走完一轮:装 pandas matplotlib → 给 CCG 提示 (「我有 sales_data.csv,含 region、sales、month 列;写脚本用 pandas 读、算每区域总销售额、画柱状图;代码带注释」)→ 拿到代码先读再跑 → 发现数据有缺失值,补一条精炼提示 (「代码因缺失 sales 值失败;改成忽略 NaN、只统计有效数据」),几秒内拿到更稳的版本34。 注意最后一步:它没有重写需求,只是在同一对话里追加约束——这就是「迭代」。

工作流二:文件改名自动化。 需求:给文件夹里所有 .txt 文件名末尾加当天日期,已加过的跳过。 os 和 glob 都是标准库,零安装。提示:「自动化:循环遍历文件夹,给每个 .txt 改名并在终端打印新名字; 名字里已有今天日期的要跳过。」AI 给出的版本里有两个值得学的细节: datetime.now().strftime("%Y-%m-%d") 生成日期字符串(strftime 是「按格式串把时间变成字符串」的函数); file.stem 取「不带扩展名的文件名」、file.suffix 取扩展名——改名时拆开再拼,扩展名就不会丢35。

工作流三:从 API 拉数据。 这一工作流先补概念:API(Application Programming Interface, 应用程序编程接口)是一个程序向另一个程序发请求、拿数据或服务的约定——你的 Python 脚本 可以通过它向公共服务要实时数据36。书里选的练习对象是 CoinGecko(一个加密货币行情平台): 公开、免费、基础接口不要密钥,适合学习37。但免费 API 也有约束,书里专门列了: 速率限制(请求太密会被封)、数据按原样提供(实时性不保证)、不适合高频交易或生产金融系统、需要联网38。 提示:「写脚本从 CoinGecko 的 simple/price 接口取比特币和以太坊的现价,格式可读;请求失败要有错误处理。」 拿到的代码核心是一个 try/except 块:requests.get(url) 发请求, response.raise_for_status() 在出错时抛异常,except requests.exceptions.RequestException 捕获并打印原因39。跑起来,终端里就是实时币价。之后还可以继续加料: 输出加时间戳、表格化、存 CSV——每加一条,都在学一点模块化40。

工作流四:从模糊请求到完整程序(本章压轴)。 场景:有人对你说 「做个帮用户管个人开支和储蓄的小工具」——没有规格、没有输入输出定义。 书里的做法值得当剧本背下来41:

  1. 先定目的地,不要代码。 提示:「我想做一个 Python 程序:帮用户记录开支、看每月省了多少; 要存数据、要显示摘要。」——只框目标。
  2. 让 AI 帮你拆。 「帮我把这个拆成小步骤。先加哪些功能?」AI 给出四步: 记录一笔(金额、类目、日期)→ 存 CSV → 按月汇总 → 显示摘要。 到这一步你还没写一行代码,项目结构已经有了。
  3. 逐层构建。 先要记账函数:「写一个函数,接受 amount、category、date,追加到 expenses.csv。」 拿到后当场追问:「像教初学者一样解释每行。」AI 会带你过一遍文件操作与参数—— 理解,而不只是得到42。
  4. 下一个功能。 「再写一个函数,读同一个 CSV,按类目算总花销。」 书里给的版本用了 csv.DictReader(按表头把每行变成字典的读法)和 defaultdict(float) (新类目自动配 0.0),并对脏数据行静默跳过——每个函数独立、可复用、可测43。
  5. 打磨靠对话。 「输出太平了。能按总额降序排、并把花销最高的类目高亮吗?」
  6. 合体。 「把所有功能合成一个文本菜单:记一笔 / 看摘要 / 退出。」 最终形态是一个 while True: 循环打印菜单、读 input()、按选择分发调用的命令行程序44。

这条流水线的意义,书里点得很透: 你不是在向一个神秘工具要答案, 而是在与一个「思考伙伴」共同造出了一个能跑的程序——每一步你都懂为什么45。

3.6 工作流一的完整提示与输出(书上原样)

§3.5 把 CSV 工作流压缩成了三步,这里把书里的提示原文与生成代码摆全—— 这是全书第一次给出「一条完整 CCG 提示长什么样」的实物:

"You are my coding assistant. I have a file named sales_data.csv containing region, sales, and month columns. I want to write a Python script that loads the CSV using pandas, calculates total sales per region, and displays a bar chart. Please write the code with comments for clarity."2

背景藏在第一句「You are my coding assistant」里——先给 AI 一个角色, 它知道用什么样的详略和口吻作答。这是 CCG 之外的一个有用小技巧,原书顺手用了但没点名。

生成代码的四段,各配一行「它在防什么」:

data = pd.read_csv("sales_data.csv")                    # 读
data["sales"] = pd.to_numeric(data["sales"], errors="coerce")  # 转不动的值变 NaN,不炸
data = data.dropna(subset=["sales"])                    # 扔掉 sales 缺失的行
region_sales = data.groupby("region")["sales"].sum()    # 按区域求和
region_sales.plot(kind="bar")                           # 画柱
plt.title("Total Sales by Region"); plt.xlabel("Region"); plt.ylabel("Sales")
plt.show()

errors="coerce"(强转:转不动的填成「缺失」记号而不是抛错)是这段里最值钱的细节—— AI 默认给出的健壮程度,取决于你提示里有没有暗示「真实数据是脏的」。 这句暗示可以明说:「数据里可能有缺失值」,也可以靠「分析真实销售数据」这类措辞间接带出。

3.7 工作流三的代码解剖:API 取数的五个部件

§3.5 工作流三给了 CoinGecko 的例子,这里把返回代码拆成五个部件读:

import requests

url = "https://api.coingecko.com/api/v3/simple/price?ids=bitcoin,ethereum&vs_currencies=usd"
try:
    response = requests.get(url)                    # ① 发请求
    response.raise_for_status()                     # ② 状态码不是 2xx 就抛异常
    data = response.json()                          # ③ 把响应体从 JSON 文本解析成字典
    print(f"Bitcoin: ${data['bitcoin']['usd']}")    # ④ 取值
    print(f"Ethereum: ${data['ethereum']['usd']}")
except requests.exceptions.RequestException as e:   # ⑤ 网络层错误统一兜底
    print("Error fetching prices:", e)

部件②值得单独说:raise_for_status() 把「服务器说不对劲」的情况(404、500……) 变成异常,让 ⑤ 能接住。没有它,请求失败时你拿到的会是错误页的内容, 被 ③ 当成正常数据解析——这是新手最常见的暗坑。部件③里的 JSON (一种用文本表示字典/列表的格式,网络上数据交换的通用语)会原样变成 Python 字典, 所以 data['bitcoin']['usd'] 这种取值才成立。

跑通后的三个迭代方向(书里的原样建议):输出加时间戳(「我什么时候取的价」); 表格化显示;结果存 CSV3。每一个都小,每一个都教你一点新的标准库或 pandas 用法。

3.8 练习:名言追踪器(书末 Exercise 的完整走法)

原书章末的练习题是「名言追踪器」:一个抓每日励志名言、带时间戳存档、能展示的小工具。 它把本章四条工作流(CSV 分析、文件改名、API 取数、菜单程序)全串了起来, 按本章方法走一遍:

  1. 定目标:"Build a tool that helps users generate daily motivational quotes and saves them with timestamps."
  2. 让 AI 拆:猜得到——抓名言(API:ZenQuotes 或 Quotable)→ 存带时间戳的文件 → 展示。
  3. 逐条 CCG:装 requests;「从 ZenQuotes 抓一条名言,打印并追加到 quotes.csv(带抓取时间)」; 「读 quotes.csv,按日期列出所有名言」。
  4. 合体菜单:加 / 看 / 退,同费用工具的 main() 循环。
  5. 跑通 + 换源重跑(把 API 换成 Quotable,只动取数函数——这就是模块化付利息的时刻)。

书里的依赖提示只有一句 pip install requests(名言来自公开 API)4。 这个练习做对的标准不是「能跑」,是「换 API 只改一处」——它直接预告了第四章重构的动机。

3.9 章末 Key Terms:六个词的精确定义

原书给本章收了六个术语,照收5:

术语 定义
Problem Decomposition(问题分解) 把复杂任务拆成更小、更易实现和测试的子任务
Prompt Engineering(提示工程) 设计结构化、上下文丰富的指令,引导 AI 产出有用结果的过程
Context(背景) 帮 AI 理解问题在哪、为什么存在的背景信息
Constraints(约束) 定义解法应如何表现的规则或限制(用某库、避免全局变量等)
Iteration(迭代) 修订、测试、精修提示或代码以提高准确性的过程
Refinement Loop(精修循环) 调整提示与代码输出,直到 AI 的回应符合意图并能正常工作的循环

注意这六词的关系:前三个是名词(分解、提示工程、背景与约束),后两个是动词 (迭代、循环)。本章的方法 = 名词搭骨架,动词让它转起来——没有迭代的 CCG 是死公式。

3.10 碳足迹聊天机器人:分解示范的完整版

原书在「从 big idea 到 working prototype」一节给了第二个分解示范,比销售报表更完整, 照录走一遍。目标:一个帮用户算碳足迹的聊天机器人46。

书里把它拆成五步:

  1. 收集用户数据(用电量、交通习惯等);
  2. 按类别估算排放;
  3. 算总足迹;
  4. 给出减排建议;
  5. 保存用户会话与结果。

然后逐步与 AI 协作:一个提示收集用户数据、一个写排放计算逻辑、一个做报告格式。 书里把这种感觉叫做「像与队友结对编程——你在引导它走完一个序列」47。

注意每一步的动词:收集、估算、计算、显示、保存。全是单动词、可单测的—— 对照 §3.2 的五条自检:每一步一句话说得清(「按类别估算排放」)、输入输出明确 (习惯数据进、千克 CO₂ 出)、可以独立替换(把「用电估算」换成更精细的模型,其他步不动)。 拆到动词都单一了,分解就到位了。

3.11 实战演练:爬虫价格追踪器(CCG 完整作业)

原书在两处给了同一个 CCG 练习:把「Create a web scraper that gets prices of laptops from a site」 这句弱提示改写成结构化提示48。照书里的写法,改完的版本三段分明:

"I am creating a Python-based price tracker for an e-commerce comparison tool. Write a script using requests and BeautifulSoup that scrapes laptop names and prices from a single product page (context + constraint). The output should be a JSON list with keys name, price, and link, formatted cleanly and printed in the console (goal)."

书里对两版的判词值得记住:第二版「不留任何碰运气的机会」—— 它给齐了 AI 需要的全部信息,让 AI 当你的 coding assistant,而不是你的 guesser49。

弱提示 vs 强提示的对照表(把书里的三个例子并排放):

弱提示 缺了什么 改法
Create a Python app that analyzes user feedback and finds trends. 数据在哪、趋势指什么、输出长什么样 拆成三步清单(§3.1)
Build a data visualization dashboard using Python. 数据、指标、图型、界面 拆成四条提示(§3.3)
Create a web scraper that gets prices of laptops from a site. 用途、技术约束、输出格式 补成 CCG(本节约)

三行弱提示有一个共同病根:只有动词,没有宾语的规格。补上宾语的三要素 (哪份数据、什么算好、长什么样),弱提示自己就站起来了。

3.12 「情绪化提示」:书里最有人情味的一段

五个常见错误里,「Emotional Prompting」一条书里写得格外生动: frustrated learners (受挫的学习者)真的会对 AI 说「Why can you not just get it right?!」「This is not what I meant!」—— 而且「比你以为的常见」50。

书里的诊断一针见血:情绪没有信息量。AI 不会因为你沮丧就变聪明, 它只会因为你给的信息变准。 受挫的时候,把情绪翻译成规格: 「This is not what I meant」→「我期望的输出是 X,你给的 Y 差在 Z」; 「get it right」→「第三行应该过滤空值,但现在没有」。 这个翻译动作,本身就是问题分解的练习——能说出「差在 Z」,说明你已看清了差距。

3.13 本章小结的两句话(书里的 Conclusion)

原书结语里有两句值得原文带走:

真正的魔法不在工具里,而在你怎么想——怎么拆问题、怎么组织指令、怎么精修提示51。

问题分解不只是一个技术步骤;它是一种教你「像建造者一样思考」的思维训练。 掌握了它,你会发现大多数编码 frustrations 都消失了,因为每个问题都开始 看起来像一组可以征服的小步骤52。

第二句是全书多次出现的那个主张的源头:AI 时代的瓶颈从「写」移到了「拆」。 第 6–9 章的四个项目,全是这两句话的注脚。

3.14 「AI 怎么想」的另一面:为什么清单式步骤有效

§3.1 引了书里的观察:ChatGPT 不像人那样理解问题,它依赖你描述得清不清楚53。 这里把这句话的下半截补完——为什么拆成清单后它就「变聪明了」。

书里给的对照其实是两个图(图 3.1 与图 3.2):同一句模糊请求, ChatGPT 的回应要么泛泛而谈、要么自由发挥出一个你没想到也不想要的东西; 而分解版的三步清单,回应变成逐步照做54。 机制层面的解释(补充,不在书里,来自通用知识):对话模型按「接下来最可能接什么」续写—— 你给它一个模糊的大目标,最可能的续写就是「一个看起来像样的通用答案」; 你给它编号步骤,最可能的续写就是「逐条完成这些步骤」。 提示的质量,本质是在约束这个「最可能」的方向。 这与第四章「期望写进测试」 是同构的:都是在 AI 动手前,把「什么算对」从猜变成规定。

由此得到一个可操作的经验:凡是 AI 的输出「总差那么点意思」的场合,先检查你的输入 有没有给它一个「照着做就能对」的结构——清单、模板、示例输出,都是结构。 CCG 是结构,五步自检是结构,甚至「You are my coding assistant」这句开场也是结构。

3.15 本章与全书其他章的接线图

第三章是枢纽,枢纽的价值在接线上。把本章的概念接到其他章:

本章概念 接到哪章 长成什么
问题分解 第 6–9 章 每个项目的功能清单
CCG 的 Context 第 2、4 章 解释代码/调试时的背景三要素
CCG 的 Constraints 第 4 章 「只用标准库」「保持行为不变」
CCG 的 Goal 第 4 章 「写失败测试」先定期望
迭代/精修循环 第 4 章 六步流程的第⑤⑥步
提示链 第 3 章自身 改名工具三条提示
「要结构不要代码」 第 6 章 游戏机制与函数清单

这张表是双向的:读后面章节时回来看,每个项目的「第一步」几乎都是本章某招的复述; 复习本章时往下看,每个抽象概念都有四个项目当作业。枢纽章的正确读法是两头翻。

3.16 工作流二走查:日期改名脚本的逐行读法

§3.5 工作流二被压缩成了一段,这里把书里的生成代码逐行走一遍—— 它短,但每一行都有一个「为什么」:

from pathlib import Path
from datetime import datetime

today = datetime.now().strftime("%Y-%m-%d")     # ① 取今天,格式化成 2025-11-25
for file in Path(".").glob("*.txt"):            # ② 只看当前目录的 .txt
    stem = file.stem                            # ③ 主名(不含扩展名)
    if not stem.endswith(today):                # ④ 今天已加过?跳过(幂等!)
        new_name = f"{stem}_{today}{file.suffix}"  # ⑤ 主名_日期.扩展名
        file.rename(file.with_name(new_name))
        print(f"Renamed: {file.name} -> {new_name}")
    else:
        print(f"Skipped: {file.name}")

行④是这段代码的灵魂:stem.endswith(today) 检查文件名里是否已带今天日期, 带了就跳过——这是幂等性在单行上的样子。没有它,脚本每跑一次就追加一个日期, 文件名会膨胀成 report_2025-11-25_2025-11-25_...。 书里的提示原文就要求了「跳过名字里已有今天日期的文件」55—— 约束写进提示,幂等写进代码,这条因果链值得记住。

行②的 Path(".").glob("*.txt") 也值得停一秒:. 是当前目录, glob 按模式筛文件——比 os.listdir + 手动判断扩展名更省一步。 第三章反复出现 pathlib 不是偶然:第一章的改名脚本、这里的日期脚本、 第五章的巡检,用的都是它——认准一个库用到熟,比每章换一个强。

3.17 一个更细的 CCG 示范:折扣函数的两版提示

书里在 Context 一节给了一组对照(网店折扣),把它扩写成完整的前后对照:

无背景版:"Write Python code to calculate discounts."(写算折扣的代码) → AI 只能给个通用 price * rate,适不适合你的店它不知道。

有背景版:"我在做一个用户能应用季节性折扣码的网店。 写一个函数,算完折扣和税之后的最终价。"56 → AI 现在懂了:有折扣码这个概念(可能涉及百分比也可能涉及固定额)、 还要叠税(顺序:先折后税,还是反过来?这是可以追问的第二层)。

再加约束与目标(照 CCG 补完): 「用 Decimal 不用 float(钱的精度要求);返回保留两位小数的数; 输入是原价和折扣码字符串,输出是最终价。」——三步合起来, AI 的输出已经从「课堂作业」变成「能进你代码库的模块」。 这个逐级加码的过程,就是 CCG 从名词变动词的过程。

3.18 本章的「反清单」:什么时候别用 CCG

为防把 CCG 用成新教条,收一份「反清单」——三种不适合套三件套的场景:

  1. 纯探索问答:「什么是装饰器?」「TF-IDF(一种给词按「在这篇里有多要紧」加权的方法)为什么有效?」——要的是解释, 不是产出;硬塞 Goal 反而把开放问题关死;
  2. 单步微任务:「这个正则什么意思?」「这行报错为什么?」——一个动作一句话, 背景即代码本身,约束与目标都在问题里;
  3. 讨论与权衡:「字典和类哪个适合这个场景?」——要的是对比与推理, CCG 的「目标」会诱使你 prematurely 选一个,而你要的恰恰是「先别选」。

判据一句话:任务有明确的「做完态」就上 CCG;任务是「帮我想清楚」就直接聊。 这条判据不在书里——书里只给了正例(我们的补充)——但它能防住「拿着锤子看什么都是钉子」。

3.19 章末检查:你的提示能过三问吗

把本章收成一张自查卡。每写一条要发给 AI 的提示,落键前过三问:

  ① 背景问:AI 知道这事为什么存在、给谁用吗?
  ② 约束问:它知道什么不许做、必须用什么吗?
  ③ 目标问:它知道「做完了」长什么样、怎么验收吗?
  三问全过 → 发;有一问卡壳 → 补那一问,别硬发。

这张卡的用法是对自己诚实:卡壳的那一问你多半其实没想过—— 那就正好趁补提示的工夫把问题想清楚。书里那个反复出现的因果链在这里闭环: 补不清提示 = 没想清楚问题;提示写顺了,问题也就想透了。 这就是「分解与提示是同一枚硬币两面」的日常形态57。

3.20 提示词考古:书里一个有趣的转写痕迹

通读时注意到一处细节,值得作为本章的注脚:原书第三章图注里, Figure 3.1 与 Figure 3.2 都叫「ChatGPT Vague Prompt」—— 第二个图名应是「Decomposed Prompt」的转写疏漏58。这类编辑痕迹全书还有几处 (第一章那段写给作者自己的写作指令是另一处)。

为什么在这里提它?因为这也是「用 AI 辅助写作/创作」类内容的一个真实侧写: 成书过程本身就在用结对式生产,连修订的尾巴都没收干净。 它不改变任何技术内容,但提醒读者:这类 2026 年赶着出版的实操书, 引用具体措辞时以代码和流程为准,图注、截图、版本号随时可能是上一代产品的。

3.21 费用追踪器的完整菜单代码走查(本章压轴的压轴)

§3.5 工作流四合体后的 main() 循环,值得逐行走一遍—— 它是「分解 → CCG → 生成 → 读懂」全程的成品,也是全章方法密度的最高点:

def main():
    while True:                                    # ① 程序的生命周期循环
        print("\n--- Expense Tracker ---")
        print("1. Add Expense")
        print("2. View Summary")
        print("3. Exit")
        choice = input("Enter choice: ")           # ② 菜单读选择(字符串)
        if choice == "1":
            amount = input("Enter amount: ")       # ③ 逐项收集输入
            category = input("Enter category: ")
            date = input("Enter date (YYYY-MM-DD): ")
            add_expense(amount, category, date)    # ④ 调用前面逐层建好的函数
        elif choice == "2":
            summarize_expenses()                   # ⑤ 同上
        elif choice == "3":
            break                                  # ⑥ 唯一的出口
        else:
            print("Invalid choice. Try again.")    # ⑦ 无效输入给反馈

if __name__ == "__main__":
    main()

七个部件各有来历:① 的 while 骨架来自第一章的命令行意识,②–③ 的 input 收集 来自工作流二的文本处理,④–⑤ 的两个函数是「逐层构建」的产物(记账 → 汇总), ⑥ 的 break 与第七章的退出同款,⑦ 的无效反馈与第六章游戏输入一脉相承。 一个 25 行的菜单,背后是全书前六章的所有积累——这就是「从零到程序」的完整距离。

走查时留意一个真实的瑕疵:③ 收进来的 amount 是字符串,add_expense 里如果直接做算术 会先踩第四章的 TypeError——书里的版本把转换放在写 CSV 前的环节59。 生成代码的第一遍几乎总有这类接缝问题,而你现在已具备的全部工具 (第四章的调试流程、本章的追问)正是为此准备的。

3.22 章节的一句话:把「想要」翻译成「步骤」

收尾一句:本章的全部内容,是「想要一个东西」与「得到那个东西」之间, 那道最容易被跳过的翻译工序。60

模糊请求(「帮我做个工具」)是母语;可执行步骤(五条 CCG 提示)是目标语; 分解是查字典,CCG 是语法书,迭代是润色。跳过翻译的人,把希望寄托在 AI 的读心术上—— 偶尔成功,持续失望;做了翻译的人,AI 的产出第一次成了可预期的函数,而不是抽签。

这本书叫 Prompting Python——prompting(提示)在这句话里显形了: 它不是咒语,是翻译。

3.23 全章的两个「动词对」

最后把本章方法收进两对动词,各管一头:

拆 / 装——问题分解(拆)与 CCG(装)。拆是把大目标切成小步骤, 装是把每步包装成 AI 能执行的提示。只拆不装,步骤躺在笔记里; 只装不拆,装的是一整团模糊。

问 / 验——向 AI 提问(问)与本地运行验证(验)。 书里的练习每条都以「run it in VS Code」收尾61不是形式: AI 的回答在跑起来之前只是文本。两对动词连起来,就是本章的完整循环: 拆 → 装 → 问 → 验 → 再拆。

3.24 章节的最后一块拼图:为什么「测试先行」在这里第一次出现

回看全书,第四章的「先写失败测试」是测试的第一次郑重登场, 但第三章其实已经彩排过两次:§3.1 的五条自检(每步可独立测)与 §3.2 的「描述输入输出」——那就是测试的口头版。 把期望说清楚(输入是什么、输出该是什么)与把期望写进 assert, 中间只差一个 pytest 文件。

这个衔接值得点明,因为它给了读者一条平滑的认知斜坡: 从「能描述期望」到「能写期望的测试」,没有断崖,只有一步。 书把这一步放在第四章(六步流程第 ③ 步),我们在第三章的出口处提前指了一下路—— 当你在五条自检里写下「这一步的输入是 X、输出是 Y」时, 顺手把它翻译成 assert f(X) == Y,你就已经站在第四章门口了62。

3.25 目标的三条强化法(书里散在 Goal 一节,收拢成单)

Goal 一节除了那个费用报告的例子,还给了三条让目标「更硬」的具体做法, 拆解里分散各处,这里按原书收拢一次1:

  1. 说死输出类型:代码、表格、解释、可视化——四选一,别让 AI 替你猜;
  2. 写明格式要求:Markdown 表格还是纯文本?几列?要不要表头?
  3. 给出成功判据:书里给的示范是「代码应能在没有外部依赖的情况下跑通」—— 一条可以当场验真假的硬标准,而不是「写得优雅点」这种软口味。

这三条与 §3.19 的「提示三问」是同一枚硬币:三问检查缺不缺部件, 三法检查部件够不够硬。一条提示过了三问仍可能软——「目标是输出报告」过了 Goal 这一问, 但没说是表格还是文字、没给成功判据;补上三法,验证成本立刻降下来。

判断(我们的,不是书里的): 三法里最有杠杆的是第三条「成功判据」—— 因为它把「验收」从感觉变成了可执行的检查,与第四章的测试先行、 第八章的「输出必须自己开一遍」是同一条纪律的三个海拔。 如果错,会错在: 对探索性任务,硬成功判据可能过早关闭好方案; 但本书主体是工程任务,这个边界同样不太疼。判断一条 Goal 够不够硬,有个快检: 把目标念给一位没参与项目的同事听,他能不能不看你的代码就验收?不能,就说明还软。

4. 作者的判断与证据

有演示支撑的判断:

  • 「模糊请求给模糊结果」——本章用四组对照(反馈分析、看板、爬虫、费用工具)反复演示, 是全书论证最充分的一章10。
  • 「先定目的地再拆步骤」的四步剧本——有完整演示(工作流四),可直接复用41。

经验之谈:

  • 「约束引导创造力」——设计直觉,无证据,但符合多数人的实操体验29;
  • 「避免情绪化提示」——更像对新手常见挫折的观察,而不是提示工程的技术结论23。

推测:

  • 「AI 对干净直白的语言理解好于行话」——书里当作事实陈述,实际取决于模型; 2026 年的模型对行话理解已很好,这条建议的价值更多在于逼你想清楚而不是模型真不懂。

5. 边界与局限

  • CCG 不覆盖探索性对话:问概念、让 AI 对比方案时,硬套三件套反而别扭; 框架的定位是「产出型任务」,书里没划这条线(我们补)。
  • 分解粒度没有客观标准:五条自检(§3.2)是充分条件不是精确尺度; 同一问题,有人拆 3 步有人拆 8 步,都可能是对的。
  • API 练习的可复制性:CoinGecko 的免费额度与接口字段会变,动手时以当时的官方文档为准; 书中 URL 形态(api.coingecko.com/api/v3/simple/price?...)是当时的写法。
  • 「情绪化提示」一段略带说教:它假设用户会把情绪写进提示——真实场景里更常见的是 复制报错不附上下文,这一点书里没有点破。

6. 可带走的

本章主线例子,一行写完:「做个费用工具」→ 先框目标(记账+汇总+摘要)→ 让 AI 拆成四步 → 逐条 CCG 提示逐条实现(记账函数→分类汇总函数→排序高亮→菜单循环)→ 边做边追问每行为什么 → 跑通一个命令行程序。

  1. 分解是隐形技能:资深开发者的一半时间在「搞清真正的问题」;
  2. 五条自检:一步一句话、可独立测、输入输出说得清、可替换、可单喂 AI;
  3. 提示四件套:背景、任务、约束、目标——按这个顺序写;
  4. CCG:背景给目的、约束给边界、目标定成败;写完三问:知道为什么吗?知道边界吗?知道什么叫完事吗?
  5. 约束说「不做什么」:不用哪个库、几行以内、什么格式——「不」字最塑形;
  6. 提示链:一个大工具 = 一串小提示,每步小、可测、可换;
  7. 迭代是默认动作:第一版是草稿;同对话里追加约束,比重开炉灶快;
  8. 要结构不要代码:先让 AI 替你列步骤,审一遍再动手——零代码先拿到项目结构;
  9. 每步生成后必追问「像教初学者一样解释每行」——理解跟着代码一起长;
  10. 避五坑:一次问完、无背景、指望一次完美、堆行话、情绪化。

7. 原文地图

主题 原书章 原文位置
提示工程=拆解 Problem Decomposition and Prompt Engineering text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:24(搜「strip away」)
五六个问题一句话 同上 text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:125(搜「five or six smaller ones」)
AI 怎么想 同上 text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:157(搜「does not actually」)
模糊 vs 分解对照 同上 text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:175(搜「analyzes user feedback」)
五条自检 同上 text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:260(搜「single sentence」)
指路/整本小说比方 同上 text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:300(搜「full novel」)
看板四条分解提示 同上 text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:324(搜「dashboard」)
提示四件套 同上 text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:366(搜「Context:」)
改名工具提示链 同上 text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:404(搜「Prompt 1」)
对话原则 同上 text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:438(搜「invitation」)
五个常见错误 同上 text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:448(搜「Asking Everything」)
背景三要素 同上 text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:533(搜「The purpose」)
约束四类 同上 text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:571(搜「Technical:」)
CCG 公式与示范 同上 text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:625(搜「CCG Framework」)
CSV 工作流 同上 text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:752(搜「sales_data.csv」)
改名工作流(stem/suffix) 同上 text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:854(搜「today」)
API 是什么、CoinGecko 同上 text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:923(搜「Application Programming Interface」)
免费 API 四条约束 同上 text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:967(搜「Rate limits」)
费用工具四步剧本 同上 text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:1129(搜「track expenses」) · text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:1375(搜「main()」)
CSV 工作流完整提示 同上 text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:752(搜「sales_data.csv containing」)
API 五部件代码 同上 text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:1030(搜「raise_for_status」)
名言追踪器练习 同上 text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:1485(搜「motivational quotes」)
Key Terms 六词 同上 text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:1524(搜「Problem Decomposition」)

  1. 出处:「Problem Decomposition and Prompt Engineering」第 609–615 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:609,搜「Be specific about output type」;:612,搜「Mention formatting requirements」;:615,搜「Clarify success criteria」)。 ↩

  2. 出处:「Problem Decomposition and Prompt Engineering」第 752 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:752,搜「sales_data.csv containing」)。 ↩

  3. 出处:「Problem Decomposition and Prompt Engineering」第 1054 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:1054,搜「timestamps」)。 ↩

  4. 出处:「Problem Decomposition and Prompt Engineering」Exercise(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:1511,搜「pip install requests」)。 ↩

  5. 出处:「Problem Decomposition and Prompt Engineering」Key Terms(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:1524,搜「Problem Decomposition」至 :1542,搜「Refinement Loop」)。 ↩

  6. 出处:「Problem Decomposition and Prompt Engineering」第 24 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:24,搜「strip away」)。原文:「When you strip away all the hype about 'prompt engineering', what is really at the heart of it is the ability to break down big, messy problems into smaller, logical steps.」 ↩

  7. 出处:「Problem Decomposition and Prompt Engineering」第 110 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:110,搜「figuring out what the real problem is」)。 ↩

  8. 出处:「Problem Decomposition and Prompt Engineering」第 122 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:122,搜「daily sales reporting」)。 ↩

  9. 出处:「Problem Decomposition and Prompt Engineering」第 151 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:151,搜「untangling complexity」)。 ↩

  10. 出处:「Problem Decomposition and Prompt Engineering」第 157 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:157,搜「does not actually」)。 ↩↩

  11. 出处:「Problem Decomposition and Prompt Engineering」第 198 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:198,搜「reads such as a checklist」)。 ↩

  12. 出处:「Problem Decomposition and Prompt Engineering」第 260 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:260,搜「single sentence」)。 ↩

  13. 出处:「Problem Decomposition and Prompt Engineering」第 279 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:279,搜「sharpening」)。原文:「you are not simplifying your thinking; you are sharpening it.」 ↩

  14. 出处:「Problem Decomposition and Prompt Engineering」第 300 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:300,搜「full novel」)。 ↩

  15. 出处:「Problem Decomposition and Prompt Engineering」第 324 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:324,搜「dashboard」)。 ↩

  16. 出处:「Problem Decomposition and Prompt Engineering」第 343 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:343,搜「Streamlit」)。Streamlit/Plotly 都是 Python 的数据应用/图表库,名字记一下即可。 ↩

  17. 出处:「Problem Decomposition and Prompt Engineering」第 350 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:350,搜「junior developer」)。 ↩

  18. 出处:「Problem Decomposition and Prompt Engineering」第 478 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:478,搜「leading one」)。 ↩

  19. 出处:「Problem Decomposition and Prompt Engineering」第 366 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:366,搜「Context:」)。 ↩

  20. 出处:「Problem Decomposition and Prompt Engineering」第 390 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:390,搜「thinking more clearly」)。 ↩

  21. 出处:「Problem Decomposition and Prompt Engineering」第 404 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:404,搜「Prompt 1」)。 ↩

  22. 出处:「Problem Decomposition and Prompt Engineering」第 438 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:438,搜「invitation for feedback」)。 ↩

  23. 出处:「Problem Decomposition and Prompt Engineering」第 448 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:448,搜「Asking Everything at Once」)。 ↩↩

  24. 出处:「Problem Decomposition and Prompt Engineering」第 508 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:508,搜「why it exists」)。 ↩

  25. 出处:「Problem Decomposition and Prompt Engineering」第 520 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:520,搜「seasonal discount codes」)。 ↩

  26. 出处:「Problem Decomposition and Prompt Engineering」第 533 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:533,搜「The purpose」)。 ↩

  27. 出处:「Problem Decomposition and Prompt Engineering」第 549 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:549,搜「what not to do」)。 ↩

  28. 出处:「Problem Decomposition and Prompt Engineering」第 555 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:555,搜「job listings」)。 ↩

  29. 出处:「Problem Decomposition and Prompt Engineering」第 584 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:584,搜「guide it」)。原文:「constraints do not restrict creativity; they guide it.」 ↩↩

  30. 出处:「Problem Decomposition and Prompt Engineering」第 590 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:590,搜「what success looks like」)。 ↩

  31. 出处:「Problem Decomposition and Prompt Engineering」第 619 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:619,搜「verify」)。 ↩

  32. 出处:「Problem Decomposition and Prompt Engineering」第 625 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:625,搜「CCG Framework」)。 ↩

  33. 出处:「Problem Decomposition and Prompt Engineering」第 643 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:643,搜「builds upon」)。 ↩

  34. 出处:「Problem Decomposition and Prompt Engineering」第 61–63 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:752,搜「sales_data.csv」)。 ↩

  35. 出处:「Problem Decomposition and Prompt Engineering」第 884 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:884,搜「strftime」)。 ↩

  36. 出处:「Problem Decomposition and Prompt Engineering」第 923 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:923,搜「Application Programming Interface」)。 ↩

  37. 出处:「Problem Decomposition and Prompt Engineering」第 926 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:926,搜「CoinGecko」)。 ↩

  38. 出处:「Problem Decomposition and Prompt Engineering」第 967 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:967,搜「Rate limits」)。 ↩

  39. 出处:「Problem Decomposition and Prompt Engineering」第 1030 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:1030,搜「raise_for_status」)。 ↩

  40. 出处:「Problem Decomposition and Prompt Engineering」第 1054 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:1054,搜「timestamps」)。 ↩

  41. 出处:「Problem Decomposition and Prompt Engineering」第 81–88 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:1129,搜「track expenses」)。 ↩↩

  42. 出处:「Problem Decomposition and Prompt Engineering」第 1230 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:1230,搜「teaching a beginner」)。 ↩

  43. 出处:「Problem Decomposition and Prompt Engineering」第 1291 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:1291,搜「DictReader」)。 ↩

  44. 出处:「Problem Decomposition and Prompt Engineering」第 1375 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:1375,搜「main()」)。 ↩

  45. 出处:「Problem Decomposition and Prompt Engineering」第 1435 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:1435,搜「partner in thought」)。 ↩

  46. 出处:「Problem Decomposition and Prompt Engineering」第 213 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:213,搜「carbon footprint」)。 ↩

  47. 出处:「Problem Decomposition and Prompt Engineering」第 250 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:250,搜「pair programming」)。 ↩

  48. 出处:「Problem Decomposition and Prompt Engineering」第 661 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:661,搜「price tracker」)。 ↩

  49. 出处:「Problem Decomposition and Prompt Engineering」第 670 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:670,搜「not your guesser」)。 ↩

  50. 出处:「Problem Decomposition and Prompt Engineering」第 465 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:465,搜「more often than you think」)。 ↩

  51. 出处:「Problem Decomposition and Prompt Engineering」结论第 1441 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:1441,搜「real magic」)。 ↩

  52. 出处:「Problem Decomposition and Prompt Engineering」结论第 1444 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:1444,搜「conquerable」)。 ↩

  53. 出处:「Problem Decomposition and Prompt Engineering」第 157 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:157,搜「does not actually」)。 ↩

  54. 出处:「Problem Decomposition and Prompt Engineering」图 3.1 与图 3.2(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:181,搜「Figure 3.1」;:204,搜「Figure 3.2」)。 ↩

  55. 出处:「Problem Decomposition and Prompt Engineering」第 860 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:860,搜「already have today」)。 ↩

  56. 出处:「Problem Decomposition and Prompt Engineering」第 520 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:520,搜「seasonal discount codes」)。 ↩

  57. 出处:「Problem Decomposition and Prompt Engineering」第 294 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:294,搜「Two Sides of the Same Coin」)。 ↩

  58. 出处:「Problem Decomposition and Prompt Engineering」第 17–18 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:181,搜「Figure 3.1」;:204,搜「Figure 3.2」)——两图同名,第二个按内容应是分解版。 ↩

  59. 出处:「Problem Decomposition and Prompt Engineering」第 1432 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:1432,搜「main()」)。 ↩

  60. (我们的章节一句话;书名中的 prompting 见 library/prompting-python/chapters.json 的 bookMeta.title。) ↩

  61. 出处:「Problem Decomposition and Prompt Engineering」各工作流的 Step 收尾,如第 830 段(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:830,搜「Within seconds」)与 Exercise 的「test and refine」(text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:1501)。 ↩

  62. (我们的衔接观察;五条自检原文见 text/15-ch03-3-problem-decomposition-and-prompt-engineering.txt:260,「描述输入输出」见同段第 3 条。) ↩