LLMs之Embedding:FlagEmbedding(一款用于微调/评估文本嵌入模型的工具)的简介、安装和使用方法、案例应用之详细攻略

本文主要是介绍LLMs之Embedding:FlagEmbedding(一款用于微调/评估文本嵌入模型的工具)的简介、安装和使用方法、案例应用之详细攻略,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

LLMs之Embedding:FlagEmbedding(一款用于微调/评估文本嵌入模型的工具)的简介、安装和使用方法、案例应用之详细攻略

目录

FlagEmbedding的简介

1、该项目采用的原理主要包括:

FlagEmbedding的安装和使用方法

1、安装

T1、使用pip

T2、从源代码安装

T3、对于开发环境,请以可编辑模式安装:

2、使用方法

(1)、数据准备—JSON格式的有监督性数据:通过给定的JSON格式文件,包含了查询文本、正例文本和负例文本,准备用于微调的训练数据。

(2)、硬负样本挖掘—提高句子嵌入质量:为了提高嵌入模型的质量,可以使用硬负样本挖掘的方法,从相关文档中挖掘出最难的负样本,用于微调。

(3)、模型微调—使用torchrun命令进行多GPU训练+deepspeed:通过微调预训练的嵌入模型,根据提供的任务数据对模型进行调整,以提升模型在特定任务上的性能。

(4)、模型合并(可选):可以使用LM-Cocktail工具合并微调后的模型和基础模型,以提高在目标任务上的性能,并保持在其他任务上的性能。

(5)、模型加载:提供了加载微调后的模型的方法,以便在其他环境中使用微调后的模型。

(6)、模型评估:提供了一个简单的脚本,用于评估模型在特定任务上的性能,包括计算召回率(Recall)和平均倒排列表(MRR)等指标。

MSMARCO数据集

您的数据集

FlagEmbedding的案例应用


FlagEmbedding的简介

FlagEmbedding是一个用于微调文本嵌入模型的工具,旨在通过利用特定任务的数据,提升预训练的文本嵌入模型在该任务上的性能。在这个示例中,我们展示了如何使用您的数据微调baai-general-embedding。

地址:https://github.com/FlagOpen/FlagEmbedding/tree/master/examples/finetune

1、该项目采用的原理主要包括:

  • 预训练的文本嵌入模型:使用预训练的文本嵌入模型作为基础模型,如BERT、RoBERTa等,这些模型通过大规模语料库的预训练学习到了丰富的语义信息。

  • 微调技术:通过微调技术,将预训练的文本嵌入模型在特定任务上进行调整,以适应任务的特定需求,提高模型在该任务上的性能。

  • 硬负样本挖掘:通过挖掘与查询相关但不包含在正例集合中的难以处理的负例样本,可以提高模型对负例样本的处理能力。

  • LM-Cocktail:LM-Cocktail是一种模型合并技术,可以将微调后的模型与基础模型进行合并,以提高在目标任务上的性能,并保持在其他任务上的性能。

FlagEmbedding的安装和使用方法

1、安装

T1、使用pip

pip install -U FlagEmbedding

T2、从源代码安装

git clone https://github.com/FlagOpen/FlagEmbedding.gitcd FlagEmbeddingpip install .

T3、对于开发环境,请以可编辑模式安装:

pip install -e .

2、使用方法

(1)、数据准备—JSON格式的有监督性数据:通过给定的JSON格式文件,包含了查询文本、正例文本和负例文本,准备用于微调的训练数据。

数据格式

训练数据应为一个json文件,每行是一个如下所示的字典:

{"query": str, "pos": List[str], "neg": List[str]}

query是查询,pos是正文本的列表,neg是负文本的列表。如果某个查询没有负文本,可以从整个语料库中随机抽取一些作为负文本。请参阅toy_finetune_data.jsonl文件以获取示例数据文件。

(2)、硬负样本挖掘—提高句子嵌入质量:为了提高嵌入模型的质量,可以使用硬负样本挖掘的方法,从相关文档中挖掘出最难的负样本,用于微调。

硬负样本是一种广泛使用的方法,可以提高句子嵌入的质量。您可以按照以下命令挖掘硬负样本:

