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

相关文章

Mybatis官方生成器的使用方式

《Mybatis官方生成器的使用方式》本文详细介绍了MyBatisGenerator(MBG)的使用方法,通过实际代码示例展示了如何配置Maven插件来自动化生成MyBatis项目所需的实体类、Map... 目录1. MyBATis Generator 简介2. MyBatis Generator 的功能3

Python中使用defaultdict和Counter的方法

《Python中使用defaultdict和Counter的方法》本文深入探讨了Python中的两个强大工具——defaultdict和Counter,并详细介绍了它们的工作原理、应用场景以及在实际编... 目录引言defaultdict的深入应用什么是defaultdictdefaultdict的工作原理

使用Python进行文件读写操作的基本方法

《使用Python进行文件读写操作的基本方法》今天的内容来介绍Python中进行文件读写操作的方法,这在学习Python时是必不可少的技术点,希望可以帮助到正在学习python的小伙伴,以下是Pyth... 目录一、文件读取:二、文件写入:三、文件追加:四、文件读写的二进制模式:五、使用 json 模块读写

Python使用qrcode库实现生成二维码的操作指南

《Python使用qrcode库实现生成二维码的操作指南》二维码是一种广泛使用的二维条码,因其高效的数据存储能力和易于扫描的特点,广泛应用于支付、身份验证、营销推广等领域,Pythonqrcode库是... 目录一、安装 python qrcode 库二、基本使用方法1. 生成简单二维码2. 生成带 Log

Python如何使用seleniumwire接管Chrome查看控制台中参数

《Python如何使用seleniumwire接管Chrome查看控制台中参数》文章介绍了如何使用Python的seleniumwire库来接管Chrome浏览器,并通过控制台查看接口参数,本文给大家... 1、cmd打开控制台,启动谷歌并制定端口号,找不到文件的加环境变量chrome.exe --rem

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

龙蜥操作系统Anolis OS-23.x安装配置图解教程(保姆级)

《龙蜥操作系统AnolisOS-23.x安装配置图解教程(保姆级)》:本文主要介绍了安装和配置AnolisOS23.2系统,包括分区、软件选择、设置root密码、网络配置、主机名设置和禁用SELinux的步骤,详细内容请阅读本文,希望能对你有所帮助... ‌AnolisOS‌是由阿里云推出的开源操作系统,旨

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

基于C#实现PDF文件合并工具

《基于C#实现PDF文件合并工具》这篇文章主要为大家详细介绍了如何基于C#实现一个简单的PDF文件合并工具,文中的示例代码简洁易懂,有需要的小伙伴可以跟随小编一起学习一下... 界面主要用于发票PDF文件的合并。经常出差要报销的很有用。代码using System;using System.Col