AI 博客

promptfoo、DeepEval 与 Inspect AI:三套对"评测是什么"意见相左的框架

三份 README 描述的是同一件事——把用例喂给模型、给输出打分、卡住构建。但在核心数据结构这一层,它们对"评测究竟是什么"意见相左:是一次攻击、一条断言,还是一场实验。名词选错了,工具就不会让你写出你真正需要的那种测试。

作者 智能体 AI 维基 34 分钟读完

三套开源评测框架,三份 README 描述着同一件事:把用例喂给模型、给输出打分、卡住构建。照着这句话选型,你会在六周之后才发现有一类测试根本写不出来——因为 promptfoo、DeepEval 与 Inspect AI 在各自核心数据结构那一层,对"评测究竟是什么"意见相左。一个认为它是一次攻击,一个认为它是一条断言,一个认为它是一场实验。先把名词定下来,工具自然就跟着定了。

先看全貌

三个项目都能一分钟装好,都自称是"评测",而背后是三家有着三种不同在意理由的组织。

项目主理方工作单元许可证
promptfoo OpenAI(2026 年 3 月宣布收购) 由配置文件声明出的一次扫描 MIT
DeepEval Confident AI 一个带指标断言的 pytest 用例 Apache 2.0
Inspect AI 英国 AI 安全研究所(UK AISI) 一个 Task:数据集、solver、scorer MIT

"主理方"这一列不是花边。一个安全研究所、一家开发者工具公司、一家前沿实验室,对评测框架想要的东西并不相同;而未来两年里的每一个路线图决定,都会由向这三者之一负责的人做出。

Capability matrix across the three eval harnesses A three-by-five grid scoring promptfoo, DeepEval and Inspect AI on adversarial case generation, CI ergonomics, agent trajectory detail, sandboxed code execution, and reproducible run logs. Each project is strong in the columns its theory of evaluation cares about and weak in the others. Where each one leans hardest Adversarial generation CI ergonomics Trajectory detail Sandboxed execution Reproducible log promptfoo Generates the cases Exit code, config-driven Black box by design Out of scope Cases move run to run DeepEval Hand-written only Native pytest Agentic metrics Yours to build Test report, not a record Inspect AI Possible, manual Works, but heavier Whole run in the log Docker by default The whole point Strong — this is what the design is for Workable Against the grain
没有哪一行处处强。每个项目最弱的那一列,正是它那套评测理论不在意的那一列。

三个名词

The unit of work in each framework Three columns comparing what each framework makes you write first: promptfoo takes a declared config and generates attacks, DeepEval takes a hand-written case and asserts a metric threshold, Inspect AI takes a dataset and runs it through a solver and scorer into a log. What each framework makes you type first promptfoo an attack You declare a target and a risk category; the cases are manufactured for you. Answers: what did I fail to think of? DeepEval an assertion You write the case, attach a metric, and the threshold either clears or fails. Answers: did this change make us worse? Inspect AI an experiment You bind a dataset to a solver and a scorer; every run emits a log you can re-derive from. Answers: can anyone else reproduce this number?
每个框架逼你先敲下的那个对象。那个对象就是它的全部设计。

每套评测框架都是在赌哪个问题最难。promptfoo 赌的是我还有什么没想到要测,所以它的重心在生成:你声明一个目标和一组风险类别,它把用例造出来。DeepEval 赌的是这次改动会不会退化,所以它的重心在断言:你写用例、挂指标,指标要么过阈值、要么让整套测试挂掉。Inspect 赌的是还有别人能复现这个数吗,所以它的重心在记录:一个 Task 把数据集绑定到 solver 与 scorer 上,而每次运行都会吐出一份足以重新推导出结果的日志。

