Argilla for LLMs: revolutionizing LLMs with human feedback

将 LLM 微调和 RLHF 带给每一个人

2023 年 6 月 5 日

Argilla 团队

经过数月的有趣团队合作和向社区学习,我们非常激动地分享我们迄今为止最重要的功能:Argilla Feedback。

Argilla Feedback 是完全开源的,并且是企业级同类产品中的首创。Argilla Feedback 专注于可扩展的人工反馈收集,旨在提升大型语言模型 (LLM) 的性能和安全性

近几个月来,对 LLM 驱动的应用程序的兴趣呈爆炸式增长。然而,这种兴奋之情已被现实的检验所抑制,这些检验强调了评估、对齐、数据质量和人工反馈的关键作用

在 Argilla,我们认为严格的评估和人工反馈对于从 LLM 实验和概念验证过渡到实际应用至关重要

在部署安全可靠的软件解决方案方面,几乎没有捷径可走,LLM 也是如此。然而,有一个明显的区别:对于 LLM 而言,可靠性、安全性和准确性的主要来源是数据

OpenAI 在训练完他们最新的模型后,花了几个月的时间来改进其安全性和对齐性,然后才公开发布 ChatGPT。ChatGPT 的全球成功很大程度上依赖于人工反馈来实现模型对齐和安全,这说明了这种方法在成功部署人工智能方面起着至关重要的作用。

也许您认为只有少数公司拥有进行这项工作的资源。然而,有一个令人鼓舞的消息:开源基础模型每天都在变得越来越强大,即使是少量的高质量、专家策划的数据也可以使 LLM 准确地遵循指令。因此,除非您准备推出下一个 ChatGPT 竞争对手,否则针对特定领域整合人工反馈是触手可及的,而 Argilla 是您安全有效地部署 LLM 用例的关键。 渴望了解原因吗?请继续阅读以了解更多信息!

您可以向 Argilla 添加无限的用户,以便它可以用于在您组织内的数百名标注员或专家之间无缝分配工作负载。类似的工作包括 Databricks 的 Dolly 或 OpenAssistant。如果您需要帮助设置此类工作,请联系我们,我们很乐意提供帮助

Argilla Feedback UI:对 Dolly 数据集提示的 Falcon-7b 回复进行评分。

Argilla Feedback 概览

Argilla Feedback 专门用于支持 LLM 项目中的定制和多方面反馈。Argilla Feedback 作为微调和基于人类反馈的强化学习 (RLHF) 的关键解决方案,为企业用例量身定制的评估、监控和微调提供了灵活的平台。

Argilla Feedback 通过以下方式提升 LLM 用例

LLM 监控和评估:此过程通过收集人工和机器反馈来评估 LLM 项目。关键在于 Argilla 与 🦜🔗 LangChain 的 集成,这确保了 LLM 应用程序的持续反馈收集。

演示数据收集:它有助于收集人工指导的示例,这对于监督微调和指令微调是必需的。

比较数据收集:它在收集比较数据以训练奖励模型方面发挥着重要作用,这是 LLM 评估和 RLHF 的关键组成部分。

强化学习:它有助于为 RLHF 的强化学习阶段制作和选择提示

自定义 LLM。我们认为语言模型将在内部进行微调,并根据企业用例的要求进行定制。为了实现这一目标,您需要将数据管理和策展视为 MLOps(或者我们应该说是 LLMOps)堆栈的重要组成部分。

在这些阶段中,Argilla Feedback 简化了人工和机器反馈的收集过程,提高了 LLM 改进和评估的效率。下图可视化了训练和微调 LLM 的关键阶段。它突出了每个阶段的数据和预期结果,并特别强调了人工反馈的融入点。

LLM 开发阶段LLM 开发阶段,由 InstructGPT 论文开创,最终促成了 ChatGPT 的诞生。此图改编自 Chip Huyen 的精彩文章 “RLHF:基于人类反馈的强化学习”

领域专业知识与外包。在 Argilla 中,数据标注和策展过程不是一个单一事件,而是 ML 生命周期的一个迭代组成部分,这使其与传统数据标注平台区分开来。Argilla 集成到 MLOps 堆栈中,使用反馈循环进行持续的数据和模型改进。鉴于当前 LLM 反馈的复杂性,组织越来越多地利用其自身的内部知识和专业知识,而不是将训练集外包给数据标注服务。Argilla 有效地支持了这种转变。

请继续阅读,我们将详细介绍 Argilla Feedback 的工作原理,并使用两个示例用例:监督微调奖励建模

致当前的 Argilla 用户 - Argilla Feedback 是一项新任务,已完全集成到 Argilla 平台中。如果您已经熟悉 Argilla,您可以将 Argilla Feedback 视为我们用户已经喜欢的功能的增强版。实际上,它为 Argilla 2.0 奠定了基础,Argilla 2.0 将以更灵活和强大的方式集成其他任务,如文本分类和 Token 分类。

监督微调

演示数据的重要性 - 提示和演示 - 对于改进 LLM 至关重要。此数据有助于监督微调,也称为指令微调或行为克隆,模型在其中学习根据人类示例响应指令。

质量胜于数量最近的研究表明,1,000-2,000 个多样化且一致的示例数据集可以在提高指令遵循能力和响应风格方面大有作为,超过了像 InstructGPT 和 Dolly 这样的模型所需的大型演示数据集。

为了可视化监督微调的预期效果,让我们看两个由 LLM 生成的示例。首先,模型 Falcon-7B 未针对以下指令进行微调。我们在提示末尾使用“Email:”来引导模型编写电子邮件,但它仍然没有给我们想要的结果

提示补全
为销售电子邮件撰写跟进。电子邮件我想知道您对昨天在电话中与您讨论的项目是否有任何疑问。如果您在任何其他方面需要我的帮助,或者需要任何进一步的详细信息来帮助您推进您的项目,请告诉我。再次感谢您的时间,祝您周末愉快,-Sarah

以及相同的模型在指令微调后,Falcon-7B-instruct 模型

提示补全
为销售电子邮件撰写跟进尊敬的 客户姓名

感谢您上周从我们这里购买了 产品名称。我们希望您一直喜欢使用它!

如果您对您的购买有任何疑问或反馈,请随时告诉我们。我们随时乐意为您提供帮助。

此致,
销售团队

构建此工作流程的步骤是:配置数据集以请求补全添加记录收集标注员的反馈准备数据集微调 LLM。请继续阅读以了解有关每个步骤的更多信息,并在下方查看可视化表示。

comparison-data用于演示数据收集和 SFT 的人机循环工作流程

配置数据集

首先,我们需要配置一个数据集。Argilla 数据集允许您混合不同的问题供标注员回答。在本例中,我们希望从标注员那里收集演示。使用 Argilla 的 Python SDK,您可以设置一个 TextQuestion 供您的标注员编写演示,并设置一个 TextField 向他们显示提示。您可以使用以下代码片段设置数据集

import argilla as rgquestions = [    rg.TextQuestion(        name="completion",        title="Please write an accurate, helpful, and harmless response to the prompt",        required=True,    )]fields = [    rg.TextField(name="prompt", required=True),]dataset = rg.FeedbackDataset(    guidelines="Please, read the prompt carefully and write a response",    questions=questions,    fields=fields)

添加记录

Argilla 数据集由记录组成。记录是可以由一个或多个标注员标注的数据点。在监督微调的情况下,我们的目标是收集人工编写的对提示的回复。收集提示有很多种方法,从要求标注员编写提示到使用开放数据集,再到使用 LLM 生成提示。我们在文档中详细介绍了不同的场景。假设我们有一个包含提示的数据集,以下是如何构建和推送记录

from datasets import load_dataset# This is only for demonstration and assumes you use a HF datasetprompts = load_dataset('your_prompts_dataset', split=["train"])records = [    rg.FeedbackRecord(fields={"prompt": record["prompt"]})    for record in dataset]dataset.add_records(records)# This publishes the dataset and pushes the records into Argilladataset.push_to_argilla(name="my-dataset", workspace="my-workspace")

收集标注员的反馈

Argilla Feedback 允许从多个用户同时收集反馈,从而增强质量控制。每个具有数据集访问权限的用户都可以提供反馈。但是,当资源有限时,建议在不同的标注员之间分配工作负载。此策略需要为每个标注员分配总记录的子集。在文档中,我们提供了有关有效设置这些工作负载分配选项的详细说明

准备数据集并微调 LLM

在收集标注员的反馈后,还剩下两个步骤:准备数据集,包括解决和聚合来自多个标注员的回复,以及微调 LLM。

Argilla 的文档涵盖了处理意见分歧和合并来自多个标注员的反馈的几种方法。对于指令微调,典型的格式包括一个 prompt、一个 response,以及可能的可选 inputs 字段(如 Alpaca 和 Dolly 数据集中)。

对于微调,您可以使用 Hugging Face AutoTrainpeft/Lora 以及许多其他工具,如 MosaicML 或 Lightning。Argilla 的文档详细介绍了几种方法

现在,让我们继续下一个用例:奖励建模。

奖励建模

收集比较数据以训练奖励模型是 RLHF 和 LLM 评估的关键部分。此阶段涉及训练奖励模型以使回复与人类偏好对齐。之后,在强化学习阶段,LLM 会根据奖励模型进行微调,以生成更好的回复。与奖励模型如何对提示-回复对进行评分相反,比较数据收集通常需要人类(和机器)对单个提示的多个回复进行排名

构建此工作流程的步骤是:配置数据集以请求比较添加记录收集反馈准备数据集训练奖励模型。请继续阅读以了解有关每个步骤的更多信息,并在下图查看可视化表示。

comparison-data用于比较数据收集和奖励建模的人机循环工作流程

人类偏好优化。最近的研究 “直接偏好优化:您的语言模型秘密地是一个奖励模型” 提出了直接使用比较数据的有希望的可能性,从而消除了对奖励模型的需求。然而,比较数据的收集对于引导 LLM 仍然至关重要。

配置数据集

让我们从创建一个用于收集排名回复的数据集开始。使用 Argilla 的 Python SDK,您可以设置一个 RatingQuestion 供您的标注员回答,一个可选的 TextQuestion 用于编写更正后的回复,以及一个 TextField 向他们展示提示。您可以使用以下代码片段设置数据集

import argilla as rgquestions = [    rg.RatingQuestion(        name="response_ranking",        title="Rank the responses\n1: first response is better,\n 2: second response is better,\n3: both are equal",        required=True,        values=[1, 2,3]    ),    rg.TextQuestion(        name="correct_response",        title="If none of the responses are helpful and correct, provide the response",        required=False    ),]fields = [    rg.TextField(name="prompt", required=True),    rg.TextField(name="response-1", required=True),    rg.TextField(name="response-2", required=True)]dataset = rg.FeedbackDataset(    guidelines="Please, read the prompt carefully and...",    questions=questions,    fields=fields)

这将配置以下 UI。请注意,Argilla 数据集是高度可配置的,因此您可以为您的用例添加任何需要的字段和问题

comparison-collection.pngArgilla UI 用于此自定义用例,其中包含 Falcon-7B 生成用于比较数据收集

此示例涉及对每个提示的两个回复进行排名,但您可以修改它以处理更多回复。请密切关注未来 Argilla 更新中的 RankingQuestion,它旨在优化此过程。您可以在 GitHub 上关注进度

添加记录

现在,让我们继续下一步:将记录添加到数据集并使其可供标注员使用。每个记录将包含一个 提示和两个生成的回复。这些记录将在 Argilla 用户界面中显示给标注员,他们将被要求对两个回复进行排名。在此阶段,至关重要的是要考虑如何有效地生成回复,以确保生成的 LLM 达到最佳质量和多样性。

要生成回复,您可以使用在先前数据集上进行过微调的预训练 LLM。可以使用各种策略,例如生成多个回复并选择其中两个,或使用不同的参数(例如温度设置)生成两个回复。

如果您心中有一个指令微调 LLM,这是一个使用指令跟随模型 Falcon-7B-instruct 生成回复并创建 Argilla 记录的示例

# Load the model and tokenizermodel = AutoModelForCausalLM.from_pretrained("tiiuae/falcon-7b-instruct")tokenizer = AutoTokenizer.from_pretrained("tiiuae/falcon-7b-instruct")# Create a pipeline for text generationgen_pipeline = pipeline(    "text-generation",    model=model,    tokenizer=tokenizer,    torch_dtype=torch.bfloat16,    device_map="auto",)# Load your dataset of promptsprompts = load_dataset("your_prompts_dataset", split=["train"])records = []for record in prompts:    prompt = record["prompt"]    # Generate two responses in one call    outputs = gen_pipeline(        prompt,        max_length=100,        do_sample=True,        top_k=10,        num_return_sequences=2,        eos_token_id=tokenizer.eos_token_id,    )    responses = [output["generated_text"] for output in outputs]    record = rg.FeedbackRecord(fields={"prompt": prompt, "response 1": responses[0], "response 2": responses[1]})    records.append(record)# Add records to the datasetdataset.add_records(records)# This publishes the dataset and pushes the records into Argilladataset.push_to_argilla(name="my-dataset", workspace="my-workspace")

准备数据集并训练奖励模型

在文档中,我们介绍了如何以此格式准备数据,以便使用 trl 框架训练奖励模型。让我们看一下代码,以使用 Argilla 团队创建的此数据集训练奖励模型。此模型使用由 Databricks 的 Dolly 数据集和 Falcon-7B-Instruct 创建的比较数据,它是截至 6 月 1 日 🤗 当前最强大的开源 LLM 模型 的小型版本。

