Chain of Thought:一句「请一步步思考」,准确率从 40% 飙到 85%
一只用 AI Agent 搭副业产线的程序员2022 年 Google 发了一篇论文标题叫「Chain-of-Thought Prompting Elicits Reasoning in Large Language Models」。论文的核心发现用一句话就能说清楚在 Prompt 里加一句「让我们一步步思考」就能让模型在推理任务上的准确率大幅提升。不加这句话准确率 40%。加了85%。不是换了模型不是改了参数。就是一句话。这篇我们还原这个实验。用 Go 代码跑一遍让你亲眼看到差别。实验一道经典的数学推理题题目一个商店卖苹果和橙子。苹果每个 3 元橙子每个 2 元。 小明买了 5 个苹果和 3 个橙子给了 50 元。 商店有促销活动买满 5 个水果打 9 折。 请问小明应该找回多少钱看起来简单。但你让人心算每一步都可能出错——先算总价还是先打折打折是先加后打还是分开打实验代码packagemainimport(fmtstrings)typeTestCasestruct{promptstringanswerfloat64}funcmain(){testCases:[]TestCase{{prompt:一个商店卖苹果和橙子。苹果每个 3 元橙子每个 2 元。 小明买了 5 个苹果和 3 个橙子给了 50 元。 商店有促销活动买满 5 个水果打 9 折。 请问小明应该找回多少钱直接给答案不要解释。,answer:31.1,// (156)*0.918.9, 50-18.931.1},{prompt:一辆车从 A 地开到 B 地全程 240 公里。 前一半路程时速 60 公里后一半路程时速 40 公里。 问全程平均速度是多少直接给答案不要解释。,answer:48,// 120/602h, 120/403h, 240/548km/h},{prompt:一个水池进水管 3 小时灌满出水管 5 小时放空。 如果两个管子同时开需要多少小时灌满直接给答案不要解释。,answer:7.5,// 1/3-1/52/15, 15/27.5h},}for_,tc:rangetestCases{// 标准 Promptfmt.Println( 标准 PromptZero-shot)standardResult:callLLM([]Message{{Role:user,Content:tc.prompt},},0.1,50)// CoT Promptfmt.Println( CoT Prompt )cotPrompt:strings.Replace(tc.prompt,直接给答案不要解释。,请一步一步思考。先列出计算步骤再给出最终答案。,1)cotResult:callLLM([]Message{{Role:user,Content:cotPrompt},},0.1,200)fmt.Printf(标准回答: %s\n,standardResult)fmt.Printf(CoT 回答: %s\n,cotResult)fmt.Printf(正确答案: %.1f\n\n,tc.answer)}}实测结果题目 1水果折扣标准 Prompt答案找回 29 元。❌ 错误。模型心算错了促销规则CoT Prompt步骤 1计算原价总价 苹果5 × 3 15 元 橙子3 × 2 6 元 原价总价15 6 21 元 步骤 2判断是否符合促销 5 3 8 个水果 ≥ 5 个 符合 9 折条件 步骤 3计算折后价 21 × 0.9 18.9 元 步骤 4计算找零 50 - 18.9 31.1 元 答案31.1 元✅ 正确。题目 2平均速度标准 Prompt平均速度50 公里/小时❌ 错误。常见的直觉错误——以为(6040)/250但平均速度是总路程/总时间CoT Prompt步骤 1计算前一半路程的时间 前一半 240 / 2 120 公里 时间 120 / 60 2 小时 步骤 2计算后一半路程的时间 后一半 120 公里 时间 120 / 40 3 小时 步骤 3计算全程平均速度 总时间 2 3 5 小时 平均速度 240 / 5 48 公里/小时 答案48 公里/小时✅ 正确。题目 3水池问题标准 Prompt答案2 小时❌ 错误。直觉3-5不好算就随便估了 2 小时CoT Prompt步骤 1计算进水速率 进水管 3 小时灌满 → 速率 1/3池/小时 步骤 2计算出水速率 出水管 5 小时放空 → 速率 1/5池/小时 步骤 3计算净速率 净进水速率 1/3 - 1/5 (5-3)/15 2/15池/小时 步骤 4计算灌满时间 时间 1 / (2/15) 15/2 7.5 小时 答案7.5 小时✅ 正确。为什么 CoT 这么有效标准 Prompt 下模型在「直接输出答案」——它要做的是根据概率猜下一个 token。对于多步推理题一步到位的答案很难猜对。CoT Prompt 下模型在「先输出过程再输出答案」。每一步都是一个单独的推理前一步的结果直接作为下一步的输入。模型不是一次性猜对答案而是一步步推导到答案。这跟你心算 17×23 一样——你不会直接蹦出 391你是先算 17×20340再算 17×351再加起来。心算和 AI 推理在这一点上完全一样。CoT 不只是「让我们一步步思考」那句魔法的变体有很多按场景选择场景CoT 触发词数学题「让我们一步步计算」代码调试「列出可能导致这个 Bug 的原因逐一排除」逻辑推理「先列出所有可能的假设再逐一验证」决策分析「列出每个选项的优缺点再给出推荐」Bug 报告分析「先确认问题现象再回推可能的原因」本质都一样把一个大推理拆成多个小步骤每步只做一个简单的判断。CoT 也有不适用的时候我踩过一个坑对一个简单的分类任务用了 CoT。Prompt: 请判断以下文本的情感是正面还是负面。让我们一步步思考。 结果AI 写了 200 字的推理过程最后答案还是错的。CoT 适合多步推理任务。简单分类、翻译、信息提取这些——直接用 Zero-shot加了 CoT 反而浪费 token 而且可能产生更多幻觉链条。判断标准你自己做这个任务是不是需要在脑子里走好几步需要走好几步 → 加 CoT直觉就能做的 → 不加Zero-shot 就够实战在 Agent 里自动判断需不需要 CoTfuncshouldUseCoT(taskstring)bool{// 用 AI 判断这个任务是否需要 CoTprompt:fmt.Sprintf(判断以下任务是否需要多步推理。 需要多步推理回复 YES简单任务回复 NO。 只回复 YES 或 NO。 任务%s,task)result:callLLM([]Message{{Role:user,Content:prompt},},0.0,5)returnstrings.TrimSpace(result)YES}funcsmartCall(taskstring)string{ifshouldUseCoT(task){returncallWithCoT(task)}returncallStandard(task)}简单但实用——根据任务自动决定策略省 token 又保准确率。本篇核心收获CoT 不是魔法。它做了一件事把「一次猜对答案」变成了「一步步走到答案」。每步的难度都很低所以每步都很难错。加上上一篇的知识你现在有了一套 Prompt 设计的决策树任务来了 → 简单任务翻译/分类/提取→ Zero-shot → 格式/风格敏感 → Few-shot2-3 个示例 → 多步推理 → CoT Zero-shot → 多步推理 风格敏感 → CoT Few-shot下一篇我们解决一个实在的问题——让 AI 稳定返回 JSON。不是「大概率返回 JSON」是 100% 返回合法 JSON。加 Schema 校验 重试机制生产线级别的可靠性。关注我别错过。 一只用 AI Agent 搭副业产线的程序员全平台同名虾哥不加班需要定制 AI 工具来聊聊 → lob_ai源码GitHub - lobster-bujiaban