> 自媒体 > AI人工智能 > 掌握 OpenAI 的 \u0026#34;evals\u0026#34;:深入评估LLMs
掌握 OpenAI 的 \u0026#34;evals\u0026#34;:深入评估LLMs
来源:茶桁
2023-09-14
278
管理
简介

openai/evals 不仅仅是另一个平台;它还是一个关键工具,旨在评估 LLM(大型语言模型)以及将 LLM 融入其核心的复杂系统。在通过图灵测试已成为人工智能黄金标准的时代,确保对这些模型进行严格评估比以往任何时候都更为重要。让我们通过 openai/evals 深入了解 LLM 评估。

轻松使用 evals

安装该工具后,我们只需在命令行中定义完成功能(模型的使用、提示策略......)和评估任务(评估指标、数据集和一般协议),即可运行评估。

completion_fn: 我只想评估 openai Chat LLM。因此,我可以使用任何 openai 模型 id,例如 "gpt-3.5-turbo"、"gpt-4"、"gpt-4-32k"。在这里,我使用的是gpt-3.5-turbo . 但是 evals 框架为其他 LLM 管道提供了通用协议,并将它们命名为完成函数,例如 LangChain LLM。

eval_task: 它指的是 evals.registry.evals 目录中的一个 YAML 文件。该文件定义了特定评估任务的参数,如评估数据、评估指标和提示策略。详情请参阅第 1 节:规范文件。这里,match_mmlu_machine_learning 指的是下一个要点中讨论的规范文件。

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: - accuracymatch_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 中的说明操作。

import loggingimport evalsimport evals.apiimport evals.baseimport evals.recordfrom evals.eval import Evalfrom evals.registry import Registryfrom types import SimpleNamespaceimport openaievals.eval.set_max_samples(8)

# define the argumentsargs = { "completion_fn": "gpt-3.5-turbo", "eval": "match_mmlu_machine_learning", "cache": True, "seed": 20220722 }args = SimpleNamespace(**args)# evaluation specificationregistry = Registry()eval_spec = registry.get_eval(args.eval)# eval objecteval_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 )# recordereval_name = eval_spec.key # match_mmlu_machine_learning.test.v1run_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/{run_spec.run_id}_{args.completion_fn}_{args.eval}.jsonl"recorder = evals.record.LocalRecorder(recorder_path, run_spec)# run the evaluationresult = eval.run(recorder)recorder.record_final_report(result)第 1 部分:规格文件

现在,让我们来回答这个问题:如何定义特定评估任务的参数,如评估数据、评估指标?

评估任务(第 1 行 match_mmlu_machine_learning:):评估任务名为 match_mmlu_machine_learning。这应与上述 bash 命令中的 $eval_name 相对应。评估 ID(第 2 行id: match_mmlu_machine_learning.test.v1):此任务有一个关联id的match_mmlu_machine_learning.test.v1。它定义了评估任务的更具体的版本或变体。指标(第 3、4 行):在match_mmlu_machine_learning任务下,有一个metrics键列出了用于评估此任务的指标。在这种情况下,指定的唯一度量是accuracy。这表明任务的表现将根据准确性来衡量。评估参数(第 5 行):该match_mmlu_machine_learning.test.v1键提供有关评估任务的此版本/变体的更多具体详细信息。键args包含用于评估的参数:* few_shot_jsonl(第 7 行):可能包含少量示例的 JSONL 文件的路径。这些是模型在评估之前看到的示例,有助于它理解任务。* num_few_shot(第 8 行):指定要使用的少样本示例的数量。在本例中,将使用 4 个示例。* samples_jsonl(第 9 行):JSONL 文件的路径,该文件可能包含评估模型的实际样本或数据。类引用(第 10 行):类引用的值evals.elsuite.basic.match:Match将分为两部分。1) 模块名称 ( evals.elsuite.basic.match) 和 2) 类名称 ( Match)。Match它表明评估将由位于模块中的类处理evals.elsuite.basic.match。此类可能包含如何处理响应或完成以及如何计算最终准确度度量的逻辑。它检查模型输出是否与正确答案匹配。

在后台,evals.elsuite.basic.match将为每个提示生成一个带有模型选择的补全,检查补全是否与真实答案匹配,然后记录结果”。

第 2 部分:规范对象

本节将介绍如何使用 YAML 文件构建 中的规范对象evals,该对象将用于 中定义的评估工作流程evals.elsuite。

现在,让我们演示如何使用规范文件。该类Registry用于 1) 检索规范文件的信息以及 2) 根据这些信息构造规范对象。

简而言之,您可以将上述文件保存evals/registry/evals/并调用以下方法来获取规范对象。

Registry().get_eval_set(name) -> evals.base.EvalSetSpecRegistry().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 节:评估协议

评估协议定义了如何处理响应或完成情况,以及如何计算最终的准确性指标。evals.Eval定义此类协议的接口。

