资讯详情

Prompt Engineering 进阶:CoT、Few-shot、ReAct、Self-Consistency 推理范式全景与 TaoToken 统一 API 实践

📅 2026/10/1 7:12:30 | 华诺云谱 👁 阅读
Prompt Engineering 进阶:CoT、Few-shot、ReAct、Self-Consistency 推理范式全景与 TaoToken 统一 API 实践
1. 从一道数学题说起为什么同一个模型换个问法准确率差一倍先看一道题。小明有 5 个苹果吃了 2 个又买了 3 袋苹果每袋 4 个。他现在有几个苹果如果你直接问模型答案是多少一些中小模型会脱口而出一个错误数字。但如果你在问题后面加一句让我们一步一步思考同一个模型、同一个温度参数它可能会先算 5-23再算 3×412最后算 31215给出正确答案。模型没变变的是引导模型推理的方式。这就是推理范式的威力。大模型本质上是预测下一个 token的概率机器它的推理能力不是没有而是需要被正确地激发出来。不同的 Prompt 结构就像不同的思维脚手架会引导模型走向不同的推理路径。这篇文章要解决的核心问题是CoT、Few-shot、ReAct、Self-Consistency 这四种推理范式在复杂问答和工具调用场景下到底怎么组合使用怎么用一套统一的 API 通道把它们串起来做可复现的对比测试。我会给出可复制的提示词模板、请求参数配置和逐步验证动作你可以直接跟着搭一套自己的推理范式测试流程。适合谁看已经会调大模型 API、想系统提升 Prompt 效果的工程师正在做 Agent 或工具调用、需要理解 ReAct 循环怎么落地的人以及想建立一套从问对问题到选对范式决策框架的技术负责人。先说结论这四种范式不是互斥的而是可以叠加的。Few-shot 管格式CoT 管推理深度Self-Consistency 管准确率兜底ReAct 管外部交互。真正难的不是理解它们各自是什么而是知道什么时候该用哪个、怎么组合、成本怎么算。2. TaoToken 统一 API 通道一次配置多模型对比做推理范式对比测试最大的工程障碍不是 Prompt 本身而是模型切换。你要对比同一个 Prompt 在 GPT、Claude、Gemini 上的表现传统做法是注册多个平台、维护多套 Key、适配不同的请求格式。光环境搭建就能耗掉半天。TaoToken 解决的就是这个问题一个 API Key一套 OpenAI 兼容的请求格式背后可以路由到多个主流模型。对于做推理范式对比来说这意味着你只需要写一份测试代码改一个 model 字段就能切换模型其他全部不变。它的 API 地址是 https://taotoken.net/api完全兼容 OpenAI 的 /v1/chat/completions 接口。你现有的 OpenAI SDK 代码只需要改 base_url 和 api_key 两个地方就能跑。为什么这对推理范式测试特别重要因为不同范式对模型的敏感度不一样。CoT 在参数量大的模型上效果更明显Self-Consistency 需要模型有足够的生成多样性ReAct 则依赖模型对工具描述的理解能力。如果你只有一个模型的访问权限根本没法判断效果不好到底是 Prompt 的问题还是模型的问题。统一通道让你能用同一套测试脚本快速跑完多个模型的对比矩阵。另外做 Self-Consistency 需要同一个 Prompt 采样 N 次做 ReAct 需要多轮循环调用这些都会产生大量请求。统一通道在计费和配额管理上省心很多不用在多个平台之间对账。如果你还没配好环境先去控制台创建一个 API Keyhttps://taotoken.net/console/api-keys 。创建完记下来后面所有代码都用这一个 Key。想先直观感受一下不同模型对同一 Prompt 的响应差异可以直接在模型对话页面测试https://taotoken.net/models 。把下面第三节的 Prompt 模板粘进去切换模型看输出变化比看文档快得多。3. 可复制配置四类范式的 Prompt 模板与请求参数这一节是全文的核心给出四类范式可以直接复制的配置。每个模板都配了对应的请求参数你可以直接拿去跑。3.1 基础环境配置先建一个配置文件把统一通道的接入信息写进去。我用 JSON 格式路径放在项目根目录的 config.json{ base_url: https://taotoken.net/api, api_key: sk-你的Key, default_model: gpt-4o, timeout: 60 }Python 侧的初始化代码import json from openai import OpenAI with open(config.json) as f: cfg json.load(f) client OpenAI( base_urlcfg[base_url], api_keycfg[api_key], timeoutcfg[timeout] ) def chat(messages, modelNone, temperature0.2, n1): resp client.chat.completions.create( modelmodel or cfg[default_model], messagesmessages, temperaturetemperature, nn ) return resp这段代码是后面所有范式测试的公共底座。注意 base_url 结尾不要加 /v1SDK 会自动补全路径。3.2 Few-shot 模板用例子框定输出格式Few-shot 的核心是在 Prompt 里给 2 到 5 个输入→输出示例。场景选一个后端开发天天干的活自然语言转 SQL。FEWSHOT_PROMPT 请将用户的中文问题转换为 SQL 查询。 示例1 问题查询所有状态为已支付的订单 SQLSELECT * FROM orders WHERE status paid; 示例2 问题统计每个用户的订单总金额按金额降序 SQLSELECT user_id, SUM(amount) AS total FROM orders GROUP BY user_id ORDER BY total DESC; 现在请转换 问题查询最近7天注册且下单超过3次的用户 SQL messages [{role: user, content: FEWSHOT_PROMPT}] resp chat(messages, temperature0.0) print(resp.choices[0].message.content)参数要点temperature 设 0.0因为 Few-shot 要的是稳定复现示例格式不需要创造性。示例数量控制在 2 到 5 个太少学不到模式太多浪费上下文窗口。示例顺序有讲究模型对最后的示例记忆最强把最贴近目标任务的示例放最后。3.3 CoT 模板结构化思维链CoT 的关键是让模型把中间推理过程显式写出来。生产环境里为了让输出可解析通常用标签包裹推理和答案COT_PROMPT 请按照以下格式回答 thinking 在这里写出你的逐步推理过程 /thinking answer 这里只写最终答案 /answer 问题一个水池有甲乙两个进水管甲管单独注满需要6小时乙管单独注满需要4小时。两管同时打开多少小时能注满水池 messages [{role: user, content: COT_PROMPT}] resp chat(messages, temperature0.2) content resp.choices[0].message.content print(content)下游代码可以用正则提取answer标签里的结果同时保留thinking用于调试和溯源。temperature 设 0.2 左右太低会让推理链僵化太高容易跑偏。如果你用的是自带思考过程的推理模型不需要手动加 CoT 提示它本来就会深度推理。强行加反而可能干扰它自己的思考节奏。CoT 对这些模型的价值主要在于可解释性——让思考过程对你可见、可审计。3.4 Self-Consistency 配置多路采样加投票Self-Consistency 的做法是对同一个 CoT Prompt 独立采样 N 次然后对最终答案投票。关键是 temperature 要调高让多次生成有足够的多样性import re from collections import Counter def self_consistency(question, n5, temperature0.7): prompt COT_PROMPT.replace(问题一个水池有甲乙两个进水管甲管单独注满需要6小时乙管单独注满需要4小时。两管同时打开多少小时能注满水池, f问题{question}) messages [{role: user, content: prompt}] resp chat(messages, temperaturetemperature, nn) answers [] for choice in resp.choices: text choice.message.content m re.search(ranswer(.*?)/answer, text, re.DOTALL) if m: answers.append(m.group(1).strip()) counter Counter(answers) return counter.most_common(1)[0][0], counter result, dist self_consistency(一件商品先涨价20%再降价20%最终价格是原价的百分之几, n5) print(投票结果, result) print(分布, dist)参数要点temperature 建议 0.4 到 0.8太低路径太雷同投票没意义太高容易胡说。n 通常取 5 到 20。注意投票只投最终答案不投推理文本因为多条链的推理表述千差万别没法直接比较。所以它天生适合答案离散可枚举的题不适合开放式长文本生成。3.5 ReAct 模板推理与行动交替ReAct 让模型在推理和行动之间来回切换。下面是一个带工具调用的完整模板REACT_PROMPT 你可以使用以下工具 工具1search[query] 用途搜索信息返回相关文本 工具2calculator[expression] 用途计算数学表达式 请严格按照以下格式回答 Thought: 你的思考过程 Action: 工具名[参数] Observation: 工具返回结果 ...重复 Thought/Action/Observation 直到能给出答案 Final Answer: 最终答案 问题李安的处女作电影的拍摄地和他后来的《少年派的奇幻漂流》取景地是同一个国家吗 messages [{role: user, content: REACT_PROMPT}] resp chat(messages, temperature0.0) print(resp.choices[0].message.content)模型会输出类似这样的轨迹Thought: 我需要先找出李安的处女作电影是什么。 Action: search[李安 导演 处女作 第一部电影] Observation: 李安的导演处女作是 1993 年的《推手》。 Thought: 现在需要查《推手》的拍摄地。 Action: search[电影《推手》拍摄地点] Observation: 《推手》主要在美国华盛顿州拍摄。 ... Final Answer: 不是同一个国家。实际工程中你需要写一个解析器把 Action 提取出来、执行对应工具、把 Observation 拼回对话历史然后再次调用模型。这个循环就是 Agent 的核心。工具描述的质量决定整个 Agent 的上限——描述写得含糊模型就会选错工具、传错参数、陷入死循环。4. 逐步验证从单次请求到完整测试流程配置写好了接下来验证每一步是否真的跑通。我按从简到繁的顺序给验证动作。4.1 验证基础连通性先跑一个最简单的请求确认 Key 和 base_url 没问题resp chat([{role: user, content: 回复OK两个字}]) print(resp.choices[0].message.content)如果这一步报 401说明 Key 有问题去控制台重新确认。如果报连接超时检查网络和 base_url 拼写。4.2 验证 Few-shot 格式稳定性用 3.2 的模板跑三次看输出的 SQL 格式是否一致。正常情况下三次都应该输出SELECT ... FROM ... WHERE ...的结构不会跑偏成自然语言解释。如果格式不稳定检查示例是否够清晰、temperature 是否设成了 0。4.3 验证 CoT 标签解析用 3.3 的模板跑一次然后用正则提取import re content resp.choices[0].message.content thinking re.search(rthinking(.*?)/thinking, content, re.DOTALL) answer re.search(ranswer(.*?)/answer, content, re.DOTALL) print(推理过程, thinking.group(1).strip() if thinking else 未找到) print(最终答案, answer.group(1).strip() if answer else 未找到)如果标签没被正确输出可能是模型没理解格式要求。可以在 Prompt 里加一句必须严格使用上述标签格式不要省略标签。4.4 验证 Self-Consistency 投票分布用 3.4 的代码跑一道有确定答案的题观察投票分布。理想情况下正确答案应该占多数。如果分布很分散说明 temperature 太高或者题目本身有歧义。如果所有答案都一样说明 temperature 太低需要调高。4.5 验证 ReAct 循环ReAct 的验证需要你实现工具执行逻辑。先写一个假的 search 函数返回固定结果确认模型能正确解析 Action 并继续循环def fake_search(query): if 处女作 in query: return 李安的导演处女作是 1993 年的《推手》。 if 推手 in query and 拍摄 in query: return 《推手》主要在美国华盛顿州拍摄。 if 少年派 in query: return 该片主要在印度和中国台湾取景。 return 未找到相关信息 # 解析模型输出中的 Action执行工具拼回对话 # 循环直到出现 Final Answer 或达到最大轮数跑通后你会看到模型经过 4 轮 Thought/Action/Observation 循环最终给出不是同一个国家的答案。4.6 多模型对比矩阵基础验证都通过后用同一套 Prompt 跑多个模型记录每个模型在每类范式下的表现。建议记录这几个维度答案正确率、输出格式合规率、平均 token 消耗、平均延迟。这张对比表才是你做技术选型的依据。5. 常见报错排查401、local proxy failed、reading choices 怎么解这一节列出实际跑测试时最常撞到的几个报错以及对应的排查路径。5.1 401 Unauthorized最常见的报错。原因通常是 Key 写错、Key 过期、或者 base_url 和 Key 不匹配。排查步骤先确认 config.json 里的 api_key 是完整的没有多余空格再去控制台确认 Key 状态正常最后确认 base_url 是 https://taotoken.net/api 而不是其他地址。如果用了环境变量检查环境变量是否被正确加载。5.2 local proxy failed 或连接被拒绝这个报错通常出现在本地网络环境有额外配置的情况下。排查方向确认没有额外的网络层拦截请求检查系统代理设置是否影响了 SDK 的连接如果是公司网络确认出口策略允许访问 API 地址。最直接的验证方式是用 curl 手动发一个请求curl https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-你的Key \ -H Content-Type: application/json \ -d {model:gpt-4o,messages:[{role:user,content:hi}]}如果 curl 能通但 SDK 不通问题在 SDK 配置如果 curl 也不通问题在网络层。5.3 reading choices 相关报错典型报错是KeyError: choices或者AttributeError: NoneType object has no attribute choices。这说明响应体里没有 choices 字段通常是请求本身失败了但 SDK 没有正确抛出异常。排查步骤先打印完整的 response 对象看返回了什么检查 model 字段是否拼写正确模型名写错会返回错误信息而不是 choices检查 messages 格式是否符合要求。一个稳妥的做法是在 chat 函数里加一层错误处理def chat(messages, modelNone, temperature0.2, n1): try: resp client.chat.completions.create( modelmodel or cfg[default_model], messagesmessages, temperaturetemperature, nn ) if not resp.choices: raise ValueError(f响应无 choices 字段{resp}) return resp except Exception as e: print(f请求失败{e}) raise5.4 OAuth 或认证方式不匹配如果你用的是某些需要 OAuth 流程的工具比如 Claude Code 的某些接入方式可能会遇到认证方式不匹配的报错。这类问题的核心是确认你用的认证方式API Key 还是 OAuth token和工具期望的一致。用统一 API 通道时统一走 API Key 认证不要混用其他认证方式。5.5 模型名不存在报错信息通常是model not found或类似提示。解决方法是去模型列表页面确认可用的模型 ID注意大小写和连字符。不同提供商的模型命名规则不一样比如有的是gpt-4o有的是claude-3-5-sonnet-20241022不能想当然。5.6 超时或响应截断做 Self-Consistency 采样 10 次时如果并发太高可能触发限流或超时。解决方法是加并发控制或者把 n 拆成多次请求。另外 CoT 和 ReAct 的输出比较长确认 max_tokens 设置够大否则推理链会被截断导致标签解析失败。6. 工程落地经验与统一通道 CTA跑完上面所有验证你应该已经有一套可复现的推理范式测试流程了。最后分享几条实战中反复验证过的经验。第一从最简单的范式开始逐级加码。先试 Zero-shot不行加 Few-shot还不行上 CoT准确率不够再叠 Self-Consistency涉及外部世界就切 ReAct。每加一级都是在用成本换准确率你要清楚这笔账是否划算。别一次上全家桶多一层就多一份成本和故障面。第二Few-shot 和 CoT 往往要一起用。最好的 CoT 通常是 Few-shot CoT——用几个带完整推理过程的例子同时教会模型任务格式和推理方式。单独用 Zero-shot CoT 虽然省事但在复杂领域模型自己生成的推理链质量参差不齐。第三ReAct 的工程难点在鲁棒性。模型生成的 Action 格式可能不合法工具可能失败循环可能陷入死胡同。生产级 ReAct 需要严格的输出格式解析和重试、工具失败的兜底策略、最大循环次数限制以及对每一环的观测。第四做对比测试时统一 API 通道能省掉大量环境切换成本。你只需要维护一份测试脚本改 model 字段就能跑完整个模型矩阵。对于需要频繁切换模型做 A/B 对比的场景这个效率提升是实打实的。如果你要长期做编码类 Agent 或者需要频繁调用多种模型做推理范式实验可以了解一下 Coding Planhttps://taotoken.net/coding-plan 。对于需要接入 Claude Code 做代码辅助的场景接入文档在这里https://taotoken.net/doc 。现在就可以动手去 https://taotoken.net/console/api-keys 创建一个 Key把第三节的配置复制到你的项目里先跑通 4.1 的基础连通性验证然后按 4.2 到 4.5 逐步验证四类范式。跑通之后用 4.6 的多模型对比矩阵找出在你的具体任务上性价比最高的范式组合。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