Skip to main content
你改了一版 prompt,换了一个模型,给 Claude Code 写了一个新 Skill,或者调了游戏里 NPC 的提示词。它到底变好了没有? 只靠手动试几次很难回答。Agent 每次的回答都不一样,一次碰巧答对说明不了什么。改好了这道题,可能又悄悄改坏了另一道。 NiceEval 用来回答这个问题。它以 Agent 为主要场景,也能评任何由 LLM 驱动的应用。你用 TypeScript 写下“什么算做对”,NiceEval 负责下面这些事:
  • 连上被测对象,把任务发给它。
  • 按需要反复运行,每次都打分。
  • 把每一次的对话、工具调用、文件改动、耗时和花费留下来。
  • 让你在终端或浏览器里比较两个配置,并回到具体某一次失败去看发生了什么。
所有运行都在你自己的机器和 CI 里完成,不需要注册账号。

一条评估用例长什么样

下面这条评估用例验证一个天气助手:问天气时它要真的调用 get_weather,而不是凭空编一个答案。
确定的事实用确定的规则检查,例如调用了哪个工具、回复里有没有某个词。开放式的质量,例如回答是否有依据,交给裁判模型 Judge 打分,低于 0.7 就算不通过。 “对着哪个 Agent、用哪个模型跑”不写在评估用例里,而是写在 Experiment 里。同一批评估用例因此可以直接用来比较两个模型或两版 prompt。

评估用来做什么

评估写起来像单元测试,用起来更像实验。同一批评估用例可以服务几种目的:
  • 防回归:改 prompt、换模型、升级依赖后重跑同一批评估,看通过率有没有掉。见修改后只重跑受影响的评估。
  • 做对比:同一批评估对着两个模型、两版 prompt、装与不装某个 Skill 各跑一遍,逐题比较结果。见编写实验和比较两次运行。
  • 进 CI:评估不通过就让 PR 变红。见 CI 集成。
  • 越用越全:真实使用中暴露的失败,补成一条新的评估用例,以后每次改动都会检查到它。

能评什么

你自己的 AI Agent

基于 AI SDK、LangGraph、Pi 或自研 Agent loop 都可以,用什么语言写也不影响。只要有一个能调用的接口,写一个 Adapter 就能接进来。

Coding Agent 和它的扩展

把 Claude Code、Codex 等 Agent 放进 Sandbox,给它一个真实仓库和任务,用项目自己的测试判分。适合衡量 Skill、Plugin 或 memory 的实际效果。

任何 AI 应用,比如 LLM 游戏

被测对象提供的是发帖、回复、NPC 行动这类业务操作时,把它们原样交给评估用例,直接检查返回的结构化结果和世界状态。
不是对话式 Agent 的应用,评估里调用的就是它自己的方法。下面是 examples/zh/llm-x 里一个 AI 社交应用的评估:
被测对象的接入方式有两种:
NiceEval 通过 Adapter 直接请求你的 Agent 或应用接口,不需要 Docker。对话式 Agent 和提供业务操作的应用都走这条路。

和 DeepEval、LangFuse、Braintrust 有什么不同

DeepEval 是成熟的 Python 评估框架,指标库丰富。NiceEval 的取舍不同:
  • TypeScript 原生:评估用例、Adapter、Experiment 都是带类型的 TypeScript 代码。
  • 断言落在过程上:Agent 做对一件事,往往要经过多轮对话、几次工具调用、读文件、改代码,最终答案只是其中一环。NiceEval 直接断言这些过程事实,不要求你先攒一份 golden 数据集。
  • 在真实环境里判分:Coding Agent 跑在 Sandbox 里,用项目自己的测试和文件改动判分,而不是只给回复打分。
  • 对照实验是一等公民:评估用例和 Experiment 分开,同一批评估用例直接比较模型、prompt 和扩展。
LangFuse、Braintrust 这类可观测平台回答“线上发生了什么”,评估回答“这个行为够不够好”。NiceEval 专注后者,以及“写评估、跑评估、看结果、改 Agent”这一段本地开发循环。两者可以共存:你继续用它们看线上 trace,也可以把 NiceEval 的结果上报给 Braintrust。

会反复见到的几个词

其它术语第一次出现时都会就地解释。

接下来

快速开始带你在十分钟左右跑通第一条评估用例,并在终端和浏览器里看到结果。