获得规范对象( EvalSpec) 后,可以调用该方法Registry().get_class来获取继承自 的具体类evals.Eval。

Registry().get_class(spec: EvalSpec) -> evals.Eval

在我们的示例中,与评估变体关联的类match_mmlu_machine_learning.test.v1来自Matchmodule evals.elsuite.basic.match,如文件中最后一行所定义mmlu.yaml。因此,它将输出一个evals.elsuite.basic.match.Match对象,如下所示。

functools.partial 会将类维护为具有EvalSpec对象中定义的部分可用参数的类。

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')

然后,您可以使用此类来实例化具有指定完成函数的对象。有关该方法的更多详细信息get_class,您可以参考第 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 部分:运行评估

让我们了解如何evals.Eval进行评估实验。每个evals.Eval类都需要实现eval_sample和run方法。您只需致电即可evals.Eval.run启动该流程。

那么,我们首先看一下该run方法的实现。

class Match(evals.Eval): ... def run(self, recorder): samples = self.get_samples() self.eval_all_samples(recorder, samples) events = recorder.get_events("match") return { "accuracy": evals.metrics.get_accuracy(events), "boostrap_std": evals.metrics.get_bootstrap_accuracy_std(events), }

它分为三个步骤:

通过加载数据get_samples调用eval_all_samples:它将调用eval_sample每个样本。汇总记录的结果。

现在,我们来看看该方法的实现eval_sample。

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 部分:结果记录

框架中的记录器openai/evals是一个旨在记录、存储和管理评估结果的实用程序。它提供了一种结构化的方式来保存评估详细信息、结果和其他相关信息。为了演示,由于我将结果保存到本地文件中,LocalRecorder所以下面使用。

1.记录器的实例化

的实例化需要创建Recorder一个对象来保存有关评估运行的各种详细信息。RunSpec并且此运行规范将保存到 .json 文件中recorder_path。

eval_name = eval_spec.key # match_mmlu_machine_learning.test.v1run_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/{run_spec.run_id}_{args.completion_fn}_{args.eval}.jsonl"recorder = evals.record.LocalRecorder(recorder_path, run_spec)

2.Recoder的使用

通过 运行评估后eval.run,recorder.record_final_report(result)调用该方法将评估结果写入本地 JSONL 文件。

# save evaluation into recoder objectresult = eval.run(recorder)# write evaluation result into local json filerecorder.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"}}最终报告:第二个条目提供评估的最终报告,其中包括准确性及其引导标准差等指标。

{"final_report": {"accuracy": 0.5, "boostrap_std": 0.18939640968085958}}单独的评估事件:后续条目记录单独的评估事件,详细说明特定样本 ( sample_id)、其结果、事件 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 模块

注册表类作为工厂类,为三种主要类型的组件生成类和对象:完成函数、评估、评估集。

Rigistry()._registry_paths:它提供包含所有类型配置的目录路径,例如完成函数、评估和评估集。默认路径为evals/registry、 ,三种配置的保存目录分别为evals/registry/completion_fns/、evals/registry/evals/、evals/registry/eval_sets/。Rigistry()._completion_fns、Rigistry()._eval_sets、Rigistry()._evals:作为内部属性,检索配置文件中的所有信息。假设evals/registry/evals/仅包含“mmlu.yaml”文件。将Rigistry()._evals输出如下所示的字典。

{'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'}}Registry().get_completion_fn(name)、Registry().get_eval_set(name)和Registry().get_eval(name):但是,上述内部属性被设计为由这些方法使用来为用户提供高级对象,例如evals.base.CompletionFnSpec、evals.base.EvalSetSpec和evals.base.EvalSpec。Registry().get_class(spec: EvalSpec):此方法旨在检索与给定评估规范 ( EvalSpec) 关联的类。请注意,它仅返回类,即创建对象(实例)的蓝图。Registry().make_completion_fn: 创建CompleteFn。结论

OpenAI 的“evals”框架提供了一种评估大型语言模型 (LLM) 的全面且结构化的方法。本文旨在允许用户利用该框架的模块化设计来根据特定需求定制评估。希望随着人工智能领域的发展,我们都能帮助确保稳健而准确的模型评估。

1
点赞
赏钱
0
收藏
免责声明:本文仅代表作者个人观点,与华威派无关。其原创性以及文中陈述文字和内容未经本网证实,对本文以及其中全部或者 部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
凡本网注明 “来源:XXX(非华威派)”的作品,均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对 其真实性负责。
如因作品内容、版权和其它问题需要同本网联系的,请在一周内进行,以便我们及时处理。
QQ:2443165046 邮箱:info@goodmaoning.com
关于作者
经典好看视频(普通会员)
点击领取今天的签到奖励!
签到排行
1
0
分享
请选择要切换的马甲:

个人中心

每日签到

我的消息

内容搜索