qidao123.com技术社区-IT企服评测·应用市场

标题: LLM2Vec介绍和将Llama 3转换为嵌入模型代码示例 [打印本页]

作者: 农妇山泉一亩田    时间: 2024-9-7 11:22
标题: LLM2Vec介绍和将Llama 3转换为嵌入模型代码示例
嵌入模型是大型语言模型检索增强天生(RAG)的关键构成部分。它们对知识库和用户编写的查询举行编码。
利用与LLM类似领域的练习或微调的嵌入模型可以显著改进RAG系统。然而,寻找或练习如许的嵌入模型往往是一项困难的使命,因为领域内的数据通常是稀缺的。
但是这篇论文LLM2Vec,可以将任何的LLM转换为文本嵌入模型,如许我们就可以直接利用现有的大语言模型的信息举行RAG了。

嵌入模型和天生模型

嵌入模型主要用于将文本数据转换为数值情势的向量表示,这些向量能够捕捉单词、短语或整个文档的语义信息。这些向量表示也被称为嵌入(embeddings),可以用于各种下游使命,如文天职类、搜索、相似度盘算等。
最著名的嵌入模型就是BERT是一个典型的encoder-only模型
天生模型则设计用来基于练习数据天生新的数据实例。在NLP中,这通常意味着天生文本。这类模型能够学习到数据的分布,并能创造出符合这一分布的新实例,如新的句子或文档。
如GPT系列,通常是decoder-only模型。

这两种架构在设计和应用上有所不同:
在论文中对encoder-only和decoder-only模型的特点举行了讨论,特别是在表明为什么将decoder-only的大型语言模型(LLM)转换为有效的文本编码器时。论文指出了几个关键点:
这表明,只管decoder-only和encoder-only模型在设计和功能上有本质的不同,但通过创新的方法可以扩展或改变这些模型的本事,使它们适应更广泛的应用场景。
实在我们可以将这篇论文的重点简朴的明确为,怎样将一个decoder-only的模型快速并且无损的转换成一个encoder-only模型。
LLM2Vec

在论文中提出了一种名为LLM2Vec的方法,用于将仅解码器的大型语言模型(LLM)转换为强盛的文本编码器。这种方法包罗三个简朴的步骤:1)启用双向注意力;2)蒙版下一个标记预测;3)无监视对比学习。这种转换不需要标记数据,且在数据和参数上都非常高效。

具体来说,研究中首先办理了LLM在文本嵌入使命中由于其因果关注机制而受限的问题,该机制仅允许标记与其前面的标记交互。通过启用双向注意力,每个标记能够访问序列中的全部其他标记,从而转换为双向LLM。然后,通过蒙版下一个标记预测(MNTP),调整模型以利用其双向注意力。末了,应用无监视对比学习以改进序列表示。
这些步骤的组合不但在单词级使命上提升了模型的性能,还在大规模文本嵌入基准(MTEB)上到达了新的无监视性能水平。此外,当将LLM2Vec与监视对比学习相结合时,还在仅利用公开可用数据的模型中实现了最先进的性能。这表明,通过这种简朴且有效的方法,原本仅用于天生使命的解码器模型也能被转化为通用的文本编码器,从而在多种NLP使命中表现精彩。

方法详解

论文中描述的LLM2Vec方法在代码层面主要涉及以下几个关键的修改,以将decoder-only模型转换为能够天生丰富文本编码的模型:
这些代码修改主要集中在模型的预练习和微调阶段,旨在不但使模型能够处理更丰富的上下文信息,还进步了模型在不同NLP使命中的通用性和有效性,也就是说我们终极还是需要举行微调练习的,所以下面我们就要展示一些代码来看看怎样举行这部分的微调练习。
利用LLM2Vec将Llama 3转化为文本嵌入模型

首先我们安装依赖
  1. pip install llm2vec
  2. pip install flash-attn --no-build-isolation
复制代码
我们这里演示利用单卡的4090,对于现有模型,我们直接加载现有的模型:
  1. import torch
  2. from llm2vec import LLM2Vec
  3. l2v = LLM2Vec.from_pretrained(
  4.      "meta-llama/Meta-Llama-3-8B",
  5.      device_map="cuda" if torch.cuda.is_available() else "cpu",
  6.      torch_dtype=torch.bfloat16,
  7. )
  8. l2v.save("Llama-3-8B-Emb")
复制代码
“torch_dtype=torch.bfloat16”是能够在24 GB GPU上运行转换所必需的设置。如果不设置它,模型将是float32参数的原始大小,内存是不够的。
这时,实在这个模型已经可以利用了。但是如果其插入到RAG中。它的性能是不如标准嵌入模型,因为他的运行方式还是因果推断,而不是我们的嵌入。
所以下一步,就需要用MNTP的目标来练习羊驼他。论文的作者还提供了一个脚本:
experiments/run_mntp.py
它现在支持Llama和Mistral架构的模型,所以我们直接可以拿来利用
  1. git clone https://github.com/McGill-NLP/llm2vec.git
复制代码
这个脚本需要一个参数,它是JSON格式的设置文件。他们在这里提出了几个例子:
train_configs / mntp
对于Llama 3 8b,设置可以是如许的:
  1. JSON_CONFIG='''
  2. {
  3.      "model_name_or_path": "meta-llama/Meta-Llama-3-8B",
  4.      "dataset_name": "wikitext",
  5.      "dataset_config_name": "wikitext-103-raw-v1",
  6.      "per_device_train_batch_size": 1,
  7.      "per_device_eval_batch_size": 1,
  8.      "gradient_accumulation_steps": 16,
  9.      "do_train": true,
  10.      "do_eval": true,
  11.      "max_seq_length": 512,
  12.      "mask_token_type": "blank",
  13.      "data_collator_type": "all_mask",
  14.      "mlm_probability": 0.8,
  15.      "overwrite_output_dir": true,
  16.      "output_dir": "Llama-3-8B-llm2vec-MNTP-Emb",
  17.      "evaluation_strategy": "steps",
  18.      "eval_steps": 100,
  19.      "save_steps": 200,
  20.      "stop_after_n_steps": 1000,
  21.      "lora_r": 16,
  22.      "gradient_checkpointing": true,
  23.      "torch_dtype": "bfloat16",
  24.      "attn_implementation": "flash_attention_2"
  25. }
  26. '''
  27. with open("mntp_config.json", 'w') as f:
  28.    f.write(JSON_CONFIG)
复制代码
该脚本利用bfloat16参数加载模型。将每个装备的批处理大小设置为1,如许可以得当24 GB的GPU。
然后可以开始MNTP练习:
  1. python llm2vec/experiments/run_mntp.py mntp_config.json
复制代码
利用24gb的4090,大概Google Colab的L4,这需要4天的时间。但是经过MNTP练习后,模型应该会产生更好的结果,特别是对于检索使命。
论文中提到的末了一步是SimCSE,但是作者还没有发布他们的代码,但提到他们会发布的。所以我们直接可以那这个模型来举行测试
利用Llama 3文本嵌入模型

对于练习完成的模型,我们可以直接利用SentenceTransformer加载
  1. from sentence_transformers import SentenceTransformer
  2. model = SentenceTransformer("Llama-3-8B-llm2vec-Emb")
复制代码
利用LlamaIndex的话可以直接设置
  1. Settings.embed_model = HuggingFaceEmbedding(model_name="Llama-3-8B-llm2vec-Emb", device='cpu')
复制代码
这里设置device= ’ cpu '利用cpu加载,这会使RAG系统变慢。可以删除此参数以在GPU上运行它。但是模型是以全精度加载的,所以我们将其加载到CPU上举行测试。因为llm2vec是刚刚发布的,所以还没有任何的量化教程,希望后续会有发布,如许就可以在我们的GPU上完全的利用了。
总结

通过LLM2Vec,我们可以利用LLM作为文本嵌入模型。但是简朴地从llm中提取的嵌入模型往往表现不如常规嵌入模型。LLM2Vec的作者提出了新的练习目标MNTP和SimCSE来练习从llm中提取的嵌入模型。这种练习成本很高,但根据作者的说法,可以产生更好的嵌入模型。
论文所在:
https://avoid.overfit.cn/post/67a62b9532b247cc9db87663ce547ff2

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4