【Open AI】Large Language Monkeys 实战:用重复采样扩展 LLM 推理计算,SWE-bench 配置与验证

发布时间:2026/9/26 10:51:07
【Open AI】Large Language Monkeys 实战:用重复采样扩展 LLM 推理计算,SWE-bench 配置与验证 1. 从 SWE-bench 单次通过率说起为什么重复采样值得认真对待如果你最近在跑 SWE-bench Lite大概率会遇到一个让人不太舒服的数字单次尝试的通过率往往卡在 15% 到 20% 之间。哪怕换成更强的模型提升也有限。但 Large Language Monkeys 这篇工作给了一个很反直觉的结论——同一个模型只要把采样次数从 1 提到 250通过率能从 15.9% 拉到 56%。这不是换模型换来的而是把推理计算当成一个可以扩展的轴。重复采样Repeated Sampling的核心逻辑其实很朴素让模型对同一个问题独立生成多个候选解再用自动验证器单元测试、证明检查器挑出正确的那个。它适合谁适合手里有中等规模模型、但预算不足以一直调用顶级闭源模型的团队也适合做 Agent 编码、自动化修 bug 的开发者。你不需要重新训练只需要把推理侧的采样参数和验证流程搭好。这篇就聚焦 SWE-bench 场景给你一套可复制的采样参数配置骨架以及通过 TaoToken 统一 Key/API 通道接入的方式最后附上验证动作跑通一次采样任务并对比单次与多次采样的通过率。2. TaoToken 前置统一 Key 与 API 通道怎么接在动手写采样脚本之前先把通道打通。TaoToken 的作用是把不同模型的调用收敛到一个 API 入口这样你在做重复采样时切换模型、调整并发都不用改代码结构。官网入口在这里https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。API 基址是 https://taotoken.net/api 注意这个地址不带 UTM 参数直接用于代码里的 base_url。你需要先拿到 Key。进入控制台创建 API Keyhttps://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。创建后复制那串 sk- 开头的字符串后面配置里会用到。如果你只是想先验证模型能不能正常对话可以用模型对话页面快速试一下https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 。但做 SWE-bench 重复采样我们主要走 API。接入文档在这里遇到参数问题可以对照https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。注意不要把 Key 硬编码进提交到 Git 的脚本里。用环境变量后面配置骨架会体现这一点。3. 可复制配置settings.json 与 config.toml 采样参数骨架重复采样的参数分两层一层是 API 通道配置一层是采样策略配置。我把它拆成两个文件方便你直接抄。3.1 settings.jsonAPI 通道与模型映射这个文件负责告诉脚本“去哪里调用、用哪个模型、并发多少”。{ api: { base_url: https://taotoken.net/api, api_key_env: TAOTOKEN_API_KEY, timeout_seconds: 120, max_retries: 3 }, models: { coder: deepseek-v2-coder-instruct, fallback: gpt-4o }, sampling: { temperature: 1.6, top_p: 0.95, max_tokens: 4096, n_samples: 250, concurrency: 8 }, swebench: { dataset: SWE-bench_Lite, agent_framework: moatless-tools, max_turns_per_attempt: 1, verify_with_tests: true } }这里几个参数值得说明。temperature 设成 1.6 是论文里在 SWE-bench Lite 上做温度扫描后选的值比常见的 0.7 高不少目的是增加样本多样性。n_samples 先设 250这是论文里覆盖率提升最明显的档位。concurrency 控制并发别一上来就拉满先 8 路跑通再往上加。3.2 config.toml采样任务与验证流程如果你更习惯 TOML可以用这个版本逻辑一样。[api] base_url https://taotoken.net/api api_key_env TAOTOKEN_API_KEY timeout_seconds 120 max_retries 3 [models] coder deepseek-v2-coder-instruct fallback gpt-4o [sampling] temperature 1.6 top_p 0.95 max_tokens 4096 n_samples 250 concurrency 8 [swebench] dataset SWE-bench_Lite agent_framework moatless-tools max_turns_per_attempt 1 verify_with_tests true两个文件选一个用就行。核心是 base_url 指向 TaoToken 的 API 地址api_key 从环境变量读。3.3 环境变量与依赖安装在终端里设置 Key别写进文件export TAOTOKEN_API_KEYsk-你的key然后装依赖。SWE-bench 的评测通常需要 Docker 环境来跑单元测试Python 侧需要这些pip install openai datasets swebench moatless-tools如果你用的是 conda建议单独建一个环境避免和系统里的包冲突。4. 验证请求跑通一次采样任务并对比通过率配置好了接下来跑一个最小验证。目标不是一次跑完 250 个样本而是先确认通道通、采样逻辑对、验证器能工作。4.1 单次采样基线先写一个单次采样的脚本确认 API 能返回结果。import os from openai import OpenAI client OpenAI( base_urlhttps://taotoken.net/api, api_keyos.environ[TAOTOKEN_API_KEY] ) def single_sample(problem_statement): resp client.chat.completions.create( modeldeepseek-v2-coder-instruct, messages[ {role: system, content: You are a coding agent. Output only the patch.}, {role: user, content: problem_statement} ], temperature1.6, top_p0.95, max_tokens4096 ) return resp.choices[0].message.content if __name__ __main__: problem Fix the bug in astropy where ... patch single_sample(problem) print(patch[:500])跑通后你会看到模型返回的补丁片段。这一步只验证通道不验证正确性。4.2 多次采样与通过率对比接下来把采样次数提上去并对每个样本跑单元测试。下面是一个简化版的多采样循环import os from concurrent.futures import ThreadPoolExecutor from openai import OpenAI client OpenAI( base_urlhttps://taotoken.net/api, api_keyos.environ[TAOTOKEN_API_KEY] ) def sample_once(problem_statement, idx): resp client.chat.completions.create( modeldeepseek-v2-coder-instruct, messages[ {role: system, content: You are a coding agent. Output only the patch.}, {role: user, content: problem_statement} ], temperature1.6, top_p0.95, max_tokens4096 ) return idx, resp.choices[0].message.content def run_repeated_sampling(problem_statement, n_samples250, concurrency8): results [] with ThreadPoolExecutor(max_workersconcurrency) as executor: futures [ executor.submit(sample_once, problem_statement, i) for i in range(n_samples) ] for f in futures: results.append(f.result()) return results def verify_patch(patch, test_command): # 这里接入 SWE-bench 的 Docker 评测逻辑 # 返回 True / False pass if __name__ __main__: problem Fix the bug in astropy where ... samples run_repeated_sampling(problem, n_samples250, concurrency8) passed 0 for idx, patch in samples: if verify_patch(patch, pytest tests/test_xxx.py): passed 1 print(f通过样本数: {passed} / {len(samples)}) print(f覆盖率: {passed / len(samples):.2%})实际跑的时候verify_patch 要接 SWE-bench 官方的评测容器。论文里用的是 Moatless Tools 作为 Agent 框架每个样本是一次完整的多轮轨迹但为了控制成本他们把每个问题的尝试次数限制在 250 次且各次独立。4.3 对比结果怎么看跑完之后你会得到两个数字单次采样的通过率和 250 次采样的覆盖率。论文里的参考值是单次 15.9%、250 次 56%。你自己的数字会因为模型版本、温度、评测子集不同而有差异但趋势应该是一致的——覆盖率随样本数增加而上升且上升曲线在对数坐标下接近线性。如果你只想快速看趋势可以先跑 10 次、50 次、100 次三个档位画一条曲线。不用一上来就 250 次那样成本高、调试慢。5. 本篇常见错排查5.1 报错 401 Unauthorized最常见的原因是 Key 没设对。检查环境变量echo $TAOTOKEN_API_KEY如果输出为空说明 export 没生效或者你在新的终端窗口里没重新设置。另一个可能是 Key 复制时带了空格重新从控制台复制一次。5.2 报错 429 Too Many Requests并发设太高了。把 settings.json 里的 concurrency 从 8 降到 4 或 2再试。重复采样本身会产生大量请求如果同时跑多个问题总并发会叠加。建议先用单问题、低并发跑通再逐步加。5.3 采样结果高度重复如果 250 个样本里大部分补丁长得差不多说明 temperature 太低或者 top_p 太保守。SWE-bench 场景下论文用的是 temperature 1.6你可以从这个值开始调。但注意温度太高会导致语法错误率上升需要平衡。5.4 单元测试结果不稳定论文里专门提到SWE-bench Lite 中有 11.3% 的问题测试套件本身不稳定同一个补丁跑多次可能有时通过有时失败。如果你发现某个样本反复跑结果不一致先排除是不是测试套件的问题。可以对该样本跑 11 次测试用多数投票决定是否通过。5.5 覆盖率上不去先确认验证器是不是正确识别了通过的样本。如果验证器有假阴性覆盖率会被低估。可以手动检查几个被判定为失败的样本看看补丁是不是其实正确但测试没覆盖到。另外确认 n_samples 是不是真的跑满了有时候并发任务中途失败会被静默吞掉。6. 接入与长期编码按场景选对入口如果你只是想把 TaoToken 接进现有脚本做一次性验证用 API Keys 页面创建 Key 就够了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 。如果你要长期跑编码 Agent、做重复采样这类吞吐型任务建议了解一下 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。它更适合这种“同一问题多次采样、追求整体吞吐”的工作负载而不是低延迟的聊天场景。最后如果你在配置采样参数时想快速对比不同模型的实际输出可以先用模型对话页面手动试几次https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 。确认模型行为符合预期后再写进采样脚本里批量跑。