微信扫码
与创始人交个朋友
我要投稿
一、Embedding选型建议与结果
选型建议:
大部分模型的序列长度是 512 tokens。8192 可尝试 tao-8k,1024 可尝试 stella。
在专业数据领域上,嵌入模型的表现不如 BM25,但是微调可以大大提升效果。
有微调需求且对模型训练了解较少的,建议选择 bge 系列(完善的训练脚本、负例挖掘等)。但多数模型都基于BERT,训练脚本也通用,其他模型也可以参考。
重排模型选择很少,推荐使用 bge-reranker,也支持微调。reranker 模型因为单次输入较多,只能通过 GPU 部署。
选型结果:
作者:腾讯
模型地址:https://huggingface.co/TownsWu/PEG
论文:https://arxiv.org/pdf/2311.11691.pdf
重点优化检索能力。
作者:阿里巴巴
模型地址:https://huggingface.co/thenlper/gte-large-zh
论文:https://arxiv.org/abs/2308.03281
作者:商汤
地址:https://huggingface.co/sensenova/piccolo-large-zh
有一些微调的小tips
地址:https://huggingface.co/infgrad/stella-large-zh-v2
博客文章:https://zhuanlan.zhihu.com/p/655322183
基于piccolo 模型fine-tuning,支持1024 序列长度。博客文章记录了一些训练思路。
作者:智源研究院
地址: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 榜单的维护者。
作者:MokaAI
地址:https://huggingface.co/moka-ai/m3e-large
Github:https://github.com/wangyuxinwhy/uniem
研究的比较早,算是中文通用 Embedding 模型、数据集以及评测比较早的开拓者。
地址:https://huggingface.co/intfloat/multilingual-e5-large
论文:https://arxiv.org/pdf/2212.03533.pdf
多语言支持。
地址: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 FlagModel
sentences = ["样例数据-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.T
print(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 SentenceTransformer
sentences = ["样例数据-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.T
print(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, AutoModel
import torch
# Sentences we want sentence embeddings for
sentences = ["样例数据-1", "样例数据-2"]
# Load model from HuggingFace Hub
tokenizer = AutoTokenizer.from_pretrained('BAAI/bge-large-zh')
model = AutoModel.from_pretrained('BAAI/bge-large-zh')
# Tokenize sentences
encoded_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 embeddings
with torch.no_grad():
model_output = model(**encoded_input)
# Perform pooling. In this case, cls pooling.
sentence_embeddings = model_output[0][:, 0]
# normalize embeddings
sentence_embeddings = torch.nn.functional.normalize(sentence_embeddings, p=2, dim=1)
print("Sentence embeddings:", sentence_embeddings)
大语言模型(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+中大型企业
2024-11-24
解读GraphRAG
2024-11-24
RAGChecker:显著超越RAGAS,一个精细化评估和诊断 RAG 系统的创新框架
2024-11-23
FastRAG半结构化RAG实现思路及OpenAI O1-long COT蒸馏路线思考
2024-11-23
检索增强生成(RAG):解密AI如何融合记忆与搜索
2024-11-23
如何提高RAG系统准确率?12大常见痛点及巧妙解!
2024-11-23
RAG 2.0性能提升:优化索引与召回机制的策略与实践
2024-11-22
RAG技术在实际应用中的挑战与解决方案
2024-11-22
从普通RAG到RAPTOR,10个最新的RAG框架
2024-07-18
2024-05-05
2024-07-09
2024-05-19
2024-07-09
2024-06-20
2024-07-07
2024-07-07
2024-07-08
2024-07-09
2024-11-06
2024-11-06
2024-11-05
2024-11-04
2024-10-27
2024-10-25
2024-10-21
2024-10-21