AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


深入RAG优化:BGE词嵌入全解析与Landmark Embedding新突破
发布日期:2024-08-12 08:23:44 浏览次数: 2202 来源:AI技术研习社



一、Embedding选型建议与结果

选型建议:

  1. 大部分模型的序列长度是 512 tokens。8192 可尝试 tao-8k,1024 可尝试 stella。

  2. 在专业数据领域上,嵌入模型的表现不如 BM25,但是微调可以大大提升效果。

  3. 有微调需求且对模型训练了解较少的,建议选择 bge 系列(完善的训练脚本、负例挖掘等)。但多数模型都基于BERT,训练脚本也通用,其他模型也可以参考。

  4. 重排模型选择很少,推荐使用 bge-reranker,也支持微调。reranker 模型因为单次输入较多,只能通过 GPU 部署。


选型结果:

1. PEG

作者:腾讯
模型地址:https://huggingface.co/TownsWu/PEG
论文:https://arxiv.org/pdf/2311.11691.pdf

重点优化检索能力。

2. GTE 系列

作者:阿里巴巴
模型地址:https://huggingface.co/thenlper/gte-large-zh
论文:https://arxiv.org/abs/2308.03281

3. picolo 系列

作者:商汤
地址:https://huggingface.co/sensenova/piccolo-large-zh

有一些微调的小tips

4. stella 系列

地址:https://huggingface.co/infgrad/stella-large-zh-v2
博客文章:https://zhuanlan.zhihu.com/p/655322183

基于piccolo 模型fine-tuning,支持1024 序列长度。博客文章记录了一些训练思路。

5. BGE 系列

作者:智源研究院
地址:https://huggingface.co/BAAI/bge-large-zh-v1.5
论文:https://arxiv.org/pdf/2309.07597.pdf
Github:https://github.com/FlagOpen/FlagEmbedding

开放信息最多的模型,也提供了fine-tuning 示例代码。同时也是 C-MTEB 榜单的维护者。

6. m3e 系列

作者:MokaAI
地址:https://huggingface.co/moka-ai/m3e-large
Github:https://github.com/wangyuxinwhy/uniem

研究的比较早,算是中文通用 Embedding 模型、数据集以及评测比较早的开拓者。

7. multilingual-e5-large

地址:https://huggingface.co/intfloat/multilingual-e5-large
论文:https://arxiv.org/pdf/2212.03533.pdf

多语言支持。

8. tao-8k

地址:https://huggingface.co/amu/tao-8k

支持8192 序列长度,但是信息很少。

二、BGE介绍

在大模型时代,它更是用于解决幻觉问题、知识时效问题、超长文本问题等各种大模型本身制约或不足的必要技术。然而,当前中文世界的高质量语义向量模型仍比较稀缺,且很少开源。

为加快解决大模型的制约问题,近日,智源发布最强开源可商用中英文语义向量模型BGE(BAAI General  Embedding),在中英文语义检索精度与整体语义表征能力均超越了社区所有同类模型,如OpenAI 的text embedding 002等。此外,BGE 保持了同等参数量级模型中的最小向量维度,使用成本更低。

论文:C-Pack: Packed Resources For General Chinese Embeddings

论文推出了一个中文的嵌入资源包c-pack。其中包括了:

1. C-MTP,一个大型的文本嵌入训练集,包括了大量的非监督语料库和高质量标注的有监督语料库。

2. C-MTEB,一个涵盖6个任务和35个数据的中文文本嵌入基准。

3. BGE,多尺寸的文本嵌入模型。

三、如何使用BGE的模型?

这里展示了一些通过 FlagEmbedding, Sentence-Transformers, Langchain, or Huggingface Transformers. 使用bge模型的方法。

1. 使用FlagEmbedding

pip install -U FlagEmbedding
from FlagEmbedding import FlagModelsentences = ["样例数据-1", "样例数据-2"]model = FlagModel('BAAI/bge-large-zh', query_instruction_for_retrieval="为这个句子生成表示以用于检索相关文章:")embeddings_1 = model.encode(sentences)embeddings_2 = model.encode(sentences)similarity = embeddings_1 @ embeddings_2.Tprint(similarity)
# 对于短查询到长文档的检索任务,请对查询使用 encode_queries() 函数,其会自动为每个查询加上指令# 由于候选文本不需要添加指令,检索中的候选集依然使用 encode() 或 encode_corpus() 函数queries = ['query_1', 'query_2']passages = ["样例文档-1", "样例文档-2"]q_embeddings = model.encode_queries(queries)p_embeddings = model.encode(passages)scores = q_embeddings @ p_embeddings.T

