ARTICLE DETAIL

资讯详情

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

北大|deepseek|MATH-SHEPHERD:AI如何实现数学推理的自我验证与强化

北大|deepseek|MATH-SHEPHERD:AI如何实现数学推理的自我验证与强化 1. 从 MATH-SHEPHERD 看数学推理的自动验证为什么人工标注不再是瓶颈数学推理一直是检验大模型能力的硬骨头。你让模型解一道竞赛题它可能洋洋洒洒写十几步最后答案对了但中间某一步其实是错的也可能答案错了但推理过程大部分正确。这种「过程对错」的判定比只看最终答案要难得多。OpenAI 在 Lets Verify Step by Step 里已经证明过程奖励模型PRM比结果奖励模型ORM更能提升数学推理能力。但问题也很直接PRM800K 那种数据集需要人工逐步标注成本高、周期长、难以规模化。北大和 DeepSeek 合作的 MATH-SHEPHERD 就是冲着这个痛点来的——它提出了一套无需人工标注的自动验证机制让模型自己给每一步推理打标签再用这些标签训练 PRM最后结合强化学习提升 LLM 的数学能力。MATH-SHEPHERD 的核心思路可以概括成一句话判断某一步推理是否正确不看这一步本身而是从这一步出发继续采样 N 次看最终能不能到达正确答案。如果从第 k 步出发采样 N 次里有 C 次得到正确答案E 次错误那么这一步的得分就有两种定义方式HEHard Estimation只要 C 0标签就是 1否则为 0。二分类信号。SESoft Estimation得分是 C / (C E)是一个概率值。论文里有个很关键的发现用 SE 标签和 HE 标签分别训练 PRM性能没有显著差异。也就是说哪怕只有二分类信号也足以训练出有效的 PRM。这个结论对工程落地很重要因为它意味着你不需要精确的概率估计采样几次拿到「有没有正确路径」就够了。这套机制适合谁想复现数学推理强化实验的开发者、做 Agent 过程监督的研究者、以及需要给模型输出做自动校验的工程团队。你不需要先攒一个大规模人工标注数据集只要有一个能调用模型采样的 API 通道就能跑起来。我试过把这套流程拆成可执行的步骤下面会从环境准备、TaoToken 接入、配置片段、验证请求到常见报错一步步走完。整个过程的核心是用统一的 Key/API 通道调用 DeepSeek 等模型完成从采样到 PRM 训练再到验证的闭环。2. TaoToken 前置准备统一 Key 与 API 通道接入 DeepSeek 数学推理在复现 MATH-SHEPHERD 之前你需要一个稳定的模型调用通道。原因很实际这套流程里会大量调用模型做采样——每一步推理要采样 N 次一道题十几步一个数据集几百上千道题调用量是成百上千倍的放大。如果每次都要切换不同厂商的 Key、处理不同的接口格式实验还没跑完人已经疯了。TaoToken 在这里的角色是统一入口。它提供兼容 OpenAI 格式的 API你可以用同一套 Key 和 Base URL 调用 DeepSeek 等模型省去多厂商适配的麻烦。官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 端点是 https://taotoken.net/api 。具体要准备三样东西第一API Key。登录后进入控制台在 API Keys 页面创建一个新 Key。这个 Key 就是后面所有请求的凭证。创建入口在 https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。第二确认模型 ID。MATH-SHEPHERD 的采样和验证需要数学能力较强的模型DeepSeek 系列是合适的选择。你可以在模型对话页面先手动试一下确认模型能正常响应数学题。模型对话入口 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 。第三接入文档。不同语言的 SDK 调用方式、参数格式、错误码说明都在文档里。接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。如果你打算长期跑编码或 Agent 类实验可以关注 Coding Plan它更适合高频调用场景 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。这里要强调一个工程细节MATH-SHEPHERD 的采样是「从第 k 步继续生成」不是从头重新生成。所以你的调用逻辑需要支持「给定前缀续写后续推理」。大多数兼容 OpenAI 的接口都支持 messages 数组传入多轮对话你可以把前 k 步作为 assistant 的历史消息让模型从第 k1 步继续。这一点在配置环节会具体写。另外采样次数 N 的选择直接影响成本和效果。论文里比较了不同 N 的效果N 越大标签越可靠但调用量线性增长。建议先用 N4 到 N8 跑通流程确认无误后再放大。3. 可复制配置MATH-SHEPHERD 采样与 PRM 训练参数片段这一节给你可以直接复制的配置。分两部分一是模型调用的环境配置二是 MATH-SHEPHERD 的采样与标签生成参数。先看环境配置。推荐用.env文件管理避免 Key 硬编码进代码# .env TAOTOKEN_API_KEYsk-你的Key TAOTOKEN_BASE_URLhttps://taotoken.net/api TAOTOKEN_MODELdeepseek-chat然后是 Python 侧的客户端初始化。用 OpenAI SDK 即可因为 TaoToken 兼容 OpenAI 格式# client.py import os from openai import OpenAI from dotenv import load_dotenv load_dotenv() client OpenAI( api_keyos.getenv(TAOTOKEN_API_KEY), base_urlos.getenv(TAOTOKEN_BASE_URL), ) MODEL_ID os.getenv(TAOTOKEN_MODEL)接下来是 MATH-SHEPHERD 的核心采样逻辑。给定一道题和已经生成的前 k 步从第 k 步继续采样 N 次统计到达正确答案的次数# shepherd.py import re from client import client, MODEL_ID def extract_answer(text: str) - str: 从模型输出中提取最终答案按数据集格式调整 match re.search(r\\boxed\{(.?)\}, text) return match.group(1).strip() if match else def sample_from_step(question: str, prefix_steps: list[str], n: int 8, temperature: float 0.7) - list[str]: 从第 k 步继续采样 N 次返回 N 个完整推理结果 messages [{role: user, content: question}] if prefix_steps: messages.append({ role: assistant, content: \n.join(prefix_steps) }) results [] for _ in range(n): resp client.chat.completions.create( modelMODEL_ID, messagesmessages, temperaturetemperature, max_tokens1024, ) results.append(resp.choices[0].message.content) return results def compute_step_label(question: str, prefix_steps: list[str], ground_truth: str, n: int 8) - dict: 计算某一步的 HE 和 SE 标签 samples sample_from_step(question, prefix_steps, nn) correct 0 for s in samples: if extract_answer(s) ground_truth: correct 1 wrong n - correct he 1 if correct 0 else 0 se correct / (correct wrong) if (correct wrong) 0 else 0.0 return {HE: he, SE: se, correct: correct, total: n}如果你用 Cline 或 Claude Code 这类工具做辅助开发配置里同样要写全三件套。以 Cline 的 MCP 配置为例Base URL、Key、Model ID 一个都不能少{ mcpServers: { taotoken: { command: npx, args: [-y, taotoken/mcp-server], env: { TAOTOKEN_API_KEY: sk-你的Key, TAOTOKEN_BASE_URL: https://taotoken.net/api, TAOTOKEN_MODEL: deepseek-chat } } } }注意 Base URL 不要带末尾斜杠Model ID 要和你在模型对话页面确认的一致。这两个细节错了后面会直接报 401 或 model not found。PRM 训练侧的关键参数用交叉熵损失输入是每一步的隐藏状态标签用 HE 或 SE。论文结论是两者差异不显著工程上建议先用 HE因为二分类实现更简单标签生成也更快。# prm_train.py 关键参数 PRM_CONFIG { loss: cross_entropy, label_type: HE, # 或 SE learning_rate: 1e-5, batch_size: 32, epochs: 3, max_steps_per_sample: 20, }采样温度建议 0.7 左右太低会导致 N 次采样结果高度相似标签区分度不够太高会引入太多噪声。N 先用 8跑通后再根据预算调整。4. 验证请求与成功结果从单步标签到端到端数学推理校验配置写完后先别急着跑全量数据集。用一道题做端到端验证确认每一步都能正常工作。准备一道有标准答案的数学题比如question Solve for x: 2x 3 11 ground_truth 4第一步让模型生成完整推理过程resp client.chat.completions.create( modelMODEL_ID, messages[{role: user, content: question}], temperature0.0, ) full_reasoning resp.choices[0].message.content print(full_reasoning)预期输出类似Step 1: Subtract 3 from both sides: 2x 8 Step 2: Divide both sides by 2: x 4 \boxed{4}第二步把推理拆成步骤列表对每一步计算标签。假设拆成两步steps [ Step 1: Subtract 3 from both sides: 2x 8, Step 2: Divide both sides by 2: x 4, ] for i in range(len(steps)): prefix steps[:i1] label compute_step_label(question, prefix, ground_truth, n8) print(fStep {i1} label: {label})成功的结果应该看到每一步的 HE 为 1SE 接近 1.0因为这道题很简单从任何一步继续采样都容易得到正确答案Step 1 label: {HE: 1, SE: 1.0, correct: 8, total: 8} Step 2 label: {HE: 1, SE: 1.0, correct: 8, total: 8}第三步故意制造一个错误步骤验证标签能否识别。把第一步改成错误推导wrong_steps [ Step 1: Add 3 to both sides: 2x 14, Step 2: Divide both sides by 2: x 7, ] label compute_step_label(question, wrong_steps[:1], ground_truth, n8) print(fWrong step label: {label})预期 HE 为 0SE 接近 0因为从错误步骤继续采样很难到达正确答案 4Wrong step label: {HE: 0, SE: 0.0, correct: 0, total: 8}如果这两组结果符合预期说明你的采样通道、答案提取、标签计算都正常。接下来可以放大到数据集级别对每道题生成推理逐步计算标签把 (step, label) 对存下来作为 PRM 训练数据。验证器verifier的使用方式是对同一道题采样多条完整推理用 PRM 给每条推理的每一步打分取平均分或最低分作为整条推理的得分选得分最高的作为最终答案。论文里对比了这种 PRM 重排序和简单投票majority voting的效果PRM 在难题上优势更明显。强化学习侧用训练好的 PRM 作为奖励信号结合 PPO 训练 LLM。这一步对算力要求较高建议先在验证器任务上确认 PRM 质量再决定是否进入 RL 阶段。5. 常见报错排查401、local proxy failed、reading choices 与 OAuth 问题跑这套流程时最容易卡在调用环节。下面是我踩过的坑和对应的排查动作。401 Unauthorized。最常见的原因是 Key 没传对或 Base URL 写错。检查三点.env里的TAOTOKEN_API_KEY是否以sk-开头且没有多余空格TAOTOKEN_BASE_URL是否是https://taotoken.net/api注意不要带末尾斜杠也不要写成/v1代码里OpenAI(api_key..., base_url...)两个参数是否都传了。如果用的是 Cline 或 MCP 配置检查 JSON 里的 env 字段有没有拼写错误。local proxy failed。这个报错通常出现在本地网络环境有额外代理设置时。排查方向是检查系统环境变量里有没有HTTP_PROXY、HTTPS_PROXY之类的设置如果有尝试临时清掉再跑。另外确认你的请求是直接发往https://taotoken.net/api没有经过其他中间层。reading choices 报错。典型信息是KeyError: choices或AttributeError: NoneType object has no attribute choices。这说明响应体里没有 choices 字段通常是请求本身失败了但代码没检查错误就往下取。修复方式是在取 choices 之前先判断响应resp client.chat.completions.create(...) if not resp or not resp.choices: raise RuntimeError(fEmpty response: {resp}) content resp.choices[0].message.content同时打印完整响应体看返回的错误信息是什么。常见原因是模型 ID 写错或者 max_tokens 设置超过了模型上限。OAuth 相关报错。如果你用 Claude Code 或类似工具接入可能会遇到 OAuth token 过期或未授权的问题。这类工具通常需要先完成一次授权流程。检查你的配置文件里 Base URL 和 Key 是否都指向 TaoToken而不是残留了其他服务的配置。Claude Code 的接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentclaude_codeutm_campaignrewrite 里面有完整的配置步骤。采样结果全一样。这不是报错但会让标签失效。原因是 temperature 设太低或者 N 太小。把 temperature 调到 0.7 左右N 至少设为 4。如果还是全一样检查是不是模型对这道题太确定换一道更难的题试试。答案提取失败。extract_answer返回空字符串导致所有标签都是 0。检查你的正则是否匹配模型实际输出的格式。不同模型、不同 prompt 下答案可能写成\boxed{4}、答案是 4、x 4等多种形式。建议先打印几条原始输出确认格式后再写提取逻辑。6. 语义一致 CTA把 MATH-SHEPHERD 流程接到你的实验管线走到这里你已经有了完整的可执行路径用 TaoToken 统一通道调用 DeepSeek从第 k 步采样 N 次计算 HE/SE 标签训练 PRM再用 PRM 做验证器或 RL 奖励。剩下的就是把它接到你自己的实验管线里。如果你还在调试接入环节先去 API Keys 页面确认 Key 状态再对照接入文档检查 Base URL 和模型 ID https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 和 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。如果你想先手动验证模型对数学题的响应质量用模型对话页面跑几道题确认采样多样性符合预期 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 。如果你打算长期跑这类采样密集的实验Coding Plan 的调用配额更适合 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。最后给一个实用建议先把 N 设为 4用 20 道题跑一遍完整流程统计标签分布和 PRM 在验证集上的准确率。确认无误后再放大 N 和数据集规模。这样能在成本可控的前提下快速验证你的管线是否正确。
返回列表