FlagEmbedding项目微调模型评估指南

【免费下载链接】FlagEmbedding Dense Retrieval and Retrieval-augmented LLMs 【免费下载链接】FlagEmbedding 项目地址: https://gitcode.com/GitHub_Trending/fl/FlagEmbedding

前言

在自然语言处理领域,模型微调后的评估是确保模型性能提升的关键步骤。本文将详细介绍如何在FlagEmbedding项目中评估经过微调的文本嵌入模型。我们将从数据准备、搜索实现到最终评估指标解读,全面讲解评估流程。

环境准备

首先需要安装必要的Python库:

pip install -U datasets pytrec_eval FlagEmbedding

主要依赖库说明:

  • datasets: 用于加载和处理数据集
  • pytrec_eval: 用于信息检索任务评估
  • FlagEmbedding: 项目核心库,提供嵌入模型和评估工具

数据加载

评估的第一步是加载测试数据集,包括查询文本、语料库文本和相关度标注:

from datasets import load_dataset

# 加载查询数据
queries = load_dataset("json", data_files="ft_data/test_queries.jsonl")["train"]
# 加载语料库数据
corpus = load_dataset("json", data_files="ft_data/corpus.jsonl")["train"]
# 加载相关度标注
qrels = load_dataset("json", data_files="ft_data/test_qrels.jsonl")["train"]

# 提取文本内容
queries_text = queries["text"]
corpus_text = [text for sub in corpus["text"] for text in sub]

同时需要将相关度标注转换为字典格式,便于后续评估:

qrels_dict = {}
for line in qrels:
    if line['qid'] not in qrels_dict:
        qrels_dict[line['qid']] = {}
    qrels_dict[line['qid']][line['docid']] = line['relevance']

搜索功能实现

评估的核心是构建一个搜索函数,该函数能够:

  1. 将查询和文档编码为嵌入向量
  2. 使用Faiss建立高效索引
  3. 执行近似最近邻搜索
import faiss
import numpy as np
from tqdm import tqdm

def search(model, queries_text, corpus_text):
    # 编码查询和语料库
    queries_embeddings = model.encode_queries(queries_text)
    corpus_embeddings = model.encode_corpus(corpus_text)
    
    # 创建Faiss索引
    dim = corpus_embeddings.shape[-1]
    index = faiss.index_factory(dim, 'Flat', faiss.METRIC_INNER_PRODUCT)
    corpus_embeddings = corpus_embeddings.astype(np.float32)
    index.train(corpus_embeddings)
    index.add(corpus_embeddings)
    
    # 批量搜索
    query_size = len(queries_embeddings)
    all_scores = []
    all_indices = []

    for i in tqdm(range(0, query_size, 32), desc="Searching"):
        j = min(i + 32, query_size)
        query_embedding = queries_embeddings[i: j]
        score, indice = index.search(query_embedding.astype(np.float32), k=100)
        all_scores.append(score)
        all_indices.append(indice)

    # 合并结果
    all_scores = np.concatenate(all_scores, axis=0)
    all_indices = np.concatenate(all_indices, axis=0)
    
    # 格式化结果
    results = {}
    for idx, (scores, indices) in enumerate(zip(all_scores, all_indices)):
        results[queries["id"][idx]] = {}
        for score, index in zip(scores, indices):
            if index != -1:
                results[queries["id"][idx]][corpus["id"][index]] = float(score)
                
    return results

模型评估

评估指标说明

我们将使用以下指标评估模型性能:

  • NDCG@k: 归一化折损累积增益,考虑排序位置的相关性
  • MAP@k: 平均精度均值,衡量前k个结果的准确率
  • Recall@k: 召回率,衡量在前k个结果中找到相关文档的比例
  • P@k: 精确率,前k个结果中相关文档的比例
  • MRR@k: 平均倒数排名,第一个相关文档排名的倒数

原始模型评估

首先评估未经微调的原始模型性能:

from FlagEmbedding.abc.evaluation.utils import evaluate_metrics, evaluate_mrr
from FlagEmbedding import FlagModel

# 定义评估的k值
k_values = [10,100]

# 原始模型和微调模型路径
raw_name = "BAAI/bge-large-en-v1.5"
finetuned_path = "test_encoder_only_base_bge-large-en-v1.5"

# 加载原始模型
raw_model = FlagModel(
    raw_name, 
    query_instruction_for_retrieval="Represent this sentence for searching relevant passages:",
    devices=[0],
    use_fp16=False
)

# 执行搜索和评估
results = search(raw_model, queries_text, corpus_text)
eval_res = evaluate_metrics(qrels_dict, results, k_values)
mrr = evaluate_mrr(qrels_dict, results, k_values)

# 打印评估结果
for res in eval_res:
    print(res)
print(mrr)

微调后模型评估

接下来评估经过微调的模型性能:

# 加载微调后的模型
ft_model = FlagModel(
    finetuned_path, 
    query_instruction_for_retrieval="Represent this sentence for searching relevant passages:",
    devices=[0],
    use_fp16=False
)

# 执行搜索和评估
results = search(ft_model, queries_text, corpus_text)
eval_res = evaluate_metrics(qrels_dict, results, k_values)
mrr = evaluate_mrr(qrels_dict, results, k_values)

# 打印评估结果
for res in eval_res:
    print(res)
print(mrr)

结果对比分析

通过对比原始模型和微调后模型的评估结果,我们可以观察到:

  1. NDCG@10从0.704提升到0.844,说明排序质量显著提高
  2. MAP@10从0.666提升到0.816,表明平均精度有大幅改善
  3. Recall@10从0.823提升到0.931,表示在前10个结果中找到相关文档的能力增强
  4. MRR@10从0.666提升到0.816,反映第一个相关文档的平均排名更靠前

这些指标的综合提升表明微调过程有效地优化了模型在特定任务上的表现。

最佳实践建议

  1. 批量大小选择:根据GPU内存调整批量大小,32是一个合理的起始值
  2. 评估指标选择:根据业务需求选择合适的评估指标组合
  3. Faiss索引优化:对于大规模语料库,可以考虑使用更高效的索引类型
  4. 混合精度训练:在支持的情况下启用use_fp16可以加速推理过程

通过本教程,您应该已经掌握了在FlagEmbedding项目中评估微调模型的方法,能够全面衡量模型性能的提升效果。

【免费下载链接】FlagEmbedding Dense Retrieval and Retrieval-augmented LLMs 【免费下载链接】FlagEmbedding 项目地址: https://gitcode.com/GitHub_Trending/fl/FlagEmbedding

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