关于 Nonobench
Nonobench 是用于评估 LLM 在不同尺寸数织谜题上表现的开源基准套件。它包含基准运行器、结果数据库、导出工具和交互式结果仪表板。
主要功能
- 01在数织谜题上评测模型
- 02覆盖多种网格尺寸
- 03将增量结果存入 SQLite
- 04导出基准数据用于可视化
- 05通过交互式仪表板查看结果
- 06测试本地托管的 OpenAI 兼容模型
适用场景
- 01比较 LLM 在不同尺寸谜题上的推理表现
- 02评测本地运行的模型
- 03查看并可视化已记录的运行结果
- 04在完整评测前进行小规模试跑
MCP 相关
托管网站通过 `/mcp` 提供无需认证的 MCP 服务,并提供 REST API。其工具让 Agent 能访问基准数据及相关操作。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://www.nonobench.com/mcpclaude mcp add --transport http mauricekleine-nonobench https://www.nonobench.com/mcp{"mcpServers":{"mauricekleine-nonobench":{"type":"http","url":"https://www.nonobench.com/mcp"}}}在 Cursor 中打开{"servers":{"mauricekleine-nonobench":{"type":"http","url":"https://www.nonobench.com/mcp"}}}在 VS Code 中打开{"mcpServers":{"mauricekleine-nonobench":{"type":"http","url":"https://www.nonobench.com/mcp"}}}{"mcpServers":{"mauricekleine-nonobench":{"serverUrl":"https://www.nonobench.com/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
11| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| size | enum | 否 | 要筛选的网格大小5x5 | 10x10 | 15x15 | 20x20 |
| effort | string | 否 | best、all(默认)或一个 effort 级别;留空表示全部 |
| family | string | 否 | 逗号分隔的 family ID;留空表示不筛选 |
| version | string | 否 | 逗号分隔的基准测试版本:1.0、1.1、1.2;留空表示全部 |
| provider | string | 否 | 逗号分隔的 provider ID;留空表示不筛选 |
| reasoning | boolean | 否 | 仅显示推理(true)或非推理(false)变体 |
| min_correct | integer | 否 | 所选级别中已解出的最少谜题数;默认值 0 会包含尚未解出谜题的变体 |
| open_weights | boolean | 否 | 仅显示开放权重(true)或闭源(false)模型 |
详细介绍
Nonobench
用于评估大模型在不同网格大小下解决 Nonogram(Picross)谜题时推理能力的基准测试套件。结果发布于 nonobench.com。
由 Maurice Kleine 构建。
什么是 Nonogram?
Nonogram(也称为 Picross、Griddlers 或数字填色)是一种逻辑谜题,玩家需要根据每行和每列的数字提示填充网格中的单元格。提示表示连续填充单元格的分组,组与组之间至少隔着一个空单元格。解决这类谜题需要逻辑推理和约束满足能力,因此它们是测试大模型推理能力的绝佳方式。
项目结构
nonobench/
├── bench/ # Benchmark runner, results database and exporter
└── visualizer/ # TanStack Start dashboard on Cloudflare Workers (nonobench.com), also home of the puzzle set
前置条件
- Bun 运行时(v1.4+)
- Node.js v24+(用于可视化工具)
- OpenRouter API 密钥
快速开始
1. 克隆代码仓库
git clone https://github.com/mauricekleine/nonobench.git
cd nonobench
2. 设置环境变量
在 bench/ 目录中创建 .env 文件(参见 bench/.env.example):
OPENROUTER_API_KEY=your_openrouter_api_key_here
这是唯一需要设置的变量。可视化工具无需任何变量即可构建。
3. 运行基准测试
cd bench
bun install
bun run bench # prints the plan and exits, no API calls
bun run bench --model <name> # run one model (repeat --model for more)
bun run bench --all-missing # run every configured model with missing work
bun run bench --model <name> --sizes 20x20 # opt in to the extended tier
运行采用增量追加方式:已成功获得结果的模型/谜题组合不会再次运行,数据库也会拒绝覆盖已有结果。失败的运行会在下次调用时重试。结果存储在 bench/results.db(SQLite)中。
实用参数:
--max-cost <usd>:当本次运行的花费达到指定金额后,停止启动新谜题。已在进行中的请求仍会完成,因此本次运行的花费可能超出上限,最多相当于每个所选模型额外执行--parallel个请求。请将 OpenRouter 密钥自身的限额作为硬性上限。--parallel <n>:设置每个模型的并发请求数(默认 10);如果提供商有速率限制,可调低此值。--limit <n>:每种尺寸仅运行前 n 个谜题,可用于使用临时数据库进行试运行(NONOBENCH_DB=/tmp/copy.db)。
输出模式
新运行会要求模型以严格的结构化输出格式(JSON schema;仅路由到强制执行该格式的端点)提供答案,避免模型用文字包裹网格。对于少数模型,强制执行 schema 的端点会显著影响答案质量;这些模型会改用文本模式(在 bench/constants.ts 中设置 outputMode: "text",由基于基准测试提示词的 5x5 A/B 测试选定)。每次运行都会记录所用模式,两种模式的评分标准相同:答案必须满足每条提示。运行器还会停止那些使用结构化输出却无法解出任何 5x5 谜题的模型,以及早期运行中大多报告零推理 token 的模型,因为这两种情况都表明问题可能出在测试框架,而非模型。
基准测试完成后,导出结果供可视化工具使用:
bun run export
这会生成 visualizer/app/results.json(汇总结果)和 visualizer/public/results-raw.json(包含提示词和输出在内的每次运行记录)。
其他脚本:
bun test- 检查解析器、评分器、数据库策略和谜题bun run typecheck- TypeScript 类型检查bun run regrade- 只读比较已存储的评分与当前评分器的结果
使用本地模型运行
运行器可以对自行部署的模型进行基准测试。任何提供 OpenAI 兼容 /v1 端点的服务都可以使用:vLLM、SGLang、llama.cpp、LM Studio 和 Ollama。
此设置需要两台机器。模型服务所在的工作站负责提供模型。基准测试机器是运行基准测试的笔记本电脑。
1. 在工作站上提供模型服务
将服务绑定到所有网络接口。默认绑定地址 127.0.0.1 只接受来自模型服务所在机器自身的连接。
vLLM:
vllm serve Qwen/Qwen3-32B --host 0.0.0.0 --port 8000
Ollama:
ollama pull qwen3:32b
OLLAMA_HOST=0.0.0.0:11434 ollama serve
llama.cpp:
llama-server -m ./qwen3-32b-Q4_K_M.gguf --host 0.0.0.0 --port 8080
SGLang:
python -m sglang.launch_server --model-path Qwen/Qwen3-32B --host 0.0.0.0 --port 30000
LM Studio:打开 Developer 选项卡,然后选择 Start Server。打开 Network Server 开关,使服务监听所有网络接口。
注意:请勿将端口暴露到互联网。大多数本地服务都没有身份验证,因此任何能够访问该端口的人都可以运行模型。
2. 在模型服务上开放端口
将规则限制为您自己的子网。允许来自本地网络的 TCP 流量访问该端口:
sudo ufw allow from 192.168.1.0/24 to any port 8000 proto tcp
在 macOS 上,请在“系统设置”中允许服务器应用接受传入连接。
3. 从笔记本电脑验证连接
找到模型服务的局域网地址。在 Linux 上运行 ip -4 addr show。在 macOS 上运行 ipconfig getifaddr en0。
在笔记本电脑上请求模型列表:
curl http://192.168.1.20:8000/v1/models
确保返回结果中列出了您的模型。复制确切的 id 值。您需要将该值用于 NONOBENCH_LOCAL_MODEL。
如果请求失败,请检查步骤 1 中的绑定地址。然后检查防火墙规则、地址和端口。
如果无法通过网络访问模型服务,请改为创建到该服务的 SSH 隧道。然后使用地址 http://127.0.0.1:8000/v1:
ssh -N -L 8000:127.0.0.1:8000 [email protected]
4. 运行基准测试
cd bench
bun install
NONOBENCH_LOCAL_BASE_URL=http://192.168.1.20:8000/v1 \
NONOBENCH_LOCAL_MODEL=Qwen3-32B \
bun run bench:local --model Qwen3-32B
先运行试测。下一个命令会将两个 5x5 谜题写入临时数据库:
NONOBENCH_LOCAL_BASE_URL=http://192.168.1.20:8000/v1 \
NONOBENCH_LOCAL_MODEL=Qwen3-32B \
NONOBENCH_DB=local-pilot.db \
bun run bench --model Qwen3-32B --sizes 5x5 --limit 2
确保计划中将您的模型列为 [local, text]。
本地模型的环境变量
| 变量 | 含义 |
|---|---|
NONOBENCH_LOCAL_BASE_URL | 服务的 /v1 端点。Ollama 使用端口 11434。 |
NONOBENCH_LOCAL_MODEL | 服务通过 GET /v1/models 返回的模型 id。 |
NONOBENCH_LOCAL_NAME | 显示名称,也是 --model 的取值。默认为模型 id。不得与云模型名称相同。 |
NONOBENCH_LOCAL_EFFORT | 服务配置的推理力度(none、low、xhigh 等)。仅用于标记——运行器不会向本地服务发送推理设置。默认为 none。 |
NONOBENCH_LOCAL_API_KEY | 服务要求令牌时使用的 bearer 令牌。默认为 local。 |
只有同时设置 NONOBENCH_LOCAL_BASE_URL 和 NONOBENCH_LOCAL_MODEL 时,运行器才会将本地模型添加到计划中。
本地运行说明
- 本地运行费用为 0 美元。请勿将其纳入已发布的数据集:使用
bun run bench:local运行,它等同于设置NONOBENCH_DB=local-results.db后运行bun run bench。bench/results.db是共享数据集,导出契约测试会将其与已提交的导出文件进行比对。运行器会拒绝将本地模型写入共享数据库。 - 启动前,运行器会将模型
id与服务端GET /v1/models返回的列表进行核对。拼写错误时会显示服务端实际提供的模型;如果无法连接服务端,则不会记录任何运行结果。 - 本地模型默认使用文本模式。许多本地服务端会接受 JSON schema 请求,但随后忽略它。如果你的服务端会强制执行 schema,请设置
NONOBENCH_OUTPUT_MODE=json_schema。 - 请从
--parallel 1开始。本地 GPU 同时处理的请求量低于云服务提供商。 - 20x20 档位需要 128,000 个输出 token。如果你的服务端上下文长度较小,请只运行核心尺寸。
- 运行器不会对本地模型应用推理 token 断路器。有些本地服务端每次运行都会报告 0 个推理 token。
- 将相同的变量设置在
bench/.env中,即可避免每条命令都加上前缀。 - 基准测试运行会在
bench/local-models.json中注册本地模型(名称、服务端模型 ID、系列、服务端 URL),这样后续运行bun run export时,可视化工具无需任何环境变量就能识别该模型。要注册已完成基准测试的模型,请在其中添加一条记录:"<name>": { "baseURL": "http://host:port/v1", "modelId": "<server model id>", "family": "<name>" }。如果名称就是服务端的 ID,则省略modelId。
4. 查看结果
cd visualizer
bun install
bun run dev
然后打开 http://localhost:3000 查看交互式仪表板。
你自己的运行结果位于单独的数据库中。使用以下命令提供这些结果:
cd visualizer
bun run dev:local
dev:local 会将 bench/local-results.db 导出到仪表板的数据文件中,启动开发服务器,并在你停止服务器时恢复已提交的文件。运行期间,仪表板只显示该数据库中的模型,即你的本地运行结果,而非已发布的排行榜。设置 NONOBENCH_LOCAL_DB 可提供其他数据库。
该服务器运行期间,在 bench 目录中运行 bun test 会有一个测试失败:导出契约测试会将仪表板的数据文件与 bench/results.db 进行比对,而 dev:local 已将你的运行结果写入这些文件。停止服务器,等待脚本恢复已提交的文件,测试套件便会再次通过。
5. 部署
可视化工具是一个 Cloudflare Worker(visualizer/wrangler.jsonc)。页面会在构建时预渲染,并作为静态资源提供;Worker 提供 API、MCP 服务和 Agent 路由,并通过其资源绑定读取导出的 JSON。Workers Builds 负责在合并到 main 时部署生产环境:它会在 visualizer/ 目录中使用 Cloudflare 凭据运行 bun install --frozen-lockfile && bun run build,然后运行 bunx wrangler deploy。本地部署脚本和 Wrangler 登录流程已弃用;Agent 使用 cf 访问 Cloudflare。在 visualizer/ 目录中:
CLOUDFLARE_ENV=beta bun run build会构建用于本地预览的 beta Worker。现有的 beta.nonobench.com Worker 没有 Workers Builds 触发器;此命令不会部署它。bun run deploy:verify <sha>会等待生产环境运行包含该提交的main分支构建。除非DEPLOY_VERIFY_URL指向单独部署的目标,否则分支提交会立即失败。仓库根目录也使用相同脚本,因此在任一目录中都可运行bun run deploy:verify <sha>。
Agent 访问
nonobench.com 无需身份验证即可向 Agent 提供基准测试数据:
-
REST API 位于
/api/v1下(排行榜、模型、谜题、答案检查器、单次运行数据)。规范位于/api/openapi.json,/.well-known/api-catalog(RFC 9727)指向该规范。 -
MCP 服务 位于
/mcp(无状态 Streamable HTTP,支持 MCP 2026-07-28,并兼容 2025 客户端),说明见/.well-known/mcp/server-card.json。使用claude mcp add --transport http nonobench https://www.nonobench.com/mcp将其添加到客户端。浏览器请求可使用网站的来源,或 HTTP localhost/127.0.0.1 来源。 它已列入 Claude Connectors Directory、MCP Registry(io.github.mauricekleine/nonobench)、Smithery、Glama 和 mcpservers.org。 -
通过
navigator.modelContext在浏览器中注册的 WebMCP 工具。 -
Markdown:请求时附带
Accept: text/markdown,/和/puzzles会返回 Markdown。/llms.txt提供概览。 -
发现:
robots.txt(含 Content Signals)、sitemap.xml、首页上的Link标头、位于/.well-known/agent-skills/index.json的 Agent skill,以及位于/.well-known/ai-catalog.json的 ARD 清单。
以上所有内容都从与仪表板相同的导出文件读取(visualizer/app/results.json 和 visualizer/public/results-raw.json),因此运行 bun run export 也会一并更新。
评分
每个模型都会收到相同的系统提示词和谜题的行、列线索。标准模式的答案是由 1 和 0 组成的单个字符串网格。困难模式的答案按行换行,因为在 400 个格子的情况下,大多数模型都会把单个字符串数错(参见 LEARNINGS.md)。答案满足所有行、列线索时即为正确。
30 道谜题中有 10 道(一道 5x5、四道 10x10、五道 15x15)存在多个有效解,因此答案会根据线索检查,而不是与已存储的解进行比较。正确性在导出时根据已存储的原始输出得出;数据库不会被重写。谜题测试套件会固定标记哪些谜题有多个解,任何新谜题都必须只有唯一解。
谜题数据
核心级别包含 30 道谜题(5x5、10x10 和 15x15 各 10 道),定义在 visualizer/components/puzzles/ 中,并由运行器和仪表板共享。这些谜题来自 nono-dataset。困难模式包含 10 道生成的 20x20 谜题。谜题的 ID 是其解的哈希值,因此更改谜题的解会创建一道新谜题。
分级与生成
默认基准测试运行涵盖三种核心尺寸(Standard)。使用 --sizes 20x20 并选择模型即可运行困难模式;也支持以逗号分隔多个尺寸。运行器的计划会单独报告缺失的 20x20 任务。总体准确率和最佳变体选择仅使用 Standard 运行结果;困难模式有其独立结果。困难模式请求的答案预算为 128,000 个 token,上限为端点的最大值(bench/max-output-tokens.json)。
在 bench/ 目录下,bun run generate-puzzles 会使用固定种子重新生成 20x20 谜题集。它会随机填充网格(不包含图片,因此模型无法根据图像猜答案),保留每行至少有三个填充格且镜像对称性较弱的网格,并使用精确求解器(NONOGRAM_SOLVER)检查唯一性。该谜题集包含五道可通过行列传播求解的谜题,以及五道传播过程会停滞、剩余 20–200 个格子的谜题。bun test 会验证这些谜题的线索、唯一性标记和行求解能力;原有的歧义列表保持固定。
配置
编辑 bench/constants.ts 以配置:
MODELS- 模型配置数组(OpenRouter 模型 ID、显示名称、推理设置)MAX_PARALLEL_RUNS_PER_MODEL- 每个模型并发运行的谜题数(默认值:10)REQUEST_TIMEOUT_MS- 每个请求的超时时间;超时请求会记录为失败运行(默认值:30 分钟)
NONOBENCH_DB、NONOBENCH_RESULTS_JSON 和 NONOBENCH_RESULTS_RAW_JSON 可覆盖数据库和导出路径,便于使用副本进行测试。
技术栈
基准测试运行器
- Bun - JavaScript 运行时和 SQLite
- AI SDK - 统一的大模型接口
- OpenRouter - 大模型 API 网关
- TypeScript
可视化工具
- TanStack Start - React 框架,支持预渲染页面
- Cloudflare Workers - 托管服务,使用静态资源
- React 19 - UI 库
- Tailwind CSS 4 - 样式
- shadcn/ui - 组件库
- Recharts - 图表
- Zustand - 状态管理
贡献
欢迎贡献!你可以:
- 添加对新大模型的支持
- 改进基准测试方法
- 增强可视化仪表板
许可证
MIT
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。