python -m FlagEmbedding.baai_general_embedding.finetune.hn_mine \
--model_name_or_path BAAI/bge-base-en-v1.5 \
--input_file toy_finetune_data.jsonl \
--output_file toy_finetune_data_minedHN.jsonl \
--range_for_sampling 2-200 \
--negative_number 15 \
--use_gpu_for_searching
  • input_file:微调用的json数据。此脚本将为每个查询检索前k个文档,并从前k个文档中随机抽取负样本(不包括正样本)。
  • output_file:保存带有挖掘的硬负样本的json数据的路径。
  • negative_number:抽取的负样本数量。
  • range_for_sampling:采样负样本的范围。例如,2-100表示从前2-前200个文档中抽取negative_number个负样本。可以设置更大的值以降低负样本的难度(例如,将其设置为60-300以从前60-300段中采样负样本)。
  • candidate_pool:检索池。默认值为None,此脚本将从input_file中所有的neg组合中进行检索。如果提供candidate_pool文件,此脚本将从该文件中检索负样本。格式与预训练数据相同。
  • use_gpu_for_searching:是否使用faiss-gpu检索负样本。

(3)、模型微调—使用torchrun命令进行多GPU训练+deepspeed:通过微调预训练的嵌入模型,根据提供的任务数据对模型进行调整,以提升模型在特定任务上的性能。

torchrun --nproc_per_node {number of gpus} \
-m FlagEmbedding.baai_general_embedding.finetune.run \
--output_dir {path to save model} \
--model_name_or_path BAAI/bge-large-zh-v1.5 \
--train_data ./toy_finetune_data.jsonl \
--learning_rate 1e-5 \
--fp16 \
--num_train_epochs 5 \
--per_device_train_batch_size {large batch size; set 1 for toy data} \
--dataloader_drop_last True \
--normlized True \
--temperature 0.02 \
--query_max_len 64 \
--passage_max_len 256 \
--train_group_size 2 \
--negatives_cross_device \
--logging_steps 10 \
--save_steps 1000 \
--query_instruction_for_retrieval ""

