Allen AI · 官方

olmo-eval:模型开发循环的评估工作台 | Ai2

olmo-eval: An evaluation workbench for the model development loop | Ai2

二〇二六年六月十二日 · 英文原文

Allen AI 发布了 olmo-eval,一个基于 OLMES 标准构建的 LLM 评估工作台,旨在支持模型开发过程中的反复评估。它通过任务/套件/harness 抽象将基准逻辑与运行时策略解耦,原生支持智能体(agentic)和多轮(multi-turn)评估,并提供成对模型比较的结果查看器。olmo-eval 允许灵活选择每个基准的运行方式(轻量级或容器化),并记录标准误差和最小可检测效应,帮助判断干预是否真正改进了基线。

在构建大语言模型(LLM)的过程中,你需要在多次干预(intervention)后反复评估模型。每次对数据、架构或超参数的调整,以及每次规模上的提升,都会让你回到同一个循环中:添加或重新配置基准(benchmark),在每个新的模型检查点(checkpoint)上重新运行它们,记录结果,并检查某个在小实验中有效的方法是否在完整训练中仍然成立。大多数评估工具并非为此而设计——它们要么是为在已完成的模型上运行既定基准而构建,要么是在沙箱(sandbox)中通过多步骤、使用工具的问题来运行模型。它们无法跟上不断变化的模型,也无法反映模型在特定真实世界条件下的行为。

我们上一个应对这一评估挑战的项目是 OLMES,即开放语言模型评估标准(Open Language Model Evaluation Standard)。它于 2024 年推出,旨在让 LLM 的基准分数在不同版本之间更易于比较。相同的模型在相同的基准上以不同的方式评分——提示格式(prompt formatting)和任务表述(task formulation)等方面往往因论文而异——因此关于哪些模型表现最佳的声明往往无法复现。OLMES 将基准选择固定在一个开放、有文档记录的标准中,并成为我们从 Olmo 到 Tulu 评估开放模型的基础。

但模型的最终分数只是评估过程的一部分——这就是为什么我们发布了 olmo-eval,这是一个新的工作台,它建立在 OLMES 之上,并将其扩展到 LLM 开发的其余部分。与 OLMES 相比,olmo-eval 减少了实施新评估的工作量,在定义评估运行位置和方式方面提供了更大的灵活性,并使将各个组件组合成更大工作流(workflow)变得更加容易。它原生支持智能体(agentic)和多轮(multi-turn)评估,并且更强大的分析工具能帮助你判断某项干预是否确实改进了基线(baseline),或者差异是否只是噪声(noise)。

olmo-eval 与现有工具的区别

olmo-eval 在某些方面与 Harbor 重叠,Harbor 是一个用于在容器化、沙箱化环境中评估 AI 智能体的开放框架。但这两个工具的范围不同。Harbor 主要旨在运行和发布智能体基准;而 olmo-eval 是为模型开发的日常工作而构建的——添加和配置基准,跨检查点运行它们,并逐条提示(prompt)分析结果,而不是只看一个总体分数。

Harbor 以相同的方式运行所有内容——在密封、可复现的容器内。由于容器可能消耗大量资源,olmo-eval 允许你选择每个基准的运行方式。一个只需要模型回答问题的基准可以直接运行,这样更快、成本更低;一个需要锁定环境(例如,运行模型编写的代码)的基准则会获得一个隔离的容器设置。轻量级路径是默认选项,olmo-eval 仅在基准实际需要时才选择重量级设置。

Harbor 添加基准的流程是为你计划发布和公开分享的评估而构建的,其中包含额外的验证步骤。olmo-eval 是为在开发过程中快速推进而构建的,你添加基准的方式取决于基准的需求:对于基本评估,只需一个简短的定义,并附带选项让模型在运行基准时使用工具;或者,对于已有自己代码和流程的基准,只需一个薄包装器(thin wrapper),以便 olmo-eval 能按原样运行它,并以相同格式与其他基准分数一起报告结果。

Harbor 和 olmo-eval 都将基准与运行时策略(runtime policy,即如何运行模型以生成答案)分开,这样你可以更改其中一个而无需重写另一个,但 olmo-eval 的设计更具模块化。在 olmo-eval 中,被评估的模型、它可以使用的工具、容器化环境以及任何辅助模型(如 LLM-as-a-judge)都是可替换的组件。你可以在多个 harness 中重用某个工具,或者将一个评分模型插入一个基准而不影响其他基准,并且无需大量工作即可调整小设置(例如,提示的确切措辞)。

Harbor 为每个模型报告一个总体分数。olmo-eval 也报告这些分数,每个分数都附带标准误差(standard error)和最小可检测效应(minimum detectable effect,即可以可靠地与噪声区分的最小差异)。但更有用的视图是将相同的问题在两个模型检查点上对齐,并在保持其他所有条件不变的情况下逐一比较。这有助于你判断总体平均值中的微小变化是否表明真正的改进,或者仅仅是噪声。

如果你在寻找…… olmo-eval 提供
编写一个多示例基准 Task 子类,包含 DataSource、指标(metrics)和评分表面(scoring surface)
包装一个带有自身运行器的现有智能体风格基准 ExternalEvalSandboxedExternalEval;基准保留其循环和评分,结果落入 schema
在固定基准下切换运行时 --harness 和 harness 预设;harness 包含 provider、工具、scaffold、沙箱和辅助 provider
并行容器执行 用于并行执行器的沙箱 instances,支持基于能力的路由、Docker 或 Modal 模式
可在任务和 harness 间重用的工具定义 @tool 装饰器,带有可选的全局注册表
多轮执行循环 Scaffolds,例如 openai_agents,按 harness 选择,而非嵌入任务定义

一个集成的评估栈

olmo-eval 由四个组件组成,它们各自有用,但设计为协同工作以收紧实验性 LLM 开发循环:

  1. 任务/套件/harness 抽象:将基准逻辑与运行时策略解耦。任务(task)是你在 olmo-eval 中定义基准的方式——即被评估的内容。套件(suite)将任务分组为一起运行的集合,而 harness 控制每个任务的运行方式。这种分离允许同一个任务作为标准基线运行,或使用工具和 scaffolding 运行,而无需更改其测量内容。
  2. 沙箱和能力路由层:包括一个异步沙箱规划器。这支持模型的响应取决于其使用工具所采取行动的评估,例如编写和运行代码或浏览网页。关键在于评估模型的真实工具使用:当基准需要工具时,olmo-eval 会运行这些工具并将结果反馈给模型。
  3. 标准化的实验 schema:以相同的结构化格式记录每次运行、其配置和结果。这使得可以分组相关实验、随时间比较检查点,并避免在长期运行的模型开发工作流中经常积累的不一致性。
  4. 用于成对模型比较的结果查看器:将两个模型或检查点逐问题对齐,可以揭示总体平均值可能隐藏的微小但真实的性能变化。

在大多数模型评估设置中,添加一个基准是一个相当大的集成项目。在 olmo-eval 中,只需要一个 task——任务定义了基准数据集、如何构建评估请求以及如何对模型答案进行评分:

from olmo_eval.common.formatters import ChatFormatter
from olmo_eval.common.metrics import AccuracyMetric
from olmo_eval.common.scorers import ExactMatchScorer
from olmo_eval.common.types import Instance, SamplingParams
from olmo_eval.data import DataLoader, DataSource
from olmo_eval.evals.tasks.common import Task, register, register_variant

@register("internal_freshqa")
class InternalFreshQA(Task):
    data_source = DataSource(path="s3://evals/internal/freshqa.jsonl", split="test")
    formatter = ChatFormatter()
    sampling_params = SamplingParams(temperature=0.0)
    metrics = (AccuracyMetric(scorer=ExactMatchScorer),)

    @property
    def instances(self):
        loader = DataLoader()
        for idx, doc in enumerate(loader.load(self.config.get_data_source())):
            yield Instance(
                question=doc["question"],
                gold_answer=doc["answer"],
                metadata={"id": doc.get("id", f"freshqa_{idx}")},
            )

变体(variants)表达了评估策略的变化,而无需复制基准:

register_variant("internal_freshqa", "3shot", num_fewshot=3, fewshot_seed=1234)
register_variant("internal_freshqa", "zero", num_fewshot=0)

套件将基准分组为你一起运行的标准集合:

from olmo_eval.evals.suites import Suite, register

register(Suite(
    name="base_qa_few_shot",
    tasks=(
"sciq:mc:3shot",
"arc_challenge:mc:3shot",
"internal_freshqa:mc:3shot",
    ),
))

并且由于运行时策略存在于 harness 而非任务定义中,同一个基准可以轻松地在不同的执行方式下重新运行,而不是依赖于生成的分数点是否看起来合理。

# 基线
olmo-eval run -m my-instruct-checkpoint -t internal_freshqa:zero

# 相同任务,相同评分,启用搜索/工具运行时
olmo-eval run -m my-instruct-checkpoint -t internal_freshqa:zero --harness search_agent

开放的可复现评估

当评估是持续模型开发的一部分,而非一次性运行——当你需要在可复现条件下跨检查点重复运行相同基准,并在总体和逐问题级别比较干预时——请使用 olmo-eval

如果你反复问的问题是“这个检查点与上一个有何不同,它在哪些地方确切地改进或退步了?”,那么这就是 olmo-eval 为之构建的工作流。

可复现的评估应与模型的构建方式保持同步——而不仅仅是模型完成后如何评分。olmo-eval 将 OLMES 标准带入活跃的模型开发中,我们将其开放发布,以便社区可以在此基础上进行构建。

订阅以每月接收有关 Ai2 最新动态的更新。

译自 Allen AI · 官方 · 录于 二〇二六年六月十二日