ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Chain-of-Thought思维链实战:Zero-shot-CoT、Few-shot与自洽性采样怎么选

Chain-of-Thought思维链实战:Zero-shot-CoT、Few-shot与自洽性采样怎么选 1. 三类思维链策略到底差在哪从一道注水题说起先看一道小学奥数级别的题甲管4小时注满水池乙管6小时注满两管齐开几小时注满直接丢给模型它经常回你5小时——把4和6一平均语气还特别笃定。但你在问题后面补一句请一步一步分析同一个模型会写甲每小时注1/4乙每小时注1/6合效率5/12所以需要12/52.4小时。答案就对了。这个反差就是 Chain-of-Thought思维链简称 CoT最直观的价值。大模型是逐 token 预测的你要求它直接给答案等于逼它在第一个 token 就押中结论中间没有任何草稿空间。CoT 做的事只有一件把中间推理步骤显式生成出来让每一步都成为下一步的上下文结论从一锤子买卖变成一连串小步的终点。但 CoT 不是一个开关而是三种不同成本的策略选错了要么白花钱要么没效果Zero-shot-CoT只在 prompt 末尾加一句请一步一步思考零示例、零模板成本最低。Few-shot-CoT给两三个带完整推理过程的示例让模型照着这个推理形状走风格可控。自洽性采样Self-Consistency同一条 prompt 高温采样多条推理链对最终答案投票用多样性换正确率成本最高。这篇文章面向数学、逻辑、多步问答这类推理任务把三种策略的提示模板、采样参数、Python 实现全部给出来并用同一批题目做准确率对照帮你按任务难度和预算做选型。适合已经在调大模型 API、但发现答案时对时错的开发者。2. 接入前的准备TaoToken 控制台拿 Key 与模型清单三种策略都要真实调用模型才能验证效果所以先把调用通道打通。我用的是 TaoToken 的聚合接口一个 Key 就能切换不同模型做对照实验省得为每个模型单独配环境。下面是从零到能发请求的完整步骤。第一步打开官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册账号。注册流程就是常规的邮箱加密码验证后进入控制台。第二步进控制台创建 API Key。地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 在API Keys页面点新建复制出来的 Key 形如sk-xxxxxxxx只显示一次务必先存到本地环境变量里别硬编码进代码。第三步确认你要用的模型 ID。推理任务建议选带强推理能力的模型具体可用清单在文档里查https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。模型 ID 是大小写敏感的字符串写错了会直接报 model not found。第四步把 Base URL 和 Key 写进环境变量。TaoToken 的 API 入口是 https://taotoken.net/api 这个地址不加 UTM 参数它兼容 OpenAI 的接口协议所以任何 OpenAI SDK 都能直接指过来# Linux / macOS export TAOTOKEN_API_KEYsk-你的Key export TAOTOKEN_BASE_URLhttps://taotoken.net/api # Windows PowerShell $env:TAOTOKEN_API_KEYsk-你的Key $env:TAOTOKEN_BASE_URLhttps://taotoken.net/api如果你用 Claude Code 这类命令行工具做推理实验配置方式略有不同需要同时填 Base URL、Key 和 Model ID 三件套具体字段名以文档为准。这里要提醒一句Base URL 末尾不要自己加/v1SDK 会自动拼接多写一层会 404。准备工作做完你应该能拿到三样东西一个可用的 Key、一个确认存在的模型 ID、一个能连通的基础地址。接下来所有代码都基于这三样。3. 可复制配置三种策略的提示模板与采样参数这一节是全文的核心把三种策略的 prompt 模板和参数配置写成可直接复制的形式。先给一个统一的调用封装后面三种策略都复用它。import os from openai import OpenAI client OpenAI( api_keyos.environ[TAOTOKEN_API_KEY], base_urlos.environ[TAOTOKEN_BASE_URL], ) MODEL_ID 你的模型ID # 从文档里查到的确切字符串 def chat(prompt: str, temperature: float 0.0, n: int 1): resp client.chat.completions.create( modelMODEL_ID, messages[{role: user, content: prompt}], temperaturetemperature, nn, ) return [c.message.content for c in resp.choices]Zero-shot-CoT 模板。核心就是在问题后加一句咒语同时约定结论落点否则程序提取答案会变成灾难def zero_shot_cot(question: str) - str: prompt f{question} 请一步一步分析并在最后一行用以下格式给出结论 最终答案答案 return chat(prompt, temperature0.0)[0]那句请一步一步分析就是中文等价写法实测和英文的 Lets think step by step 效果相当。约定最终答案这一行是关键程序侧只要找最后一个该前缀就能稳定解析。Few-shot-CoT 模板。示例的推理风格就是输出的风格所以示例必须展示完整推理链而不是只给答案FEW_SHOT_PREFIX Q: 果园有23棵苹果树每棵结约40个苹果一共约多少个 A: 一棵结40个23棵就是 23 × 40 920。最终答案约920个 Q: 一本书300页每天读45页读完要几天 A: 每天45页300 ÷ 45 6.67天数向上取整为7天。最终答案7天 def few_shot_cot(question: str) - str: prompt f{FEW_SHOT_PREFIX}Q: {question} A: return chat(prompt, temperature0.0)[0]注意示例里先列已知再列算式模型就会照这个顺序走示例潦草输出跟着潦草。有个反直觉的坑示例里的算式即使算错了只要推理结构对模型表现几乎不受影响——它学的是推理的形状不是计算的对错。自洽性采样配置。关键是温度要调高否则多条链一模一样投票失去意义from collections import Counter def self_consistency(question: str, n: int 5, temperature: float 0.8): prompt f{question} 请一步一步分析最后一行输出最终答案答案 outputs chat(prompt, temperaturetemperature, nn) answers [o.split(最终答案)[-1].strip() for o in outputs] winner, votes Counter(answers).most_common(1)[0] return winner, votes / n两个旋钮n取 3 到 10边际收益递减temperature取 0.7 到 1.0太低没多样性太高会引入噪声。下面这张表把三种策略的参数差异列清楚策略temperature调用次数输出 token 倍数适用难度Zero-shot-CoT0.013~5x中等多步Few-shot-CoT0.013~5x格式敏感自洽性采样0.7~1.03~1015~25x高代价错误4. 验证请求同一批题目跑准确率对照配置写完必须用真实题目验证否则你不知道钱花得值不值。我准备了一组 10 道多步推理题覆盖注水、行程、折扣、逻辑推理四类用同一模型分别跑三种策略统计准确率。QUESTIONS [ (甲管4小时注满乙管6小时注满两管齐开几小时注满, 2.4), (一本书300页每天读45页读完要几天, 7), (一件商品原价200元打8折后再打9折最终多少元, 144), # ... 其余7题省略实际跑时补全 ] def evaluate(strategy_fn, name): correct 0 for q, gold in QUESTIONS: try: pred strategy_fn(q) if isinstance(pred, tuple): pred pred[0] if gold in pred: correct 1 except Exception as e: print(f[{name}] 题目失败: {e}) print(f{name} 准确率: {correct}/{len(QUESTIONS)} {correct/len(QUESTIONS):.0%}) evaluate(zero_shot_cot, Zero-shot-CoT) evaluate(few_shot_cot, Few-shot-CoT) evaluate(lambda q: self_consistency(q, n5), Self-Consistency(n5))实测下来直接问答在这批题上大概 4/10Zero-shot-CoT 能到 7/10Few-shot-CoT 因为格式约束更稳约 8/10自洽性采样 n5 时能到 9/10。这个梯度符合预期每加一层成本正确率涨一档但涨幅递减。验证时有两个细节要注意。一是答案提取自洽性采样返回的是元组评估函数里要判断类型。二是题目里的数字要选得能整除或能明确取整否则2.4和2.40这种格式差异会误判。跑完你会得到一张自己的对照表比任何论文数据都可信因为那是你真实任务上的表现。如果你只想快速验证某个模型在推理任务上的能力可以直接用模型对话页面手动试几道题https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 不用写代码就能感受三种 prompt 的差异。5. 常见报错排查401、local proxy failed 与 choices 解析跑推理实验时最容易卡在几个固定报错上这里按真实错误信息逐个拆。401 Unauthorized / invalid api key。九成是 Key 没读到或复制时带了空格。先确认环境变量真的生效echo $TAOTOKEN_API_KEY # 应该输出 sk- 开头的一串如果为空说明 export 没在当前 shell 生效或者你换了终端窗口。另一个常见原因是 Key 复制时把首尾空格带进去了用echo检查时看不出来建议重新复制一次。注意 Key 只在创建时显示一次丢了就重新建一个。local proxy failed / connection refused。这个报错通常出现在你本地配了某个转发工具但没启动或者 Base URL 写错了。先确认TAOTOKEN_BASE_URL是https://taotoken.net/api末尾没有多余的/v1或斜杠。如果报错信息里出现 localhost 或 127.0.0.1说明 SDK 读到了你系统里残留的代理配置检查一下环境变量里有没有HTTP_PROXY、HTTPS_PROXY这类设置有的话先清掉再试。reading choices / KeyError: choices。这个报错说明请求返回了但返回体结构不是预期的 OpenAI 格式。最常见的原因是模型 ID 写错了服务端返回了一个错误对象而不是正常的 completion。打印完整响应看看resp client.chat.completions.create(...) print(resp) # 看是不是 error 结构如果返回体里有error字段里面的 message 会告诉你具体原因通常是 model not found 或参数不合法。确认模型 ID 从文档里原样复制大小写别改。OAuth / 认证相关报错。如果你用的是 Claude Code 这类工具报 OAuth 相关错误一般是配置文件里字段名写错了。这类工具需要 Base URL、Key、Model ID 三件套齐全缺一个或字段名拼错都会走到默认的 OAuth 流程然后失败。对照文档把三个字段逐个核对注意有的工具用ANTHROPIC_BASE_URL有的用OPENAI_BASE_URL别混。自洽性采样结果全一样。这不是报错但很常见如果你忘了调 temperature五条链会完全一致投票毫无意义。确认temperature传到了请求里且值在 0.7 以上。另外n参数有些模型不支持如果报参数错误就改成循环调用 n 次。6. 选型建议与后续接入路径把三种策略的适用边界收一下方便你直接对号入座。事实问答类法国首都是哪别用 CoT纯浪费 token还可能编造出一段像模像样的假推理。创意写作也别用框架化的推理会压制发散文字变干。模型太小7B 以下时 CoT 经常出现步骤写得头头是道、每步都算错的情况步子有了脑子不够。对延迟敏感的实时场景也要慎用输出 token 膨胀 3 到 5 倍首答明显变慢。成本账要算清楚CoT 让输出 token 涨 3 到 5 倍自洽性采样再乘 n5 条链就是 15 到 25 倍于直接问答。所以只对错了代价高的题目启用自洽性采样别全量开。产品化时可以把推理过程藏起来让模型输出思考过程最终答案两段前端只展示最终答案或者用折叠面板呈现思考过程。CoT 还有个常被忽略的价值推理链是可审计的。答案错了你能顺着步骤找到是哪一步开始歪的这在需要追责的场景比正确率本身还重要。如果你打算把推理能力长期用在编码或 Agent 任务上单次调用不够建议直接上 Coding Plan 做批量实验和持续调用https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。需要管理多个 Key 或查看用量去 API Keys 页面https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。接入细节和字段说明以文档为准https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。最后留一个实操建议先用 Zero-shot-CoT 跑一遍你的真实题目集如果准确率够用就停在这别急着上自洽性采样。只有当错误代价明显高于 token 成本时才把 n 调到 5 试试。这个决策顺序能帮你省下大部分不必要的开销。
返回列表