LLM-in-the-loop:数据集构建
(1)采用人工标注少部分数据; (2)微调或提示训练一个大模型,使其指标基本达到与人工标注数据近似; (3)再次人工标注少部分数据; (4)再次微调或设计Prompt使大模型逼近人工标注。
在LLM-in-the-loop数据集构建过程中,主要目的是通过少量的人工标注数据引导和微调大语言模型(LLM),使其逐步逼近人工标注的效果。具体步骤如下:
(1)采用人工标注少部分数据
首先,选取少量的原始数据进行人工标注。由于人工标注成本高,因此选择少量数据进行标注,这些数据将作为模型微调的基础。
操作步骤:
- 收集原始数据。
- 选择少部分样本进行人工标注。
- 构建训练数据集(如:
data_labeled_1.csv
),格式可以是输入-输出
对。
Python 代码示例:
import pandas as pd # 模拟人工标注的数据 data = {'input_text': ['输入1', '输入2', '输入3'], 'label': ['标签1', '标签2', '标签3']} # 保存人工标注的数据 df = pd.DataFrame(data) df.to_csv('data_labeled_1.csv', index=False)
(2)微调或提示训练一个大模型,使其指标基本达到与人工标注数据近似
使用标注的数据对大语言模型进行微调,或设计Prompt对模型进行引导,以便使其性能接近人工标注数据的效果。模型可以是像BERT、GPT等大模型。
操作步骤:
- 使用标注的数据对模型进行微调,或设计Prompt进行训练。
- 评估模型在标注数据上的效果,使其与人工标注的数据表现接近。
Python 代码示例:
from transformers import GPT2Tokenizer, GPT2ForSequenceClassification, Trainer, TrainingArguments # 加载模型和Tokenizer model = GPT2ForSequenceClassification.from_pretrained('gpt2', num_labels=3) tokenizer = GPT2Tokenizer.from_pretrained('gpt2') # 假设我们有训练数据 train_texts = ['输入1', '输入2', '输入3'] train_labels = [0, 1, 2] # 对应标签 # 将文本编码为模型可接受的输入 train_encodings = tokenizer(train_texts, truncation=True, padding=True, max_length=128) # 自定义数据集类 import torch class CustomDataset(torch.utils.data.Dataset): def __init__(self, encodings, labels): self.encodings = encodings self.labels = labels def __getitem__(self, idx): item = {key: torch.tensor(val[idx]) for key, val in self.encodings.items()} item['labels'] = torch.tensor(self.labels[idx]) return item def __len__(self): return len(self.labels) # 创建数据集 train_dataset = CustomDataset(train_encodings, train_labels) # 微调模型 training_args = TrainingArguments( output_dir='./results', num_train_epochs=3, per_device_train_batch_size=4, logging_dir='./logs', logging_steps=10, ) trainer = Trainer( model=model, args=training_args, train_dataset=train_dataset, ) trainer.train()
(3)再次人工标注少部分数据
在模型初步调优之后,我们可以再次标注一小部分新数据,进一步提升模型的准确性。这些新标注的数据将用于下一次微调。
操作步骤:
- 从未标注数据集中选择少量样本进行人工标注。
- 构建新一轮的训练数据集(如:
data_labeled_2.csv
)。
Python 代码示例:
# 模拟第二轮人工标注的数据 new_data = {'input_text': ['输入4', '输入5', '输入6'], 'label': ['标签1', '标签2', '标签1']} # 保存新一轮的标注数据 new_df = pd.DataFrame(new_data) new_df.to_csv('data_labeled_2.csv', index=False)
(4)再次微调或设计Prompt使大模型逼近人工标注
使用第二轮标注的数据对模型进行再次微调,或者调整Prompt的设计,使得模型能够进一步逼近人工标注效果。通过多次循环,逐渐提高模型的准确性。
操作步骤:
- 将新标注的数据与之前的数据合并,形成一个更大的数据集。
- 使用新的数据进行微调,评估模型效果,或者通过提示词优化Prompt。
Python 代码示例:
# 读取第一次和第二次标注的数据 df1 = pd.read_csv('data_labeled_1.csv') df2 = pd.read_csv('data_labeled_2.csv') # 合并数据集 combined_df = pd.concat([df1, df2]) # 将新的数据集用于再次微调模型 new_train_texts = combined_df['input_text'].tolist() new_train_labels = [0, 1, 0, 1, 2, 1] # 假设对应的标签已编码 new_train_encodings = tokenizer(new_train_texts, truncation=True, padding=True, max_length=128) new_train_dataset = CustomDataset(new_train_encodings, new_train_labels) # 再次微调模型 trainer.train(new_train_dataset)
总结:
通过上述过程,能够在LLM-in-the-loop数据构建过程中,逐步利用人工标注数据引导模型,通过不断的标注与微调循环,使模型逼近人工标注效果。