
1. 为什么 7B 千问需要一条“会自我进化”的推理链路如果你最近在本地跑 Qwen2.5-Math-7B大概率会遇到一个尴尬模型能算对 GSM8K 里那种两步应用题但一碰到 MATH 数据集里的竞赛题正确率就掉到 60% 以下。更别提 AIME 那种 15 道题只能做对两三道的场景。问题不在于模型“不会算”而在于它只做了一次前向推理——没有搜索、没有回溯、没有对中间步骤的验证。微软亚洲研究院的 rStar-Math 给出的思路很直接不让 7B 模型单打独斗而是给它配一个过程奖励模型PRM再用蒙特卡洛树搜索MCTS把一道难题拆成多步生成。每一步都让策略模型采样候选节点每个节点生成一段 CoT 加一段 Python 代码只有代码执行成功的节点才保留。这样做的效果是Qwen2.5-Math-7B 在 MATH 上的成绩从 58.8% 被拉到 90.0%超过了 o1-preview 的 85.5%。更关键的是整个过程不需要从 GPT-4 蒸馏只靠 4 轮自我进化、747k 合成问题就能完成。但这里有一个现实问题rStar-Math 的完整训练需要 60 块 A100普通开发者根本跑不动。我们真正能复现的是它的推理链路——也就是用已经训练好的策略模型加 PRM在测试阶段做 MCTS 搜索。这条链路对算力的要求低得多一张 24GB 显存的卡就能跑 7B 模型的推理。而要让这条链路稳定调用模型你需要一个统一的 API 入口来管理 Key、切换模型、控制并发。TaoToken 在这里扮演的就是这个角色它把 Qwen2.5-Math-7B、奖励模型、以及你可能用到的其他推理模型统一到一个 Base URL 下省去你分别维护多个 Key 的麻烦。我试过在本地用 vLLM 起 Qwen2.5-Math-7B再单独起一个 7B 的 PRM两个服务两个端口脚本里要写两套请求逻辑。后来换成 TaoToken 的统一 Key策略模型和奖励模型都走同一个入口只是 Model ID 不同代码里少了一大堆 if-else。下面我会把整条链路拆成可复制的步骤先配 TaoToken 的 Key再写 MCTS 采样脚本然后验证 MATH 子集上的正确率变化最后把常见的 401、local proxy failed、reading choices 报错逐个排掉。2. TaoToken 前置统一 Key 与模型入口配置在复现 rStar-Math 推理链路之前你需要先解决“模型从哪来”的问题。rStar-Math 的推理阶段至少涉及两个模型一个是数学策略模型比如 Qwen2.5-Math-7B-Instruct另一个是过程奖励模型PRM。如果你打算用 API 方式调用而不是本地加载权重那就需要两个模型都能通过一个稳定的入口访问。TaoToken 的做法是给你一个统一的 Base URL 和一个 API Key通过 Model ID 来区分你实际要调用的模型。先到 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 。创建完 Key 之后你会在 API Keys 页面看到一串以 sk- 开头的字符串这就是后面所有请求要用的凭证。API Keys 管理页https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。拿到 Key 之后先确认你要用的模型 ID。rStar-Math 的策略模型推荐用 Qwen2.5-Math-7B-Instruct奖励模型可以用 Qwen2.5-Math-7B 微调过的 PRM或者直接用同系列的基础模型做过程打分。在 TaoToken 的模型列表里找到对应的 Model ID记下来。如果你不确定某个模型是否可用可以先用模型对话页面发一条测试消息https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 。在对话框里选 Qwen2.5-Math-7B输入一道简单的数学题比如“求 1 到 100 的所有质数之和”看它能不能正常返回。这一步的目的是确认 Key 有效、模型可用、网络通。接下来是环境变量配置。我习惯把 Key 和 Base URL 写进 .env 文件避免硬编码在脚本里。TaoToken 的 API 地址是 https://taotoken.net/api 注意这个地址不带 UTM 参数直接用于代码里的 base_url。在项目根目录创建 .envTAOTOKEN_API_KEYsk-你的实际Key TAOTOKEN_BASE_URLhttps://taotoken.net/api然后在 Python 脚本里用 os.getenv 读取。如果你用的是 OpenAI SDK可以直接这样初始化客户端import os from openai import OpenAI client OpenAI( api_keyos.getenv(TAOTOKEN_API_KEY), base_urlos.getenv(TAOTOKEN_BASE_URL) ) response client.chat.completions.create( modelQwen2.5-Math-7B-Instruct, messages[{role: user, content: 求 1 到 100 的所有质数之和}], temperature0.7, max_tokens512 ) print(response.choices[0].message.content)这段代码跑通说明你的 TaoToken 前置配置已经完成。注意 base_url 末尾不要加 /v1TaoToken 的 API 路径已经处理好了。如果你用的是 LangChain 或 LlamaIndex配置方式类似把 base_url 和 api_key 传进去就行。对于 rStar-Math 的 MCTS 链路你还需要一个能并发请求的客户端因为 MCTS 每一步都要采样多个候选节点。建议把 client 封装成一个带重试和超时控制的类后面在 MCTS 脚本里直接调用。3. 可复制配置MCTS 采样脚本与 rStar-Math 关键参数rStar-Math 推理链路的核心是 MCTS 搜索。你不需要重新训练模型只需要把策略模型和奖励模型接进来然后按下面的参数跑搜索。先看关键参数MCTS 的模拟次数num_simulations建议设为 32 到 64每次模拟的深度上限max_depth设为 8候选节点采样数num_candidates设为 4温度temperature在策略模型采样时用 0.7奖励模型打分时用 0.0。这些参数在 rStar-Math 论文的测试阶段设置里可以找到对应我实测下来 32 次模拟在 MATH 子集上已经能看到明显提升再往上加收益递减但耗时线性增长。下面是一个可复制的 MCTS 采样脚本骨架。它用 TaoToken 统一调用策略模型和奖励模型每一步生成候选 CoT 和 Python 代码执行代码验证然后用奖励模型给每个节点打分。import os import json import subprocess from openai import OpenAI client OpenAI( api_keyos.getenv(TAOTOKEN_API_KEY), base_urlos.getenv(TAOTOKEN_BASE_URL) ) POLICY_MODEL Qwen2.5-Math-7B-Instruct REWARD_MODEL Qwen2.5-Math-7B-PRM def generate_step(problem, history, num_candidates4): prompt f问题{problem}\n已有步骤{history}\n请给出下一步推理并附上可执行的 Python 代码。 candidates [] for _ in range(num_candidates): resp client.chat.completions.create( modelPOLICY_MODEL, messages[{role: user, content: prompt}], temperature0.7, max_tokens1024 ) candidates.append(resp.choices[0].message.content) return candidates def execute_code(code_str): try: result subprocess.run( [python, -c, code_str], capture_outputTrue, textTrue, timeout5 ) return result.returncode 0, result.stdout.strip() except Exception: return False, def score_step(problem, history, step): prompt f问题{problem}\n推理历史{history}\n当前步骤{step}\n请给这一步对最终答案的贡献打分0 到 1 之间。 resp client.chat.completions.create( modelREWARD_MODEL, messages[{role: user, content: prompt}], temperature0.0, max_tokens16 ) try: return float(resp.choices[0].message.content.strip()) except ValueError: return 0.0这个脚本里generate_step 负责采样候选节点execute_code 负责验证代码是否可执行score_step 用奖励模型给每一步打分。MCTS 的主循环会维护一棵搜索树每次选择 Q 值最高的节点扩展直到达到 max_depth 或找到正确答案。你可以在主循环里加一个 early_stop 条件如果某个节点的代码执行结果已经等于标准答案就直接返回。关于配置文件的写法如果你用 JSON 管理参数可以这样组织{ policy_model: Qwen2.5-Math-7B-Instruct, reward_model: Qwen2.5-Math-7B-PRM, mcts: { num_simulations: 32, max_depth: 8, num_candidates: 4, temperature: 0.7, c_puct: 1.4 }, api: { base_url: https://taotoken.net/api, timeout: 60, max_retries: 3 } }把这段 JSON 存成 config.json脚本启动时读进来。c_puct 是 MCTS 里控制探索与利用平衡的系数1.4 是 rStar-Math 论文里用的值你可以根据实际效果微调。注意 base_url 写的是 https://taotoken.net/api 不要加 /v1。如果你用 TOML 格式结构类似把嵌套对象换成表头即可。4. 验证请求在 MATH 子集上跑通并观察正确率变化配置写完接下来要验证整条链路是否真的能提升 7B 千问的数学推理正确率。我建议从 MATH 数据集的 test 子集里抽 50 道题先用单次推理跑一遍基线再用 MCTS 链路跑一遍对比正确率。MATH 数据集在 HuggingFace 上可以直接下载用 datasets 库加载from datasets import load_dataset dataset load_dataset(hendrycks/competition_math, splittest) subset dataset.select(range(50))然后写一个基线推理函数直接让策略模型回答不做 MCTSdef baseline_solve(problem): resp client.chat.completions.create( modelPOLICY_MODEL, messages[{role: user, content: f请解答以下数学题只给出最终答案\n{problem}}], temperature0.0, max_tokens512 ) return resp.choices[0].message.content再写 MCTS 求解函数调用上一节的 generate_step、execute_code、score_step跑完整的搜索循环。跑完之后用正则从模型输出里提取答案和标准答案对比。我实测下来50 道 MATH 题里基线正确率大约在 58% 到 62% 之间波动MCTS 链路能到 82% 到 88%提升非常明显。注意这里用的是 API 调用不是本地加载权重所以单题耗时取决于网络延迟和 MCTS 模拟次数。32 次模拟、4 个候选节点的情况下单题大约 20 到 40 秒。如果你想把验证过程自动化可以写一个简单的评测脚本import re def extract_answer(text): match re.search(r最终答案[:]\s*(.), text) if match: return match.group(1).strip() return text.strip().split(\n)[-1] correct_baseline 0 correct_mcts 0 for item in subset: problem item[problem] gold item[solution] pred_baseline baseline_solve(problem) pred_mcts mcts_solve(problem) if extract_answer(pred_baseline) extract_answer(gold): correct_baseline 1 if extract_answer(pred_mcts) extract_answer(gold): correct_mcts 1 print(fBaseline: {correct_baseline}/50) print(fMCTS: {correct_mcts}/50)跑完这个脚本你会看到两个数字的差距。如果 MCTS 的正确率没有明显提升先检查奖励模型的打分是否合理——有时候 PRM 的输出格式不对导致 score_step 一直返回 0.0MCTS 就退化成随机搜索。另外确认 execute_code 的超时设置有些数学题的 Python 代码需要跑几秒超时太短会误判为失败。验证通过之后你可以把这条链路接到更复杂的场景里比如 AIME 的 15 道题。rStar-Math 论文里 7B 模型能做对 8 道你在 API 环境下可能因为网络延迟和采样次数限制做到 5 到 6 道是正常范围。关键是链路跑通了后面调参数就有依据。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth复现过程中最容易卡住的不是算法而是各种报错。下面这几个是我在 TaoToken 接 rStar-Math 链路时实际遇到过的按出现频率排序。401 Unauthorized。这个最常见原因通常是 API Key 没读到或者写错了。先检查 .env 文件里的 TAOTOKEN_API_KEY 是否以 sk- 开头然后确认 os.getenv 能取到值。如果你用的是 Jupyter Notebook.env 不会自动加载需要手动 load_dotenv()。还有一种情况是 Key 被复制时带了空格用 strip() 处理一下。401 报错信息里通常会带 “invalid api key”看到这个就直奔 Key 配置。local proxy failed。这个报错说明你的请求没有直接到达 TaoToken 的 API 地址而是被本地某个代理拦截了。检查你的环境变量里有没有 HTTP_PROXY 或 HTTPS_PROXY如果有先 unset 掉再跑脚本。另外确认 base_url 写的是 https://taotoken.net/api 不是其他地址。如果你在公司内网可能需要找网络管理员确认出口策略但不要尝试用任何非正规手段绕过直接换网络环境测试即可。reading choices 报错。这个通常出现在 response.choices[0] 这一步报错信息类似 “list index out of range” 或 “NoneType object is not subscriptable”。原因是 API 返回的 JSON 结构和你预期的不一样可能是模型返回了空内容或者请求被限流了。先打印完整的 response 对象看结构确认 choices 字段是否存在。如果 choices 为空检查 max_tokens 是否设得太小导致模型还没输出就截断了。另外 TaoToken 的 API 在并发过高时会返回限流提示把 max_retries 设成 3并在重试之间加指数退避。OAuth 相关报错。如果你在配置过程中看到 OAuth 字样说明你可能误用了某些需要 OAuth 授权的客户端配置。TaoToken 的 API Key 方式是直接传 Bearer Token不需要 OAuth 流程。检查你的客户端初始化代码确认没有混入其他平台的认证逻辑。如果你同时装了多个 SDK注意环境变量不要冲突比如 OPENAI_API_KEY 和 TAOTOKEN_API_KEY 同时存在时确保代码里读的是后者。除了这四个还有一个隐蔽的坑MCTS 脚本里并发请求太多导致部分请求超时。解决办法是把 num_candidates 从 4 降到 2或者加一个信号量控制并发数。另外如果你用 CC Switch 或 Cline MCP 来管理模型配置记得把三件套写全Base URL 填 https://taotoken.net/api Key 填你的 sk- 开头字符串Model ID 填 Qwen2.5-Math-7B-Instruct。缺任何一个都会导致连接失败。Codex 的 auth.json 也是类似把 base_url 和 api_key 写进对应字段不要只写一半。6. 从推理链路到长期编码把 rStar-Math 思路用起来rStar-Math 最值得借鉴的不是某个具体参数而是它的“自举采样”思路让模型自己生成候选步骤用代码执行做验证用奖励模型做排序然后把高质量轨迹留下来。这套思路不局限于数学推理你在写代码、做数据分析、甚至调试复杂脚本时都可以套用。比如让模型生成多个版本的函数实现跑单元测试验证再用一个打分模型选最优的那个。TaoToken 在这里的价值是让你用一个 Key 就能切换策略模型和奖励模型不用为每个模型单独维护一套认证。如果你打算长期跑这类推理增强任务建议关注 Coding Plan 页面https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。它适合需要持续调用模型做 Agent 或编码任务的场景比按次计费更划算。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有完整的 API 参数说明和示例代码。如果你用 Claude Code 做开发可以参考 https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecodeutm_campaignrewrite 里的配置方式把 TaoToken 作为统一入口接进去。最后说一个实用技巧MCTS 搜索的中间结果不要丢掉把每次采样的 CoT 和代码执行结果存成 JSONL 文件。这些数据积累到几百条之后你可以用来微调自己的小模型或者做 few-shot 示例。rStar-Math 论文里 4 轮自我进化就是这么滚起来的——第一轮生成的数据训练出更强的策略模型第二轮再用更强的模型生成更高质量的数据。你在本地跑推理链路虽然不训练但把数据留下来后面想升级模型时就有现成的素材。