使用RAGatouille进行ColBERT模型基础训练与微调指南
项目概述
RAGatouille是一个专注于检索增强生成(RAG)的工具库,其中包含了对ColBERT模型训练和使用的完整支持。ColBERT是一种高效的神经检索模型,通过将查询和文档分别编码为细粒度的嵌入向量,然后计算它们的最大相似度来进行检索。
环境准备
在开始训练前,需要确保满足以下条件:
- GPU环境(目前不支持CPU/MPS训练)
- 非Windows 10系统(当前版本在Windows 10上训练功能不可用)
- 非Google Colab环境
初始化训练器
首先需要创建RAGTrainer
实例,这是训练过程的核心控制器:
from ragatouille import RAGTrainer
trainer = RAGTrainer(
model_name="GhibliColBERT", # 自定义模型名称
pretrained_model_name="colbert-ir/colbertv2.0", # 基础模型
language_code="en" # 语言代码
)
参数说明:
model_name
: 训练后模型的名称pretrained_model_name
: 可以是HuggingFace Hub上的模型名称或本地路径language_code
: 用于获取相关处理工具的两字母语言代码
数据准备
获取原始语料
对于本示例,我们使用公开百科内容作为训练语料:
import requests
def get_wikipedia_page(title):
URL = "https://en.wikipedia.org/w/api.php"
params = {
"action": "query",
"format": "json",
"titles": title,
"prop": "extracts",
"explaintext": True,
}
headers = {"User-Agent": "RAGatouille_tutorial/0.0.1"}
response = requests.get(URL, params=params, headers=headers)
data = response.json()
page = next(iter(data['query']['pages'].values()))
return page['extract'] if 'extract' in page else None
my_full_corpus = [
get_wikipedia_page("Hayao_Miyazaki"),
get_wikipedia_page("Studio_Ghibli"),
get_wikipedia_page("Toei_Animation")
]
语料处理
长文档需要分割成适合ColBERT处理的片段(通常256个token左右):
from ragatouille.data import CorpusProcessor, llama_index_sentence_splitter
corpus_processor = CorpusProcessor(document_splitter_fn=llama_index_sentence_splitter)
documents = corpus_processor.process_corpus(my_full_corpus, chunk_size=256)
创建训练数据
ColBERT需要训练三元组:查询、正例段落和负例段落。本示例中我们创建了一些模拟数据:
import random
queries = [
"What manga did Hayao Miyazaki write?",
"which film made ghibli famous internationally",
"who directed Spirited Away?",
"when was Hikotei Jidai published?",
"where's studio ghibli based?",
"where is the ghibli museum?"
] * 3
pairs = []
for query in queries:
fake_relevant_docs = random.sample(documents, 10)
for doc in fake_relevant_docs:
pairs.append((query, doc))
数据预处理
RAGatouille提供了自动化的数据预处理功能,包括硬负例挖掘:
trainer.prepare_training_data(
raw_data=pairs,
data_out_path="./data/",
all_documents=my_full_corpus,
num_new_negatives=10,
mine_hard_negatives=True
)
关键参数:
num_new_negatives
: 每个查询挖掘的负例数量(默认为10)mine_hard_negatives
: 是否进行硬负例挖掘(显著提升模型性能)
模型训练
准备好数据后,可以开始训练模型:
trainer.train(
batch_size=32,
nbits=4, # 索引压缩位数
maxsteps=500000, # 最大训练步数
use_ib_negatives=True, # 使用批次内负例计算损失
dim=128, # 嵌入维度
learning_rate=5e-6, # 学习率
doc_maxlen=256, # 文档最大长度
use_relu=False, # 是否使用ReLU
warmup_steps="auto" # 热身步数
)
训练参数说明:
learning_rate
: 对于BERT类模型,3e-6到3e-5之间效果最佳,5e-6通常是理想值doc_maxlen
: 由于ColBERT的工作方式,较小的片段(128-256)效果很好dim
: 嵌入维度,128是默认值且效果良好
训练结果
训练完成后,模型会保存在指定路径:
- 最终检查点:
.../checkpoints/colbert
- 中间检查点:
.../checkpoints/colbert-{N_STEPS}
训练好的模型可以直接使用本地路径加载,也可以上传到模型中心共享。
最佳实践建议
-
数据多样性:在语料中包含相关但不直接相关的文档(如示例中的Toei Animation内容),有助于模型学习更好的区分能力。
-
负例选择:硬负例挖掘虽然耗时,但对模型性能提升显著。在资源允许的情况下建议开启。
-
参数调整:
- 对于小规模数据集,可以适当减小
batch_size
- 训练早期可以监控损失曲线,调整学习率
doc_maxlen
可以根据实际文档长度调整
- 对于小规模数据集,可以适当减小
-
模型评估:训练完成后,建议在验证集上评估模型性能,检查检索质量。
通过本教程,您已经掌握了使用RAGatouille进行ColBERT模型训练和微调的基本流程。实际应用中,可以根据具体需求调整数据和参数,以获得最佳检索效果。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考