这些不是插件能抹平的营销差异。它们决定了你手里能握住什么对象。在 promptfoo 里一等对象是攻击策略,于是"智能体应当拒绝这个请求并说明理由"写起来很自然,而"这个指标必须永远保持在 0.8 以上"就是外挂上去的。在 DeepEval 里正好反过来。在 Inspect 里一等对象是一次试验,这也是三者中唯一把"跑五十遍,把分布给我"当作默认动作、而不是让你自己写循环的框架。

你选的工具决定了哪一类测试是一行代码、哪一类是一个周末。这两份清单在三者中都不为空。

promptfoo——深入看

promptfoo architecture A YAML config declares the target providers, prompts and red-team plugins. The promptfoo generator manufactures adversarial cases from those categories, runs them against the target, and returns a local results viewer plus a CI exit code. promptfoo — you declare the surface, it writes the cases YOU DECLARE promptfooconfig.yaml Targets: prompt, endpoint, or agent behind a shim Plus the risk categories Red-team plugins Jailbreak · injection · PII Exfiltration · tool misuse Supply chain PROMPTFOO GENERATES Case generator Synthesises probes per category, then escalates across turns The test set is OUTPUT, not a fixture you keep Graders decide whether the probe landed WHAT YOU GET Findings by category Local web viewer, grouped by severity and reproducible probe CI exit code A weekly sweep against the deployed surface — not a per-PR gate Your system under test Treated as a black box with an attack surface probe / response
你声明攻击面,promptfoo 把打向它的用例造出来。

它拥有什么

对抗用例生成。你把 promptfooconfig.yaml 指向一个目标——一段裸提示词、一个 HTTP 端点、或者藏在适配层后面的智能体——再列出你在意的风险类别,promptfoo 就会合成探针:越狱、间接提示注入、PII 抽取、外泄路径、工具滥用。这些用例不是你要维护的固定资产,它们是产出物。

这买到了什么

对你没能穷举的那片空间的覆盖——这正是红队演练的全部意义,也是手写黄金集在结构上给不了你的东西。它同时意味着,专家要花一周做的安全评审可以变成一个 CI 任务;这个项目被收购,正是因为这一点。

它让什么变难

纵向的质量追踪。因为用例会重新生成,跨轮次比较就比固定数据集框架模糊得多,而"这次提示词改动让我们退了 2% 吗"并不是这个工具的形状所围绕的问题。既想要两者的团队通常会用 promptfoo 做安全扫描、另找一个工具做质量门禁——这是被支持的结局,不是选型失败。

DeepEval——深入看

DeepEval architecture Pytest collects test cases written by hand. Each case attaches metrics such as G-Eval, DAG metrics or agent tool-call metrics, which call a judge model and compare the result against a threshold. The outcome is an ordinary pytest pass or fail inside the existing CI pipeline. DeepEval — the eval is an assertion, the comparator is a model YOUR TEST SUITE pytest collection Ordinary test functions, ordinary fixtures, ordinary parametrize Golden set Hand-written cases you own and version — nothing is generated METRICS ATTACH TO CASES Metric objects G-Eval — rubric judgement DAG — decision tree, so a flat score cannot hide why Agentic — tool correctness, task completion Each returns a score and compares it to a threshold WHAT YOU GET Pass or fail A red build, in the same place as every other failing test Everything CI knows Parallelism, selection, reporting, retries — inherited, not rebuilt Judge model Pin the snapshot, or your threshold moves silently grade request
评测就是一条 pytest 断言,只不过它的比较器恰好是个模型。

它拥有什么

在你已经有的那个测试运行器里的开发者工效。一个 DeepEval 用例就是一个 pytest 测试;指标是你挂上去的对象;评判调用发生在断言底下。你的 CI 已经会做的一切——并行、筛选、报告、重试——原封不动地适用,这个实际优势比听上去大得多。

这买到了什么

从"我们没有评测"到"质量下滑就让构建挂掉"的最短路径。它同时带来一套确实好用的指标库:G-Eval 处理量规式判断,DAG 指标处理那些"扁平分数会掩盖原因"的决策树,还有面向工具调用正确性与任务完成度的智能体专用指标。在你拿它当门禁之前,先读用 LLM 给智能体当评判,看看这类判断到底值多少。

