TensorZero 国际象棋示例实战:用 Best-of-N 与 Mixture-of-N 采样提升 LLM 棋力
发布时间:2026/9/15 10:52:03 锦皓数字建站

TensorZero 国际象棋示例实战用 Best-of-N 与 Mixture-of-N 采样提升 LLM 棋力【免费下载链接】tensorzeroTensorZero is an open-source LLMOps platform that unifies an LLM gateway, observability, evaluation, optimization, and experimentation.项目地址: https://gitcode.com/GitHub_Trending/te/tensorzero导读本文基于 TensorZero 仓库中的 examples/chess-puzzles 示例完整演示如何在不修改提示词prompt与模型的前提下仅通过增加推理计算预算多次采样 融合将 LLM 在国际象棋战术题puzzle上的成功率提升约 10% 相对值。你将掌握 TensorZero 的experimental_best_of_n_sampling与experimental_mixture_of_n两种高级推理策略的配置方法、评估脚本的完整逻辑以及它们底层的并发采样与二次 LLM 融合机制。背景为什么用国际象棋谜题评估 LLM国际象棋谜题是经过设计的战术挑战给定一个特定局面玩家需要找到达成将杀、获得子力优势或逼和等目标的最佳着法或着法序列。谜题中的着法对双方而言都是强制的——任何一方漏算都会显著陷入劣势因此谜题天然适合作为评估基准判定标准客观明确可依据 LLM 输出与标准答案的**精确匹配exact match**判定对错或检查其是否达成将杀。难度可精确调控按谜题评级rating筛选即可得到不同难度的数据集。本示例使用的数据来自 Lichess 谜题数据集Kaggle 公开数据集过滤出评级约800–1200相对简单的流行谜题后得到训练集约13 万题、测试集约1.5 万题分别存放于 examples/chess-puzzles/data/lichess_easy_puzzles_train.csv 与 lichess_easy_puzzles_test.csv。每个谜题包含一个局面与一串解法。例如下图所示谜题白方行棋这个谜题的解法如下答案为序列着法例如B3f7 G6f7、G5f7 G8f7前一个为白方着法后一个为黑方被迫回应B3f7 G6f7G5f7 G8f7核心思路不换模型、不改提示词只加计算预算本示例要证明的核心观点是通过增加推理计算预算inference compute budget可以在不改变提示词和模型的前提下提升 LLM 系统的性能。TensorZero 的推理策略不止于单次 chat completion其原生支持两类多次采样 融合的推理变体变体类型配置 type 值机制Best-of-N 采样experimental_best_of_n_sampling并发采样 N 个候选答案再用一次额外的 LLM 调用evaluator从中选出最优者Mixture-of-N 采样experimental_mixture_of_n并发采样 N 个候选答案再用一次额外的 LLM 调用fuser将多个答案合并成一个胜出者两者都会将一次推理拆分为N 次并行候选生成 1 次聚合调用。在 examples/chess-puzzles/config/tensorzero.toml 中本示例定义了一个名为play_chess_board的 JSON 函数它接收棋盘局面、返回解法着法序列并配置了三个变体baseline单次调用 GPT-4o MiniOpenAI的基线变体best_of_5查询 5 次基线变体再用一次 evaluator 调用选优mixture_of_5查询 5 次基线变体再用一次 fuser 调用融合。环境准备与启动前置条件安装 Docker安装 Python 3.10见 examples/chess-puzzles/pyproject.toml 中requires-python 3.10安装 Python 依赖推荐使用uv执行uv sync依赖包括tensorzero、chess、pandas、altair、tqdm、ipykernel等生成 OpenAI API KeyOPENAI_API_KEY。启动步骤创建.env文件并写入OPENAI_API_KEY环境变量可参考 examples/chess-puzzles/.env.example 的格式OPENAI_API_KEY sk-...执行docker compose up一次性启动三个服务见 examples/chess-puzzles/docker-compose.ymlclickhouseclickhouse:lts开发用 ClickHouse 数据库HTTP 端口8123、Native 端口9000默认账号chuser/chpassword用于存储全部推理轨迹与反馈gatewaytensorzero/gatewayTensorZero Gateway挂载./config:/app/config:ro并以--config-file /app/config/tensorzero.toml启动监听3000端口通过TENSORZERO_CLICKHOUSE_URL连接 ClickHouseuitensorzero/uiTensorZero UI 控制台通过TENSORZERO_GATEWAY_URL指向 gateway监听4000端口。gateway 与 ui 都通过env_file读取.env因此 API Key 无需硬编码进 compose 文件运行 examples/chess-puzzles/chess_puzzles.ipynb Jupyter 笔记本完成变体评估与结果绘图。配置文件逐段解析函数与输入/输出 Schematensorzero.toml 中函数定义如下[functions.play_chess_board] type json user_schema functions/play_chess_board/user_schema.json output_schema functions/play_chess_board/output_schema.jsontype json函数输出为受 JSON Schema 约束的结构化数据user_schema指向 user_schema.json约束输入必须包含三个必填字段board棋盘 ASCII 字符串、color行棋方、legal_moves_san合法着法的 SAN 字符串数组且不允许额外属性output_schema指向 output_schema.json约束输出为{ thinking: string, move: string }其中move必须是 SAN标准代数记谱法着法。baseline单次推理基线[functions.play_chess_board.variants.baseline] type chat_completion model openai::gpt-4o-mini system_template functions/play_chess_board/chess_prompt/system_template.minijinja user_template functions/play_chess_board/chess_prompt/user_template.minijinja json_mode strictjson_mode strict强制模型输出符合output_schema的合法 JSON。对应的提示词模板位于 chess_prompt/ 目录system_template.minijinja 要求模型多思考几步棋并输出{ thinking: ..., move: Nf3 }格式的 JSONuser_template.minijinja 使用 MiniJinja 模板语法渲染当前局面{{ board }}输出 ASCII 棋盘、{{ color }}输出行棋方并通过{%- for move in legal_moves_san %}循环列出全部合法着法。best_of_5Best-of-N 采样[functions.play_chess_board.variants.best_of_5] type experimental_best_of_n_sampling candidates [baseline, baseline, baseline, baseline, baseline] # 5 x Baseline [functions.play_chess_board.variants.best_of_5.evaluator] model openai::gpt-4o-mini system_template functions/play_chess_board/chess_prompt/system_template.minijinja user_template functions/play_chess_board/chess_prompt/user_template.minijinja json_mode strictcandidates候选变体名称列表可重复引用同一变体此处为 5 个baseline也可以混入不同变体evaluator一个完整的 chat completion 配置负责从 N 个候选中挑选最优答案。mixture_of_5Mixture-of-N 采样[functions.play_chess_board.variants.mixture_of_5] type experimental_mixture_of_n candidates [baseline, baseline, baseline, baseline, baseline] # 5 x Baseline [functions.play_chess_board.variants.mixture_of_5.fuser] model openai::gpt-4o-mini system_template functions/play_chess_board/chess_prompt/system_template.minijinja user_template functions/play_chess_board/chess_prompt/user_template.minijinja json_mode strict与 best-of-n 的区别在于聚合器fuser负责**融合merge**多个候选为一个最终答案而非简单地从中选一。指标定义[metrics.puzzle_success] type boolean level episode optimize maxpuzzle_success是一个布尔型 episode 级指标optimize max表示后续优化流程会以最大化该指标为目标。笔记本在每道谜题结束后会调用t0.feedback(...)将是否成功写入该指标从而为后续优化工作流见下文下一步积累训练信号。评估脚本从预测着法到反馈闭环chess_puzzles.ipynb 完整实现了预测—对弈—反馈的评估闭环核心流程如下。1. 客户端初始化与并发控制t0 await AsyncTensorZeroGateway.build_http(gateway_urlhttp://localhost:3000, timeout60)使用 TensorZero Python 客户端的异步 HTTP 网关客户端连接3000端口的 Gateway。笔记本通过asyncio.Semaphore(MAX_CONCURRENT_T0_REQUESTS)默认 100限制并发请求数避免触发上游 API 的限流若遇到限流可将该值调低。2. 预测下一步着法predict_next_move函数将棋盘编码为输入并调用t0.inferenceresponse await t0.inference( function_nameplay_chess_board, input{ messages: [{ role: user, content: { board: str(board), color: white if board.turn else black, legal_moves_san: legal_moves_san, }, }] }, variant_namevariant_name, episode_idepisode_id, )注意input中的三个字段与user_schema.json完全对应。返回后从response.output.parsed[move]取出 SAN 着法若解析失败或调用异常则回退到随机合法着法保证评估流程不中断。episode_id被透传用于跨回合跟踪同一道谜题。3. 求解单道谜题solve_puzzle按数据集给定的解法序列模拟对弈先落定第一着然后交替执行玩家回合由 LLM 预测着法、对手回合按标准答案落子并在以下情况判定结果玩家着法不等于标准答案 → 失败FalseLLM 达成将杀board.is_checkmate()→ 成功True走完整个解法序列 → 成功True。4. 批量求解与反馈写入solve_puzzles用asyncio.create_task并发求解整个 DataFrame实时用tqdm展示成功率随后逐条调用t0.feedback将puzzle_success指标写回 ClickHouseawait t0.feedback( episode_idepisode_id, metric_namepuzzle_success, valuesuccess, )最后对三个变体依次评估VARIANTS [baseline, best_of_5, mixture_of_5]并用 Altair 绘制带 95% 置信区间误差条的成功率柱状图。5. 运行参数笔记本默认加载训练集前1000条谜题NUM_EXAMPLES 1000快速试跑可将NUM_EXAMPLES调为 10。源码级原理Best-of-N 与 Mixture-of-N 如何工作为了理解上述配置背后的机制可以查看 TensorZero 核心实现crates/tensorzero-core/src/variant/best_of_n_sampling.rs定义BestOfNSamplingConfig其结构体字段为weight可选权重、candidates: VecString候选变体列表与evaluator: BestOfNEvaluatorConfig选优器内部扁平化展开为一个ChatCompletionConfig。从源码结构可以推断该变体先并发执行全部候选变体推理再以全部候选结果作为输入调用 evaluator由其输出最终答案weight字段用于在路由/优化场景中为不同变体分配采样权重。crates/tensorzero-core/src/variant/mixture_of_n.rs定义MixtureOfNConfig结构为candidates: VecString加fuser: FuserConfig融合器同样扁平化为一个ChatCompletionConfig。融合器与选优器的差异在于evaluator 从候选中选择一个而 fuser 将多个候选合并为单一答案理论上可组合不同候选的优点。两个配置类都支持weight可选权重并都通过#[serde(deny_unknown_fields)]严格校验未知字段。它们被注册于 crates/tensorzero-core/src/variant/mod.rs 的变体类型枚举中与chat_completion、dicl等变体并列。由于候选推理与聚合推理在 Gateway 内部并发执行best-of-n / mixture-of-n 相比串行多次调用能显著降低端到端延迟开销——这也是本示例能在 1000 道谜题规模上快速跑完的原因之一。修改提示词混搭变体进一步提分README 提到为了探索更丰富的候选多样性可以尝试为每次 LLM 调用使用不同的指令。本示例已预置了另一套提示词模板位于 examples/chess-puzzles/config/functions/play_chess_board/chess_evaluator/system_template.minijinja 在基础提示词之上追加了战术提示Pay special attention to tactics such as pins, forks, skewers, and double attacks. Also pay attention to possible back rank mates.特别关注牵制、击双、串击、双重攻击以及底线将杀等战术。你可以按以下思路自由组合复制chess_*目录下的模板改写 system 提示词形成多套候选提示在tensorzero.toml中为不同提示词各自声明一个 chat_completion 变体修改mixture_of_5/best_of_5的candidates列表混入这些新变体例如尝试混合使用不同 LLM的候选如 OpenAI、Anthropic、本地模型等通过笔记本中的variant_name变量切换要评估的新变体并补入VARIANTS列表参与对比。仓库作者在实验中发现使用多样化提示词的变体gpt-4o-mini_mixture_of_5_diverse能在相同模型与相同计算预算下再挤出几个百分点的成功率——你完全可以在其基础上继续挑战更优配置。下一步基于积累数据的优化运行完笔记本后ClickHouse 中已经积累了大量 LLM 求解国际象棋谜题的完整轨迹episode数据。这些数据正是 TensorZero 优化工作流optimization workflows的燃料参考 docs/optimization/index.mdx 了解如何利用这批轨迹数据做进一步优化例如 DICL动态上下文学习、GEPA 或监督微调 SFT由于数据全部落库仓库还提供了留出测试集examples/chess-puzzles/data/lichess_easy_puzzles_test.csv用于在未见过的数据上公平评估新变体。一个重要的防泄漏提示评估留出测试集时请将笔记本中的dryrunTrue模式打开避免把测试集轨迹与反馈写入 ClickHouse防止优化流程在测试数据上产生信息泄漏。小结通过这个国际象棋谜题示例你可以获得一套可直接复用的推理时扩展计算inference-time compute scaling实验范式定义结构化 JSON 函数与输入/输出 Schema用 MiniJinja 模板渲染任务输入声明baseline变体通过experimental_best_of_n_sampling选优与experimental_mixture_of_n融合包装出高预算变体用异步客户端并发评估各变体并将结果写入 ClickHouse在此基础上自由混搭提示词、模型与采样数寻找更优组合。其价值在于当提示词工程与模型选择都遇到瓶颈时多花推理 token 换性能是一条确定有效的杠杆而 TensorZero 将这条杠杆的配置成本压缩到了几行 TOML。【免费下载链接】tensorzeroTensorZero is an open-source LLMOps platform that unifies an LLM gateway, observability, evaluation, optimization, and experimentation.项目地址: https://gitcode.com/GitHub_Trending/te/tensorzero创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。