跳到内容

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。

Prometheus 2 pipeline overview

现有的开源评估器 LM 存在严重的缺点

  1. 它们发出的分数与人类分配的分数有很大差异。
  2. 它们缺乏执行直接评估和成对排序的灵活性,这两种是最常见的评估形式。

此外,它们不具备基于自定义评估标准进行评估的能力,而是侧重于通用属性,如 helpfulness 和 harmlessness。Prometheus 2 能够处理直接评估和成对排序格式,并结合用户定义的评估标准。

Prometheus 2 发布了两个变体

这两个模型都针对直接评估和成对排序任务进行了微调,即评估给定指令的单个孤立响应的质量(有或没有参考答案),以及评估给定指令的一个响应相对于另一个响应的质量(有或没有参考答案)。

在四个直接评估基准和四个成对排序基准上,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,如下所示

pip install "distilabel[vllm]>=1.1.0"

或者,建议安装 Dao-AILab/flash-attention,以便通过 vllm 从 Flash Attention 2 加速中获益。

pip install flash-attn --no-build-isolation

注意

上面的安装说明假设您正在使用具有一个 GPU 加速器的 VM,该加速器至少具有足够的 VRAM 以容纳 bfloat16 中的 prometheus-eval/prometheus-7b-v2.0 (28GB);但是,如果您有足够的 VRAM 以容纳 bfloat16 中的 8x7B 模型 (~90GB),则可以使用 prometheus-eval/prometheus-8x7b-v2.0 代替。

构建模块

  • LoadDataFromHubGeneratorStep,用于从 Hugging Face Hub 加载数据集。

  • PrometheusEvalTask,它使用任何 Prometheus 2 模型评估给定指令的响应质量。

    注意

    由于 Prometheus 2 模型使用的聊天模板与 mistralai/Mistral-7B-Instruct-v0.2 略有不同,我们需要将 chat_template 参数设置为 [INST] {{ messages[0]['content'] }}\n{{ messages[1]['content'] }}[/INST],以便正确格式化 Prometheus 2 的输入。

  • (可选)KeepColumnsTask,它仅保留数据集中的指定列,用于删除不需要的列。

代码

如前所述,我们将把前面提到的构建模块放在一起,看看如何通过 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。

distiset.push_to_hub(
    "instruction-dataset-prometheus",
    private=True,
)