它让什么变难

任何形状不像断言的东西。沙箱里的长周期智能体运行、跨模型与参数网格的扫描、建立在重复试验之上的统计结论——它们塞进一个"单元是一个返回布尔结果的测试函数"的框架里都别扭。你能把它们造出来,但你是在逆着纹理造。

Inspect AI——深入看

Inspect AI architecture An Inspect Task binds a dataset of labelled samples to a solver and a scorer. The solver ranges from a single generate call to a full tool-using agent whose model-written code executes inside a Docker sandbox. Every run writes a complete eval log holding messages, tool calls, scores and config. Inspect AI — a Task is an experiment, and the log is the deliverable DATASET Labelled samples Input, target, metadata — versioned and fixed, so two runs are comparable SOLVER Produces an answer One generate() call, or a full tool-using agent running many steps SCORER Grades the answer Text comparison up to model grading — the judge is declared, not hidden Docker sandbox Provisioned by the framework when the solver runs code Eval log Messages · tool calls · scores · model and config · sample-level detail Complete enough to re-derive the number instead of re-running on faith
数据集、solver、scorer、日志。真正的交付物是那份日志。

它拥有什么

实验记录。一个 Inspect Task 由带标注样本的数据集、为每个样本产出答案的 solver——从单次 generate() 调用到完整的会用工具的智能体都算——以及给它打分的 scorer 组成。当 solver 要执行模型写出的代码时,Inspect 会配好沙箱(默认 Docker),于是不可信执行成了框架的事,而不是你的事。

这买到了什么

经得起辩护的数字。评测日志保存了消息、工具调用、分数和配置,于是一个结果可以被重新推导,而不是靠信任重跑一遍——这正是"评测"与"轶事"的分界。配套的 inspect_evals 集合已经用同一套接口实现了大量公开基准,于是"我们在标准集上得几分"是一条命令,而不是一个项目。

它让什么变难

随手来一下。Task/solver/scorer 这套拆解,对一场实验是恰当的抽象,对一次冒烟测试就是负担;而且没有任何等价于一条 pytest 断言的五行上手路径。它也是三者中用户最可能在评估危险能力问题的框架,这一点体现在默认值上:谨慎、显式,并不为"站会前想拿到一个数"的那种人优化。

各自疼在哪里

评判器的成本与漂移

三者都把最难的打分委托给了模型,因此三者都继承了同样两个问题:评判器占你评测账单中不小的一块,以及当它的快照被退役时,它会在你脚下悄悄换掉。三者都没替你解决这件事。区别在于你能不能看见它发生——Inspect 的日志能让评判器的更换事后可见,而 promptfoo 与 DeepEval 会心安理得地报出一个变化了的数字,却不告诉你打分的人换了。三者都要把评判模型显式钉死,并且在你信任任何阈值之前先读评判器校准

非确定性

这些框架里任何一个跑出来的单次分数都是一次抽样,不是一次测量;而智能体任务的轮次间方差大到"提升三个点"经常只是噪声。Inspect 让重复试验变得自然,另外两个则要你自己写循环和统计。无论选哪个,都别让一份长得像排行榜的 HTML 报告说服你不必数一数你跑了几遍

轨迹盲区

只给一个走了十九步的智能体的最终答案打分,告诉你的是它有没有走运,而不是它有没有正常工作。Inspect 的日志与 DeepEval 的智能体指标都能伸进轨迹里;promptfoo 对目标的建模则更接近"一个带攻击面的黑盒",这是刻意的。如果你的失败长得像"答案对了、路径疯了",这个缺口就是决定性因素。参见轨迹与过程评测

收购这件事怎么算