from transformers import (    AutoModelForSequenceClassification,    AutoTokenizer,    TrainingArguments,)from trl import RewardTrainerfrom datasets import load_datasetdataset = load_dataset("argilla/dolly-curated-comparison-falcon-7b-instruct", split="train")model_name = "distilroberta-base"model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=1)tokenizer = AutoTokenizer.from_pretrained(model_name)if tokenizer.pad_token is None:    tokenizer.pad_token = tokenizer.eos_token    model.config.pad_token_id = model.config.eos_token_iddef formatting_func(examples):    kwargs = {"padding": "max_length", "truncation": True, "max_length": 512, "return_tensors": "pt"}    # Assuming original human response is preferred to Falcon's    chosen_response = examples["original_response"]    rejected_response = examples["response-1"]    prompt = examples["prompt"]    tokens_chosen = tokenizer.encode_plus(prompt, chosen_response, **kwargs)    tokens_rejected = tokenizer.encode_plus(prompt, rejected_response, **kwargs)    return {        "input_ids_chosen": tokens_chosen["input_ids"][0], "attention_mask_chosen": tokens_chosen["attention_mask"][0],        "input_ids_rejected": tokens_rejected["input_ids"][0], "attention_mask_rejected": tokens_rejected["attention_mask"][0]    }formatted_dataset = dataset.map(formatting_func)trainer = RewardTrainer(    model=model,    args=TrainingArguments("output_dir"),    tokenizer=tokenizer,    train_dataset=formatted_dataset)trainer.train()

运行此步骤后,我们便拥有了一个可用于 RLHF 和 LLM 评估的奖励模型!

如果您想了解有关生成的奖励模型及其构建方式的更多信息,它是 100% 开源的,并且可在 Hugging Face Hub 上获得

下面您可以找到一些示例的分数(请记住 RM 经过训练,更喜欢原始回复)

提示原始回复回复-1原始分数回复-1 分数
什么是折旧折旧是指资产因磨损、老化和过时(过时)而导致的价值下降,这记录在组织的财务记录中。什么是折旧 – 10 个需要了解的重要事实?
当企业购买新资产时,该资产的购买价格会随着时间的推移而折旧,以反映其使用情况和最终的过时。折旧费用可以作为税收减免费用,通常是在公司损益表和资产负债表上报告的非现金费用。金额...
1.9764-9.01173
您对苏格兰的阿伯丁市了解多少?阿伯丁是位于苏格兰东北部的城市。截至 2020 年,它拥有 20 万人口,是苏格兰第三大城市,仅次于爱丁堡(43.5 万)和格拉斯哥(61 万)。阿伯丁被称为“银城”,因为该市有大量建筑物是用当地采石场的花岗岩建造的,这在罕见的阳光照射到建筑物时可能会闪闪发光。自 20 世纪 60 年代以来,由于靠近北海石油发现,该市的经济主要围绕石油和天然气展开。阿伯丁有两所大学;阿伯丁大学和罗伯特戈登大学。与阿伯丁相关的知名人士包括歌手安妮·蓝妮克丝、高尔夫球手保罗·劳里和建筑师阿奇博尔德“阿奇”辛普森。阿伯丁是我过去 4 年居住的城市,是苏格兰第三大城市,人口约 70 万。它拥有悠久的历史,有证据表明人类居住的历史可以追溯到大约 5000 年前。这座城市是著名的阿伯丁“岩石”(实际上是城市本身)以及几所大学的所在地,也是该国最大的金融中心之一。7.03729-6.4728

下一步是什么?

这篇博文仅触及了 Argilla 功能的冰山一角。我们很高兴在开源 LLM 的发展中发挥关键作用。我们的路线图包括将已受欢迎的 Argilla 功能(如来自多个模型的建议(现在称为预测)和规则、用于 SFT 和奖励建模的主动学习、向量搜索以及弱监督)集成到这个新范例中。

查看 Argilla Feedback 数据模型 文档,抢先了解即将推出的功能(请参阅下图)。

data-modelArgilla Feedback 数据模型和即将推出的功能

请继续关注更多更新!如果您需要帮助为您的 LLM 用例设置人机循环工作流程,请联系我们,我们很乐意提供帮助

开始使用 Argilla Feedback

您可以使用多种部署选项之一自托管 Argilla,注册我们即将推出的 Argilla Cloud 版本,或使用此一键部署按钮在 Hugging Face 上启动 Argilla Space

概念指南:关于如何使用 Argilla 进行 LLM 数据收集、微调和 RLHF 的广泛概述。

操作指南:Argilla Feedback 的实用、动手入门介绍。