2. 使用Sentence-Transformers

pip install -U sentence-transformers
from sentence_transformers import SentenceTransformersentences = ["样例数据-1", "样例数据-2"]model = SentenceTransformer('BAAI/bge-large-zh')embeddings_1 = model.encode(sentences, normalize_embeddings=True)embeddings_2 = model.encode(sentences, normalize_embeddings=True)similarity = embeddings_1 @ embeddings_2.Tprint(similarity)
queries = ['query_1', 'query_2']passages = ["样例文档-1", "样例文档-2"]instruction = "为这个句子生成表示以用于检索相关文章:"model = SentenceTransformer('BAAI/bge-large-zh')q_embeddings = model.encode([instruction+q for q in queries], normalize_embeddings=True)p_embeddings = model.encode(passages, normalize_embeddings=True)scores = q_embeddings @ p_embeddings.T

3. 使用LangChain

from langchain.embeddings import HuggingFaceBgeEmbeddingsmodel_name = "BAAI/bge-small-en"model_kwargs = {'device': 'cpu'}encode_kwargs = {'normalize_embeddings': True} # set True to compute cosine similaritymodel = HuggingFaceBgeEmbeddings(model_name=model_name,model_kwargs=model_kwargs,encode_kwargs=encode_kwargs)

4. 使用HuggingFace Transformers

from transformers import AutoTokenizer, AutoModelimport torch# Sentences we want sentence embeddings forsentences = ["样例数据-1", "样例数据-2"]
# Load model from HuggingFace Hubtokenizer = AutoTokenizer.from_pretrained('BAAI/bge-large-zh')model = AutoModel.from_pretrained('BAAI/bge-large-zh')
# Tokenize sentencesencoded_input = tokenizer(sentences, padding=True, truncation=True, return_tensors='pt')# 对于短查询到长文档的检索任务, 为查询加上指令# encoded_input = tokenizer([instruction + q for q in queries], padding=True, truncation=True, return_tensors='pt')
# Compute embeddingswith torch.no_grad():model_output = model(**encoded_input)# Perform pooling. In this case, cls pooling.sentence_embeddings = model_output[0][:, 0]# normalize embeddingssentence_embeddings = torch.nn.functional.normalize(sentence_embeddings, p=2, dim=1)print("Sentence embeddings:", sentence_embeddings)

四、BGE Landmark Embedding是什么?


大语言模型(LLM)在面对许多应用时需要能够处理长序列输入,检索增强是处理长上下文语言建模的一种非常有效的方法。然而,现有的检索方法通常与分块的上下文一起工作,这容易导致语义表示质量低下和有用信息检索不完整。

今年2月发表的《BGE Landmark Embedding: A Chunking-Free Embedding Method For Retrieval Augmented Long-Context Large Language Models》这篇论文,阐述了一种利用长上下文解决信息不完整检索的方法,通过引入Chunking-Free的检索方法,能够更好地保证上下文的连贯性,并通过在训练时引入位置感知函数来更好感知连续信息段中最后一个句子,保证嵌入依然具备与Sentence Embedding相近的细节,大幅提升了长上下文检索增强的性能。

BGE Landmark Embedding这篇论文要解决的技术问题,更具体的说,在RAG技术中,分块是个麻烦的问题,通常通过经验或启发式方法来解决。但是无论如何,分块打破上下文的连贯性,对嵌入不利,另一方面,连续的信息可能划分到不同的块中,显著的块可以很容易地被检索到,其他有用但不那么显著的块可能被忽视,等等问题。那分块有问题,但是文本太长时又不能不分块,采用滑动窗口就成为一个自然的选择。

BGE Landmark embedding有三个创新点:Chunking-Free的架构,位置感知的目标函数,多阶段训练算法。这三者环环相扣,下面依次分析。

Chunking-Free架构

首先看论文中的图2,针对一个滑窗,生成滑窗的LE(landmark embedding)和查询的嵌入(query embedding),通过两者的内积计算相似度,决定查询的检索输出。

Landmark Embedding 方法在长上下文语言建模的检索增强任务中展现了显著优势。这些优势包括显著的性能提升、运行效率的优化、检索准确性的增强,以及对长上下文处理的更好适应性。研究结果表明,Landmark Embedding 是一个强大的工具,能够在多种长上下文任务中实现更准确、更高效的信息检索。


53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询