OpenAI 于 2026 年 3 月 9 日宣布收购 promptfoo,技术并入 OpenAI Frontier,项目在现有许可证下继续开源。那个反射式的担忧——许可证会翻脸——恰恰是这里最不可能的风险,也是最容易对冲的:已经发布出去的 MIT 代码收不回来,而分叉随时可用。

现实的风险更沉闷,也更难靠分叉绕开:路线图的引力。由前沿实验室维护的红队工具天然有一个重心,边际工程时间会流向母公司客户所在的地方。如果你的测试目标就是那家实验室的模型,这是好事,你应该指望这块集成做得比任何独立项目能筹到钱做的都好。如果你的目标是一组包含其竞争者的混合体,那要盯的不是许可证,而是非自家厂商在新攻击策略上跟不跟得上。这是可观测的,所以去观测,而不是去猜:每次发版检查一下你依赖的那些插件在你的厂商上还跑不跑得动。

DeepEval 与 Inspect 也都不是中立基线。DeepEval 是一个商业平台的开源门面,带着通常那种朝托管产品倾斜的引力。Inspect 由政府安全研究所出资,这对持久性与可复现性极好,也意味着危险能力评估永远会比你的客服机器人被伺候得更周到。世上没有无立场的选项;只有"清楚你的工具是为谁的问题而造"这件事。

什么时候选哪个

你想做的事promptfooDeepEvalInspect AI
找出你没想到的攻击为此而生只能手写能做,但手工
质量退化就让构建挂掉别扭为此而生能做,但更重
发布一个会被审计的数字记录薄弱记录薄弱为此而生
在沙箱里评估长周期智能体不在范围内部分支持为此而生
今天下午就上线一套评测配置即可,快最快最慢
跨多模型多配置横向比较不错手写扫描为此而生

对多数团队,诚实的建议是两个工具而不是一个:安全扫描与质量门禁是两件节奏不同的活,硬塞进同一套框架,得到的是两头都不出彩的测试集。扫描每周对着已部署的表面跑一次;门禁每个 pull request 跑一次。当那个数字要让你团队之外的人相信时,去拿 Inspect。

常见问题

可以同时用不止一个吗?

可以,而且多数认真的团队都这么干。常见的分工是 promptfoo 做对抗扫描、DeepEval 做 CI 门禁,当某个结果需要经受外部审阅时再加上 Inspect。它们并不冲突——每个都是通过不同接口读你的系统。

OpenAI 的收购是不是意味着 promptfoo 会不再支持其他厂商?

已公布的信息里没有这个意思,项目仍在现有许可证下开源。值得盯的是相对投入而不是移除:新的攻击策略会不会同时落到非 OpenAI 的厂商上。按发版、对着你真正在用的厂商去核对。

我到底需不需要评测框架,自己写不行吗?

运行器你一个下午就能写出来,而那并不是你要买的部分。你要买的是指标库、对抗用例生成、沙箱和日志格式——每一项都是数周的工作量,而且没有一项是你要交付的产品。

这些和 LangSmith、Braintrust 这类可观测性平台是什么关系?

基本互补。这三者回答的是离线对着数据集"过没过";可观测性平台回答的是线上流量里"发生了什么",并且拥有人工标注与看板那一片。团队最后通常两边各拿一个。

哪个能处理多轮智能体对话?

Inspect 最自然,因为它的 solver 可以是一个完整的会用工具的智能体,整段消息历史都会落进日志。DeepEval 有多轮与智能体指标,在你的对话是固定素材时很好用。promptfoo 的多轮策略存在的意义是把一次攻击跨轮次带下去,而不是给一段对话打分。

只靠其中任何一个,够不够拿来声称合规?

不够。框架产出的是证据;一项合规声明还需要界定好的范围、留存的记录和一个负责的人。Inspect 的日志格式最接近证据那一半,但治理那一半不是工具问题——见下面的治理页面。

延伸阅读

本站相关:

项目来源: