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

相关文章

C语言中联合体union的使用

本文编辑整理自: http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=179471 一、前言 “联合体”(union)与“结构体”(struct)有一些相似之处。但两者有本质上的不同。在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间, 一个联合变量

ESP32 esp-idf esp-adf环境安装及.a库创建与编译

简介 ESP32 功能丰富的 Wi-Fi & 蓝牙 MCU, 适用于多样的物联网应用。使用freertos操作系统。 ESP-IDF 官方物联网开发框架。 ESP-ADF 官方音频开发框架。 文档参照 https://espressif-docs.readthedocs-hosted.com/projects/esp-adf/zh-cn/latest/get-started/index

轻量级在线服装3D定制引擎Myway简介

我写的面向web元宇宙轻量级系列引擎中的另外一个,在线3D定制引擎Myway 3D。 用于在线商品定制,比如个性化服装的定制、日常用品(如杯子)、家装(被套)等物品的在线定制。 特性列表: 可更换衣服款式,按需定制更换模型可实时更改材质颜色可实时添加文本,并可实时修改大小、颜色和角度,支持自定义字体可实时添加艺术图标,并可实时修改大小、颜色和角度,支持翻转、各种对齐可更改衣服图案,按需求定制

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

揭秘未来艺术:AI绘画工具全面介绍

📑前言 随着科技的飞速发展,人工智能(AI)已经逐渐渗透到我们生活的方方面面。在艺术创作领域,AI技术同样展现出了其独特的魅力。今天,我们就来一起探索这个神秘而引人入胜的领域,深入了解AI绘画工具的奥秘及其为艺术创作带来的革命性变革。 一、AI绘画工具的崛起 1.1 颠覆传统绘画模式 在过去,绘画是艺术家们通过手中的画笔,蘸取颜料,在画布上自由挥洒的创造性过程。然而,随着AI绘画工

墨刀原型工具-小白入门篇

墨刀原型工具-小白入门篇 简介 随着互联网的发展和用户体验的重要性越来越受到重视,原型设计逐渐成为了产品设计中的重要环节。墨刀作为一款原型设计工具,以其简洁、易用的特点,受到了很多设计师的喜爱。本文将介绍墨刀原型工具的基本使用方法,以帮助小白快速上手。 第一章:认识墨刀原型工具 1.1 什么是墨刀原型工具 墨刀是一款基于Web的原型设计工具,可以帮助设计师快速创建交互原型,并且可以与团队

[word] word设置上标快捷键 #学习方法#其他#媒体

word设置上标快捷键 办公中,少不了使用word,这个是大家必备的软件,今天给大家分享word设置上标快捷键,希望在办公中能帮到您! 1、添加上标 在录入一些公式,或者是化学产品时,需要添加上标内容,按下快捷键Ctrl+shift++就能将需要的内容设置为上标符号。 word设置上标快捷键的方法就是以上内容了,需要的小伙伴都可以试一试呢!

Linux 安装、配置Tomcat 的HTTPS

Linux 安装 、配置Tomcat的HTTPS 安装Tomcat 这里选择的是 tomcat 10.X ,需要Java 11及更高版本 Binary Distributions ->Core->选择 tar.gz包 下载、上传到内网服务器 /opt 目录tar -xzf 解压将解压的根目录改名为 tomat-10 并移动到 /opt 下, 形成个人习惯的路径 /opt/tomcat-10

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,

RedHat运维-Linux文本操作基础-AWK进阶

你不用整理,跟着敲一遍,有个印象,然后把它保存到本地,以后要用再去看,如果有了新东西,你自个再添加。这是我参考牛客上的shell编程专项题,只不过换成了问答的方式而已。不用背,就算是我自己亲自敲,我现在好多也记不住。 1. 输出nowcoder.txt文件第5行的内容 2. 输出nowcoder.txt文件第6行的内容 3. 输出nowcoder.txt文件第7行的内容 4. 输出nowcode