Prometheus 2¶
"Prometheus 2: An Open Source Language Model Specialized in Evaluating Other Language Models" 介绍了 Prometheus 2,这是一种比 Prometheus(其前身)更强大、更新的评估器 LLM,Prometheus 在 "Prometheus: Inducing Fine-grained Evaluation Capability in Language Models" 中提出;由于 GPT-4 以及其他专有 LLM 通常用于评估各种 LLM 的响应质量,但对于透明度、可控性和经济性存在担忧,这促使人们需要专门用于评估的开源 LLM。
现有的开源评估器 LM 存在严重的缺点
- 它们发出的分数与人类分配的分数有很大差异。
- 它们缺乏执行直接评估和成对排序的灵活性,这两种是最常见的评估形式。
此外,它们不具备基于自定义评估标准进行评估的能力,而是侧重于通用属性,如 helpfulness 和 harmlessness。Prometheus 2 能够处理直接评估和成对排序格式,并结合用户定义的评估标准。
Prometheus 2 发布了两个变体
prometheus-eval/prometheus-7b-v2.0
:在mistralai/Mistral-7B-Instruct-v0.2
之上进行微调prometheus-eval/prometheus-8x7b-v2.0
:在mistralai/Mixtral-8x7B-Instruct-v0.1
之上进行微调
这两个模型都针对直接评估和成对排序任务进行了微调,即评估给定指令的单个孤立响应的质量(有或没有参考答案),以及评估给定指令的一个响应相对于另一个响应的质量(有或没有参考答案)。
在四个直接评估基准和四个成对排序基准上,Prometheus 2 在所有测试的开源评估器 LM 中,与人类和专有 LM 评分员的相关性和一致性得分最高。他们的模型、代码和数据都可在 prometheus-eval/prometheus-eval
公开获取。
复制¶
注意
本节名为 Replication
,但在本例中,我们不是在复制 Prometheus 2 论文本身,而是展示如何使用 distilabel
中实现的 PrometheusEval
任务来评估使用 Prometheus 2 模型对给定指令的响应质量。
为了展示 Prometheus 2,我们将使用 distilabel
中实现的 PrometheusEval
任务,以及 Hugging Face H4 团队创建的名为 HuggingFaceH4/instruction-dataset
的较小数据集,用于测试目的。
安装¶
要重现以下代码,需要安装 distilabel
,如下所示
或者,建议安装 Dao-AILab/flash-attention
,以便通过 vllm
从 Flash Attention 2 加速中获益。
注意
上面的安装说明假设您正在使用具有一个 GPU 加速器的 VM,该加速器至少具有足够的 VRAM 以容纳 bfloat16 中的 prometheus-eval/prometheus-7b-v2.0
(28GB);但是,如果您有足够的 VRAM 以容纳 bfloat16 中的 8x7B 模型 (~90GB),则可以使用 prometheus-eval/prometheus-8x7b-v2.0
代替。
构建模块¶
-
LoadDataFromHub
:GeneratorStep
,用于从 Hugging Face Hub 加载数据集。 -
PrometheusEval
:Task
,它使用任何 Prometheus 2 模型评估给定指令的响应质量。vLLM
:LLM
,它通过 vllm-project/vllm 从 Hugging Face Hub 加载模型。
注意
由于 Prometheus 2 模型使用的聊天模板与
mistralai/Mistral-7B-Instruct-v0.2
略有不同,我们需要将chat_template
参数设置为[INST] {{ messages[0]['content'] }}\n{{ messages[1]['content'] }}[/INST]
,以便正确格式化 Prometheus 2 的输入。 -
(可选)
KeepColumns
:Task
,它仅保留数据集中的指定列,用于删除不需要的列。
代码¶
如前所述,我们将把前面提到的构建模块放在一起,看看如何通过 distilabel
使用 Prometheus 2。
from distilabel.models import vLLM
from distilabel.pipeline import Pipeline
from distilabel.steps import KeepColumns, LoadDataFromHub
from distilabel.steps.tasks import PrometheusEval
if __name__ == "__main__":
with Pipeline(name="prometheus") as pipeline:
load_dataset = LoadDataFromHub(
name="load_dataset",
repo_id="HuggingFaceH4/instruction-dataset",
split="test",
output_mappings={"prompt": "instruction", "completion": "generation"},
)
task = PrometheusEval(
name="task",
llm=vLLM(
model="prometheus-eval/prometheus-7b-v2.0",
chat_template="[INST] {{ messages[0]['content'] }}\n{{ messages[1]['content'] }}[/INST]",
),
mode="absolute",
rubric="factual-validity",
reference=False,
num_generations=1,
group_generations=False,
)
keep_columns = KeepColumns(
name="keep_columns",
columns=["instruction", "generation", "feedback", "result", "model_name"],
)
load_dataset >> task >> keep_columns
然后,我们需要使用运行时参数调用 pipeline.run
,以便可以启动 pipeline。
distiset = pipeline.run(
parameters={
task.name: {
"llm": {
"generation_kwargs": {
"max_new_tokens": 1024,
"temperature": 0.7,
},
},
},
},
)
最后,我们可以选择性地将生成的名为 Distiset
的数据集推送到 Hugging Face Hub,通过 push_to_hub
方法,以便将叶子步骤中生成的每个子集都推送到 Hub。