Argilla 是专为 LLM 微调和 RLHF 设计的开源数据收集平台。可直接集成到模型优化工作流中。
经过数月有趣的团队合作和从社区的学习,我们高兴地分享迄今为止最大的功能:Argilla Feedback。
Argilla Feedback 完全开源,是企业级同类产品中的首创。Argilla Feedback 专注于可扩展的人类反馈收集,旨在提升大型语言模型(LLM)的性能和安全性。
近几个月来,由 LLM 驱动的应用程序的兴趣激增。然而,这种热情被现实检验所冷却,现实突出了评估、对齐、数据质量和人类反馈的关键作用。
在 Argilla,我们相信严格的评估和人类反馈对于从 LLM 实验和概念验证过渡到真实应用至关重要。
在部署安全可靠的软件解决方案时,很少有捷径可走,LLM 也不例外。但是,有一个显著的区别:对于 LLM,可靠性、安全性和准确性的主要来源是数据。
在训练其最新模型后,OpenAI 花费了几个月来完善其安全性和对齐,然后才公开发布 ChatGPT。ChatGPT 的全球成功在很大程度上依靠了人类反馈来实现模型对齐和安全性,这说明了这种方法在成功的 AI 部署中的关键作用。
也许你认为只有少数几家公司有资源来做这件事。然而,有好消息:开源基础模型每天都在变得更强大,即使是少量高质量、专家策划的数据也能使 LLM 准确地遵循指令。因此,除非你准备推出下一个 ChatGPT 竞争对手,否则在特定领域中纳入人类反馈是可以实现的,而 Argilla 是你安全有效地部署 LLM 用例的关键。渴望了解原因?继续阅读以发现更多!
你可以向 Argilla 添加无限用户,以便可以在你的组织内的数百个标注人员或专家之间无缝分配工作负载。类似的努力包括 Databricks 的 Dolly 或 OpenAssistant。如果你需要帮助设置这样的工作,请联系我们,我们会很乐意帮助。
Argilla Feedback UI:为对 Dolly 数据集提示的 Falcon-7B 响应进行评分
Argilla Feedback 专门为支持 LLM 项目中的定制化和多方面反馈而构建。作为微调和人类反馈强化学习(RLHF)的关键解决方案,Argilla Feedback 提供了一个灵活的平台用于评估、监控和微调,以适应企业用例。
Argilla Feedback 通过以下方式促进 LLM 用例:
LLM 监控和评估:此过程通过收集人类和机器反馈来评估 LLM 项目。关键是 Argilla 与 🦜🔗 LangChain 的集成,确保对 LLM 应用程序的持续反馈收集。
演示数据收集:它促进了人类指导的示例的收集,这对监督微调和指令微调是必要的。
比较数据收集:它在收集比较数据以训练奖励模型方面起着重要作用,这是 LLM 评估和 RLHF 的关键组成部分。
强化学习:它协助为 RLHF 的强化学习阶段制作和选择提示。
定制 LLM。我们认为语言模型将在内部微调,并根据企业用例的要求进行定制。要实现这一点,你需要将数据管理和策划视为 MLOps(或应该说 LLMOps)堆栈的重要组成部分。
在这些阶段中,Argilla Feedback 简化了收集人类和机器反馈的过程,提高了 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 奠定了基础,将以更灵活和强大的方式集成文本分类和令牌分类等其他任务。
演示数据——提示和演示——对于改进 LLM 至关重要。这些数据有助于监督微调,也称为指令微调或行为克隆,其中模型学习根据人类示例响应指令。
质量优于数量。最近的研究表明,包含 1,000-2,000 个多样化和一致的示例的数据集可以在很大程度上改进指令跟随能力和响应风格,超越 InstructGPT 和 Dolly 等模型所使用的更大演示集的需求。
为了可视化监督微调的预期效果,让我们看看 LLM 生成的两个示例。首先,模型 Falcon-7B 没有针对以下指令进行微调。我们在提示的末尾使用"Email:"来促使模型编写电子邮件,但它仍然没有给我们想要的结果:
以及经过指令微调后的同一模型,即 Falcon-7B-instruct 模型:
构建此工作流的步骤是:配置数据集以请求完成、添加记录、从标注人员收集反馈、准备数据集和微调 LLM。继续阅读以了解每个步骤的更多信息,并查看下面的可视化表示。
演示数据收集和 SFT 的人类在环工作流
首先,我们需要配置一个数据集。Argilla 数据集允许你混合不同的问题供标注人员回答。在这种情况下,我们想从我们的标注人员那里收集演示。使用 Argilla 的 Python SDK,你为标注人员设置了一个 TextQuestion 来编写演示,以及一个 TextField 向他们显示提示。你可以使用以下代码片段设置数据集:
import argilla as rg
questions = [
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 dataset
prompts = 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 Argilla
dataset.push_to_argilla(name="my-dataset", workspace="my-workspace")
Argilla Feedback 允许从多个用户同时收集反馈,增强质量控制。每个有数据集访问权限的用户都可以提供反馈。但是,当资源有限时,建议在各种标注人员之间分配工作负载。这个策略涉及为每个标注人员分配总记录的一个子集。在文档中,我们提供了有效设置这些工作负载分配选项的详细说明。
从标注人员处收集反馈后,还剩两个步骤:准备数据集,包括处理和聚合多位标注人员的回答;以及微调 LLM。
Argilla 的文档介绍了多种处理意见分歧以及合并多位标注人员反馈的方法。对于指令微调,典型的数据格式包括提示词、回答,以及一个可选的输入字段(与 Alpaca 和 Dolly 数据集类似)。
进行微调时,你可以使用 Hugging Face AutoTrain、peft/LoRA,以及 MosaicML、Lightning 等许多其他工具。Argilla 的文档详细介绍了其中的多种方法。
现在,让我们进入下一个用例:奖励建模。
收集用于训练奖励模型的比较数据,是 RLHF 和 LLM 评估的关键环节。这个阶段需要训练一个奖励模型,使回答与人类偏好保持一致。随后,在强化学习阶段,根据奖励模型对 LLM 进行微调,使其能够生成更好的回答。奖励模型会为提示词—回答对打分,而比较数据的收集方式与之不同,通常需要人类(以及机器)对同一个提示词的多个回答进行排序。
构建这一工作流的步骤包括:配置数据集以请求比较、添加记录、收集反馈、准备数据集,以及训练奖励模型。请继续阅读以详细了解每个步骤,并参阅下图所示的可视化流程。
用于比较数据收集和奖励建模的人在回路工作流
人类偏好优化。近期研究《Direct Preference Optimization: Your Language Model is Secretly a Reward Model》提出了一种很有前景的方法:直接使用比较数据,从而不再需要奖励模型。尽管如此,比较数据的收集对于引导 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 数据集具有高度可配置性,因此你可以根据自己的用例添加任何所需的字段和问题:
用于这一自定义用例的 Argilla UI,其中展示了用于收集比较数据的 Falcon-7B 生成结果
这个示例需要对每个提示词对应的两个回答进行排序,但你也可以对其进行修改,以处理更多回答。请关注 Argilla 后续更新中的 RankingQuestion,它旨在优化这一流程。你可以在 GitHub 上跟踪其进展。
现在,让我们进入下一步:向数据集中添加记录,并将其提供给标注人员。每条记录都包含一个提示词和两个生成的回答。这些记录会在 Argilla 用户界面中展示给标注人员,并要求他们对两个回答进行排序。在这个阶段,必须认真考虑如何有效生成回答,从而确保最终得到的 LLM 具备最佳的质量和多样性。
生成回答时,可以使用一个已经在先前数据集上完成微调的预训练 LLM。你可以采用多种策略,例如生成多个回答后从中选择两个,或者使用不同的参数(如不同的 temperature 设置)生成两个回答。
如果你已经选定了一个经过指令微调的 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 日,Falcon-7B-Instruct 是当时最强开源 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 上。
下面是一些示例的得分(请记住,该奖励模型经过训练后会偏向原始回答):
这篇博客文章只是浅浅触及了 Argilla 所能实现的各种可能性。我们非常高兴能在开源 LLM 的发展过程中发挥关键作用。我们的路线图包括:将 Argilla 中已经广受欢迎的功能引入这一新范式,例如来自多个模型和规则的建议(现在称为预测)、用于 SFT 和奖励建模的主动学习、向量搜索,以及弱监督。
查看 Argilla Feedback Data Model 文档,可以提前了解即将推出的功能(见下图)。
Argilla Feedback Data Model 与即将推出的功能
敬请关注后续更新!如果你在为自己的 LLM 用例设置人在回路工作流时需要帮助,请联系我们,我们很乐意提供协助。
你可以使用众多部署选项之一自行托管 Argilla,也可以注册即将推出的 Argilla Cloud 版本,或者通过这个一键部署按钮在 Hugging Face 上启动一个 Argilla Space:
概念指南:全面介绍如何使用 Argilla 进行 LLM 数据收集、微调和 RLHF。
操作指南:以实用、动手实践的方式介绍 Argilla Feedback。