简介
openai/evals 不仅仅是另一个平台;它还是一个关键工具,旨在评估 LLM(大型语言模型)以及将 LLM 融入其核心的复杂系统。在通过图灵测试已成为人工智能黄金标准的时代,确保对这些模型进行严格评估比以往任何时候都更为重要。让我们通过 openai/evals 深入了解 LLM 评估。
轻松使用 evals
安装该工具后,我们只需在命令行中定义完成功能(模型的使用、提示策略......)和评估任务(评估指标、数据集和一般协议),即可运行评估。
: 我只想评估 openai Chat LLM。因此,我可以使用任何 openai 模型 id,例如 "gpt-3.5-turbo"、"gpt-4"、"gpt-4-32k"。在这里,我使用的是 . 但是 evals 框架为其他 LLM 管道提供了通用协议,并将它们命名为完成函数,例如 LangChain LLM。
oaieval gpt-3.5-turbo match_mmlu_machine_learning
规范文件:它指定了评估指标、数据和一般协议。例如,在 evals/registry/evals/ 目录中名为 mmlu.yaml 的 YAML 文件中定义 match_mmlu_machine_learning后,它就是一个有效的 eval_task。重要的是,第一行对应的是 eval_task 的名称。在上述命令中使用。它指定了一个少量评估和 MMLU 机器学习数据集。在整篇文章中,我将以这个数据集为例进行说明。
match_mmlu_machine_learning:
id: match_mmlu_machine_learning.test.v1
metrics:
- accuracy
match_mmlu_machine_learning.test.v1:
args:
few_shot_jsonl: evals/registry/data/mmlu/machine_learning/few_shot.jsonl
num_few_shot: 4
samples_jsonl: evals/registry/data/mmlu/machine_learning/samples.jsonl
class: evals.elsuite.basic.match:Match关于本文
到目前为止,还没有官方文档介绍该框架的工作原理。这限制了我们为个人用途扩展或定制该评估框架的控制权。
希望我的探索能为需要使用这一工具的人提供帮助。
以下是本文的目录。
简介
第 1 节:规范文件
第 2 节:规范对象
第 3 节:评估协议
第 4 节:运行评估
第 5 节:结果记录
(可选) 第 6 节:evals.registry.Registry 模块
结论
有了对这些部分的了解,你就可以从头开始编写 Python 代码,创建自己的评估。为了让你有一个大致的了解,下面是运行示例的代码。要运行代码,您可以克隆 GitHub 上的代码,并按照 README.md 中的说明操作。
# define the arguments
args = {
"completion_fn": "gpt-3.5-turbo",
"eval": "match_mmlu_machine_learning",
"cache": True,
"seed": 20220722
}
args = SimpleNamespace(**args)# evaluation specification
registry = Registry()
eval_spec = registry.get_eval(args.eval)# eval object
eval_class = registry.get_class(eval_spec)openai.api_key = "YOUR_API_KEY"
completion_fn_instance = registry.make_completion_fn(args.completion_fn)
eval: Eval = eval_class(
completion_fns=[completion_fn_instance],
samples_jsonl=eval_spec.args["samples_jsonl"],
name=eval_spec.key, # match_mmlu_machine_learning.test.v1,
seed=args.seed
)# recorder
eval_name = eval_spec.key # match_mmlu_machine_learning.test.v1
run_spec = evals.base.RunSpec(
completion_fns=[args.completion_fn],
eval_name=eval_name,
base_eval=eval_name.split(".")[0],
split=eval_name.split(".")[1],
run_config = {
"completion_fns": [args.completion_fn],
"eval_spec": eval_spec,
"seed": args.seed,
},
created_by="xinzhe", # my name
)
recorder_path = f"evallogs/__.jsonl"
recorder = evals.record.LocalRecorder(recorder_path, run_spec)# run the evaluation
result = eval.run(recorder)
recorder.record_final_report(result)第 1 部分:规格文件
现在,让我们来回答这个问题:如何定义特定评估任务的参数,如评估数据、评估指标?
评估任务(第 1 行 match_mmlu_machine_learning:):评估任务名为 match_mmlu_machine_learning。这应与上述 bash 命令中的 $eval_name 相对应。
评估 ID(第 2 行):此任务有一个关联的。它定义了评估任务的更具体的版本或变体。
指标(第 3、4 行):在任务下,有一个键列出了用于评估此任务的指标。在这种情况下,指定的唯一度量是。这表明任务的表现将根据准确性来衡量。
评估参数(第 5 行):该键提供有关评估任务的此版本/变体的更多具体详细信息。键包含用于评估的参数:
* (第 7 行):可能包含少量示例的 JSONL 文件的路径。这些是模型在评估之前看到的示例,有助于它理解任务。
* (第 8 行):指定要使用的少样本示例的数量。在本例中,将使用 4 个示例。
* (第 9 行):JSONL 文件的路径,该文件可能包含评估模型的实际样本或数据。
类引用(第 10 行):类引用的值将分为两部分。
1) 模块名称 ( ) 和 2) 类名称 ( )。它表明评估将由位于模块中的类处理。此类可能包含如何处理响应或完成以及如何计算最终准确度度量的逻辑。它检查模型输出是否与正确答案匹配。
在后台,将为每个提示生成一个带有模型选择的补全,检查补全是否与真实答案匹配,然后记录结果”。
第 2 部分:规范对象
本节将介绍如何使用 YAML 文件构建 中的规范对象,该对象将用于 中定义的评估工作流程。
现在,让我们演示如何使用规范文件。该类用于 1) 检索规范文件的信息以及 2) 根据这些信息构造规范对象。
简而言之,您可以将上述文件保存并调用以下方法来获取规范对象。
Registry().get_eval_set(name) -> evals.base.EvalSetSpec
Registry().get_eval(name) -> Evals.base.EvalSpec
您可以参考第 6 节:evals.registry.Registry 模块了解详细信息。
在我们的示例中,我们可以调用以下代码行:
registry = Registry()
eval_spec = registry.get_eval(name = "match_mmlu_machine_learning")
print(eval_spec)
# EvalSpec(cls='evals.elsuite.basic.match:Match',
# args={'few_shot_jsonl': 'evals/registry/data/mmlu/
# machine_learning/few_shot.jsonl',
# 'num_few_shot': 4,
# 'samples_jsonl': 'evals/
# registry/data/mmlu/machine_learning/samples.jsonl'},
# key='match_mmlu_machine_learning.test.v1',
# group='mmlu')第 3 节:评估协议
评估协议定义了如何处理响应或完成情况,以及如何计算最终的准确性指标。定义此类协议的接口。
获得规范对象( ) 后,可以调用该方法来获取继承自 的具体类。
Registry().get_class(spec: EvalSpec) -> evals.Eval
在我们的示例中,与评估变体关联的类来自module ,如文件中最后一行所定义。因此,它将输出一个对象,如下所示。
会将类维护为具有对象中定义的部分可用参数的类。
eval_class = registry.get_class(eval_spec)
print(eval_class)
# functools.partial(,
# few_shot_jsonl='evals/registry/data/mmlu/machine_learning/few_shot.jsonl', num_few_shot=4, samples_jsonl='/Users/xinzheli/git_repo/evals/examples/../evals/registry/data/mmlu/machine_learning/samples.jsonl')
然后,您可以使用此类来实例化具有指定完成函数的对象。有关该方法的更多详细信息,您可以参考第 6 节:evals.registry.Registry 模块了解详细信息。
eval: Eval = eval_class(
completion_fns=[completion_fn_instance],
samples_jsonl=eval_spec.args["samples_jsonl"],
name=eval_spec.key # match_mmlu_machine_learning.test.v1,
)第 4 部分:运行评估
让我们了解如何进行评估实验。每个类都需要实现和方法。您只需致电即可启动该流程。
那么,我们首先看一下该方法的实现。
它分为三个步骤:
通过加载数据
调用:它将调用每个样本。
汇总记录的结果。
现在,我们来看看该方法的实现。
class Match(evals.Eval):
...
def eval_sample(self, sample: Any, *_):
prompt = sample["input"]
# add few-shot demonstrations to prompt(See source code for details)
...
# get model completion
result = self.completion_fn(
prompt=prompt,
temperature=0.0,
)
sampled = result.get_completions()[0]
# calculate metrics
return evals.record_and_check_match(
prompt=prompt,
sampled=sampled,
expected=sample["ideal"],
)
它也分为三个步骤:
构建提示
查询模型是否完成
计算和记录指标(例如,指示完成情况是否与预期响应匹配的布尔值)
在运行示例中,我调用以下代码行。在下一节中,我将解释记录器的使用。
result = eval.run(recorder)第 5 部分:结果记录
框架中的记录器是一个旨在记录、存储和管理评估结果的实用程序。它提供了一种结构化的方式来保存评估详细信息、结果和其他相关信息。为了演示,由于我将结果保存到本地文件中,所以下面使用。
1.记录器的实例化
的实例化需要创建一个对象来保存有关评估运行的各种详细信息。并且此运行规范将保存到 .json 文件中。
eval_name = eval_spec.key # match_mmlu_machine_learning.test.v1
run_spec = evals.base.RunSpec(
completion_fns=[args.completion_fn],
eval_name=eval_name,
base_eval=eval_name.split(".")[0],
split=eval_name.split(".")[1],
run_config = {
"completion_fns": [args.completion_fn],
"eval_spec": eval_spec,
"seed": args.seed,
},
created_by="xinzhe", # my name
)
# A path is defined for the recorder to save the evaluation logs.
recorder_path = f"evallogs/__.jsonl"
recorder = evals.record.LocalRecorder(recorder_path, run_spec)
2.Recoder的使用
通过 运行评估后,调用该方法将评估结果写入本地 JSONL 文件。
# save evaluation into recoder object
result = eval.run(recorder)
# write evaluation result into local json file
recorder.record_final_report(result)
该文件将包含评估的结构化日志。
评估规范:第一个条目提供了评估的详细规范,包括完成函数、评估名称、运行配置、创建者姓名、运行 ID 和创建时间戳。
{"spec":
{"completion_fns": ["gpt-3.5-turbo"],
"eval_name": "match_mmlu_machine_learning.test.v1",
"base_eval": "match_mmlu_machine_learning",
"split": "test",
"run_config":
{"completion_fns": ["gpt-3.5-turbo"],
"eval_spec": {"cls": "evals.elsuite.basic.match:Match",
"args":
{"few_shot_jsonl": "evals/registry/data/mmlu/machine_learning/few_shot.jsonl",
"num_few_shot": 4,
"samples_jsonl": "evals/registry/data/mmlu/machine_learning/samples.jsonl"},
"key": "match_mmlu_machine_learning.test.v1",
"group": "mmlu"},
"seed": 20220722},
"created_by": "xinzhe",
"run_id": "230816022025W4JC7NZA",
"created_at": "2023-08-16 02:20:25.272607"}
}
最终报告:第二个条目提供评估的最终报告,其中包括准确性及其引导标准差等指标。
单独的评估事件:后续条目记录单独的评估事件,详细说明特定样本 ( )、其结果、事件 ID、事件类型和时间戳。
{
"run_id": "230816022025W4JC7NZA",
"event_id": 15,
"sample_id": "match_mmlu_machine_learning.test.44",
"type": "match",
"data": {
"correct": true,
"expected": "D",
"picked": "D",
"sampled": "D",
"options": [
"D"
]
},
"created_by": "xinzhe",
"created_at": "2023-08-16 02:39:46.577700+00:00"
}(可选)第 6 节:evals.registry.Registry 模块
注册表类作为工厂类,为三种主要类型的组件生成类和对象:完成函数、评估、评估集。
:它提供包含所有类型配置的目录路径,例如完成函数、评估和评估集。默认路径为、 ,三种配置的保存目录分别为、、。
、、:作为内部属性,检索配置文件中的所有信息。假设仅包含“mmlu.yaml”文件。将输出如下所示的字典。
{'match_mmlu_machine_learning': {'id': 'match_mmlu_machine_learning.test.v1', 'metrics': ['accuracy'], 'key': 'match_mmlu_machine_learning', 'group': 'mmlu'}, 'match_mmlu_machine_learning.test.v1': {'args': {'few_shot_jsonl': 'evals/registry/data/mmlu/machine_learning/few_shot.jsonl', 'num_few_shot': 4, 'samples_jsonl': '/Users/xinzheli/git_repo/evals/examples/../evals/registry/data/mmlu/machine_learning/samples.jsonl'}, 'key': 'match_mmlu_machine_learning.test.v1', 'group': 'mmlu', 'cls': 'evals.elsuite.basic.match:Match'}}
、和:但是,上述内部属性被设计为由这些方法使用来为用户提供高级对象,例如、和。
:此方法旨在检索与给定评估规范 ( ) 关联的类。请注意,它仅返回类,即创建对象(实例)的蓝图。
: 创建CompleteFn。
结论
OpenAI 的“evals”框架提供了一种评估大型语言模型 (LLM) 的全面且结构化的方法。本文旨在允许用户利用该框架的模块化设计来根据特定需求定制评估。希望随着人工智能领域的发展,我们都能帮助确保稳健而准确的模型评估。
领取专属 10元无门槛券
私享最新 技术干货