跳转到主要内容
Dataset Fanout 适合大量结构相同、输入不同的测试。例如 SQL 生成、意图分类、检索问答和工具选择。

工作原理

一个 .eval.ts 文件默认导出数组:
import { defineEval } from "niceeval";
import { equals } from "niceeval/expect";

const rows = [
  { task: "Count users", prompt: "Count all users", sql: "SELECT COUNT(*) FROM users;" },
  { task: "Recent orders", prompt: "Find recent orders", sql: "SELECT * FROM orders ORDER BY created_at DESC LIMIT 10;" },
];

export default rows.map((row) =>
  defineEval({
    description: row.task,
    async test(t) {
      await t.send(row.prompt);
      t.check(t.reply, equals(row.sql));
    },
  }),
);

生成 ID

如果文件是 evals/sql.eval.ts,生成的 ID 是:
sql/0000
sql/0001
序号零填充,便于稳定引用和过滤。

从 YAML / JSON 加载

import { loadYaml } from "niceeval/loaders";

const doc = await loadYaml("evals/data/sql-cases.yaml");
const rows = doc.cases as { task: string; prompt: string; sql: string }[];
cases:
  - task: Count users
    prompt: Count all rows in the users table
    sql: SELECT COUNT(*) FROM users;

过滤数据集 eval

# 运行整个数据集
npx niceeval exp local sql

# 只运行第一个 case
npx niceeval exp local sql/0000

数据集 vs 独立文件

case 结构完全一致,主要差异是输入和预期输出。
数据集适合“横向覆盖”,独立 eval 文件适合“行为复杂”的场景。