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_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。API 基址是 https://taotoken.net/api ,注意这个地址不带 UTM 参数,直接用于代码里的 base_url。
你需要先拿到 Key。进入控制台创建 API Key:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。创建后复制那串 sk- 开头的字符串,后面配置里会用到。
如果你只是想先验证模型能不能正常对话,可以用模型对话页面快速试一下:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite 。但做 SWE-bench 重复采样,我们主要走 API。
接入文档在这里,遇到参数问题可以对照:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。
注意:不要把 Key 硬编码进提交到 Git 的脚本里。用环境变量,后面配置骨架会体现这一点。
3. 可复制配置:settings.json 与 config.toml 采样参数骨架
重复采样的参数分两层:一层是 API 通道配置,一层是采样策略配置。我把它拆成两个文件,方便你直接抄。
3.1 settings.json:API 通道与模型映射
这个文件负责告诉脚本“去哪里调用、用哪个模型、并发多少”。
{ "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_KEY="sk-你的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_url="https://taotoken.net/api", api_key=os.environ["TAOTOKEN_API_KEY"] ) def single_sample(problem_statement): resp = client.chat.completions.create( model="deepseek-v2-coder-instruct", messages=[ {"role": "system", "content": "You are a coding agent. Output only the patch."}, {"role": "user", "content": problem_statement} ], temperature=1.6, top_p=0.95, max_tokens=4096 ) 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_url="https://taotoken.net/api", api_key=os.environ["TAOTOKEN_API_KEY"] ) def sample_once(problem_statement, idx): resp = client.chat.completions.create( model="deepseek-v2-coder-instruct", messages=[ {"role": "system", "content": "You are a coding agent. Output only the patch."}, {"role": "user", "content": problem_statement} ], temperature=1.6, top_p=0.95, max_tokens=4096 ) return idx, resp.choices[0].message.content def run_repeated_sampling(problem_statement, n_samples=250, concurrency=8): results = [] with ThreadPoolExecutor(max_workers=concurrency) 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_samples=250, concurrency=8) 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_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。接入过程中遇到参数问题,对照接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。
如果你要长期跑编码 Agent、做重复采样这类吞吐型任务,建议了解一下 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。它更适合这种“同一问题多次采样、追求整体吞吐”的工作负载,而不是低延迟的聊天场景。
最后,如果你在配置采样参数时想快速对比不同模型的实际输出,可以先用模型对话页面手动试几次:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite 。确认模型行为符合预期后,再写进采样脚本里批量跑。