一些重要参数:

  • per_device_train_batch_size:训练时的批量大小。在大多数情况下,较大的批量大小会带来更强的性能。可以通过启用--fp16、--deepspeed ./df_config.json(df_config.json可以参考ds_config.json)、--gradient_checkpointing等来扩展批量大小。
  • train_group_size:训练时每个查询的正负样本数量。始终有一个正样本,因此此参数将控制负样本的数量(#negatives=train_group_size-1)。注意,负样本数量不应大于数据中的负样本数量"neg": List[str]。除了此组中的负样本,批内负样本也将用于微调。
  • negatives_cross_device:在所有GPU之间共享负样本。此参数将扩展负样本的数量。
  • learning_rate:为您的模型选择一个合适的学习率。建议大规模/基础/小规模模型分别使用1e-5/2e-5/3e-5。
  • temperature:它会影响相似度分数的分布。推荐值:0.01-0.1。
  • query_max_len:查询的最大长度。请根据数据中查询的平均长度进行设置。
  • passage_max_len:段落的最大长度。请根据数据中段落的平均长度进行设置。
  • query_instruction_for_retrieval:查询的指令,将添加到每个查询中。也可以设置为空字符串"",不对查询添加任何内容。
  • use_inbatch_neg:使用同一批次中的段落作为负样本。默认值为True。
  • save_steps:设置每隔多少训练步骤保存一次检查点。

更多训练参数请参阅transformers.TrainingArguments。

(4)、模型合并(可选):可以使用LM-Cocktail工具合并微调后的模型和基础模型,以提高在目标任务上的性能,并保持在其他任务上的性能。

微调基础bge模型可以提高其在目标任务上的性能,但可能会导致模型在目标领域之外的常规能力严重退化(例如,在c-mteb任务上的性能下降)。通过合并微调模型和基础模型,LM-Cocktail可以显著提高下游任务的性能,同时保持在其他不相关任务中的性能。

from LM_Cocktail import mix_models, mix_models_with_data# 合并微调模型和基础模型;然后保存到输出路径:./mixed_model_1
model = mix_models(model_names_or_paths=["BAAI/bge-large-en-v1.5", "your_fine-tuned_model"], model_type='encoder', weights=[0.5, 0.5],  # 可以更改权重以获得更好的权衡。output_path='./mixed_model_1')

如果您有一个新任务,并且没有可用于微调的数据或资源,可以尝试使用LM-Cocktail合并现有模型(来自开源社区或您在其他任务上微调的模型)以生成任务特定模型。这样,您只需要构建一些示例数据,而不需要微调基础模型。例如,可以使用任务的示例数据合并来自huggingface的模型:

from LM_Cocktail import mix_models, mix_models_with_dataexample_data = [{"query": "How does one become an actor in the Telugu Film Industry?", "pos": [" How do I become an actor in Telugu film industry?"], "neg": [" What is the story of Moses and Ramesses?", " Does caste system affect economic growth of India?"]}, {"query": "Why do some computer programmers develop amazing software or new concepts, while some are stuck with basic programming work?", "pos": [" Why do some computer programmers develops amazing softwares or new concepts, while some are stuck with basics programming works?"], "neg": [" When visiting a friend, do you ever think about what would happen if you did something wildly inappropriate like punch them or destroy their furniture?", " What is the difference between a compliment and flirting?"]}
]model = mix_models_with_data(model_names_or_paths=["BAAI/bge-base-en-v1.5", "Shitao/bge-hotpotqa", "Shitao/bge-quora"], model_type='encoder', example_data=example_data,temperature=5.0,max_input_length=512,neg_number=2)

由于此仓库中仅有9个bge-*模型,如果您的任务与这9个微调任务不同,性能可能不令人满意。您可以在更多任务上微调基础模型并合并它们,以在您的任务上取得更好的性能。

(5)、模型加载:提供了加载微调后的模型的方法,以便在其他环境中使用微调后的模型。

加载您的模型,微调BGE模型后,您可以像这里一样轻松加载它。请将query_instruction_for_retrieval替换为您的指令(如果在微调时为超参数--query_instruction_for_retrieval设置了不同的值)。

(6)、模型评估:提供了一个简单的脚本,用于评估模型在特定任务上的性能,包括计算召回率(Recall)和平均倒排列表(MRR)等指标。

我们提供了一个简单的脚本来评估模型的性能。脚本的工作简要说明:

  • 通过DataParallel在所有可用的GPU上加载模型。
  • 编码语料库并将嵌入卸载到faiss Flat索引中。默认情况下,faiss还会将索引转储到所有可用的GPU上。
  • 编码查询并为每个查询搜索100个最近邻。
  • 计算Recall和MRR指标。

首先,安装faiss,这是一个流行的近似最近邻搜索库:

conda install -c conda-forge faiss-gpu

MSMARCO数据集

默认评估数据是MSMARCO,这是一个广泛使用的检索基准。您可以检查msmarco语料库和评估查询的数据格式。运行以下命令:

python -m FlagEmbedding.baai_general_embedding.finetune.eval_msmarco \
--encoder BAAI/bge-base-en-v1.5 \
--fp16 \
--add_instruction \
--k 100

一些重要参数:

  • encoder:指定编码器模型,可以是huggingface上的模型或本地模型。
  • fp16:使用半精度进行推理。
  • add_instruction:添加检索指令(例如:Represent this sentence for searching relevant passages:)。
  • k:指定要为每个查询检索的最近邻数量。
{'MRR@1': 0.2330945558739255, 'MRR@10': 0.35786976395142633, 'MRR@100': 0.3692618036917553, 'Recall@1': 0.22606255969436478, 'Recall@10': 0.6412965616045848, 'Recall@100': 0.9012774594078318
}

您的数据集

您应准备两个jsonl格式的文件:

一个是corpus_data,包含您要搜索的文本。一个示例:
{"content": "A is ..."}
{"content": "B is ..."}
{"content": "C is ..."}
{"content": "Panda is ..."}
{"content": "... is A"}另一个是query_data,包含查询和实际答案。一个示例:
{"query": "What is A?", "positive": ["A is ...", "... is A"]}
{"query": "What is B?", "positive": ["B is ..."]}
{"query": "What is C?", "positive": ["C is ..."]}然后,将数据路径传递给评估脚本:
python -m FlagEmbedding.baai_general_embedding.finetune.eval_msmarco \
--encoder BAAI/bge-base-en-v1.5 \
--fp16 \
--add_instruction \
--k 100 \
--corpus_data ./toy_evaluation_data/toy_corpus.json \
--query_data ./toy_evaluation_data/toy_query.json

FlagEmbedding的案例应用

持续更新中……

这篇关于LLMs之Embedding:FlagEmbedding(一款用于微调/评估文本嵌入模型的工具)的简介、安装和使用方法、案例应用之详细攻略的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1026649

相关文章

CSS3 布局样式及其应用举例

《CSS3布局样式及其应用举例》CSS3的布局特性为前端开发者提供了无限可能,无论是Flexbox的一维布局还是Grid的二维布局,它们都能够帮助开发者以更清晰、简洁的方式实现复杂的网页布局,本文给... 目录深入探讨 css3 布局样式及其应用引言一、CSS布局的历史与发展1.1 早期布局的局限性1.2

使用animation.css库快速实现CSS3旋转动画效果

《使用animation.css库快速实现CSS3旋转动画效果》随着Web技术的不断发展,动画效果已经成为了网页设计中不可或缺的一部分,本文将深入探讨animation.css的工作原理,如何使用以及... 目录1. css3动画技术简介2. animation.css库介绍2.1 animation.cs

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Python文件操作与IO流的使用方式

《Python文件操作与IO流的使用方式》:本文主要介绍Python文件操作与IO流的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、python文件操作基础1. 打开文件2. 关闭文件二、文件读写操作1.www.chinasem.cn 读取文件2. 写

PyQt6中QMainWindow组件的使用详解

《PyQt6中QMainWindow组件的使用详解》QMainWindow是PyQt6中用于构建桌面应用程序的基础组件,本文主要介绍了PyQt6中QMainWindow组件的使用,具有一定的参考价值,... 目录1. QMainWindow 组php件概述2. 使用 QMainWindow3. QMainW

使用Python自动化生成PPT并结合LLM生成内容的代码解析

《使用Python自动化生成PPT并结合LLM生成内容的代码解析》PowerPoint是常用的文档工具,但手动设计和排版耗时耗力,本文将展示如何通过Python自动化提取PPT样式并生成新PPT,同时... 目录核心代码解析1. 提取 PPT 样式到 jsON关键步骤:代码片段:2. 应用 JSON 样式到

java变量内存中存储的使用方式

《java变量内存中存储的使用方式》:本文主要介绍java变量内存中存储的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍2、变量的定义3、 变量的类型4、 变量的作用域5、 内存中的存储方式总结1、介绍在 Java 中,变量是用于存储程序中数据

关于Mybatis和JDBC的使用及区别

《关于Mybatis和JDBC的使用及区别》:本文主要介绍关于Mybatis和JDBC的使用及区别,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、JDBC1.1、流程1.2、优缺点2、MyBATis2.1、执行流程2.2、使用2.3、实现方式1、XML配置文件

macOS Sequoia 15.5 发布: 改进邮件和屏幕使用时间功能

《macOSSequoia15.5发布:改进邮件和屏幕使用时间功能》经过常规Beta测试后,新的macOSSequoia15.5现已公开发布,但重要的新功能将被保留到WWDC和... MACOS Sequoia 15.5 正式发布!本次更新为 Mac 用户带来了一系列功能强化、错误修复和安全性提升,进一步增

ubuntu20.0.4系统中安装Anaconda的超详细图文教程

《ubuntu20.0.4系统中安装Anaconda的超详细图文教程》:本文主要介绍了在Ubuntu系统中如何下载和安装Anaconda,提供了两种方法,详细内容请阅读本文,希望能对你有所帮助... 本文介绍了在Ubuntu系统中如何下载和安装Anaconda。提供了两种方法,包括通过网页手动下载和使用wg