模型概述
模型特點
模型能力
使用案例
🚀 BCEmbedding:用於RAG的雙語和跨語種嵌入模型
BCEmbedding是由網易有道開發的雙語和跨語種語義表徵算法模型庫,包含EmbeddingModel
和RerankerModel
兩類基礎模型。它能在單語、雙語和跨語種場景中表現卓越,為RAG任務提供強大支持,廣泛應用於有道的眾多產品中。
🚀 快速開始
安裝
首先,創建並激活一個conda環境:
conda create --name bce python=3.10 -y
conda activate bce
然後進行最小化安裝BCEmbedding
:
pip install BCEmbedding==0.1.1
或者從源代碼安裝:
git clone git@github.com:netease-youdao/BCEmbedding.git
cd BCEmbedding
pip install -v -e .
快速上手
1. 基於BCEmbedding
使用EmbeddingModel
,默認使用cls
pooler:
from BCEmbedding import EmbeddingModel
# 句子列表
sentences = ['sentence_0', 'sentence_1', ...]
# 初始化嵌入模型
model = EmbeddingModel(model_name_or_path="maidalun1020/bce-embedding-base_v1")
# 提取嵌入向量
embeddings = model.encode(sentences)
使用RerankerModel
計算相關分數並重新排序:
from BCEmbedding import RerankerModel
# 你的查詢和對應的段落
query = 'input_query'
passages = ['passage_0', 'passage_1', ...]
# 構建句子對
sentence_pairs = [[query, passage] for passage in passages]
# 初始化重排模型
model = RerankerModel(model_name_or_path="maidalun1020/bce-reranker-base_v1")
# 方法0:計算句子對的分數
scores = model.compute_score(sentence_pairs)
# 方法1:對段落進行重排
rerank_results = model.rerank(query, passages)
注意:
在RerankerModel.rerank
方法中,當“passages”非常長時,我們提供了一種在生產中使用的高級預處理方法來構建sentence_pairs
。
2. 基於transformers
對於EmbeddingModel
:
from transformers import AutoModel, AutoTokenizer
# 句子列表
sentences = ['sentence_0', 'sentence_1', ...]
# 初始化模型和分詞器
tokenizer = AutoTokenizer.from_pretrained('maidalun1020/bce-embedding-base_v1')
model = AutoModel.from_pretrained('maidalun1020/bce-embedding-base_v1')
device = 'cuda' # 如果沒有GPU,設置為 "cpu"
model.to(device)
# 獲取輸入
inputs = tokenizer(sentences, padding=True, truncation=True, max_length=512, return_tensors="pt")
inputs_on_device = {k: v.to(device) for k, v in inputs.items()}
# 獲取嵌入向量
outputs = model(**inputs_on_device, return_dict=True)
embeddings = outputs.last_hidden_state[:, 0] # cls pooler
embeddings = embeddings / embeddings.norm(dim=1, keepdim=True) # 歸一化
對於RerankerModel
:
import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification
# 初始化模型和分詞器
tokenizer = AutoTokenizer.from_pretrained('maidalun1020/bce-reranker-base_v1')
model = AutoModelForSequenceClassification.from_pretrained('maidalun1020/bce-reranker-base_v1')
device = 'cuda' # 如果沒有GPU,設置為 "cpu"
model.to(device)
# 獲取輸入
inputs = tokenizer(sentence_pairs, padding=True, truncation=True, max_length=512, return_tensors="pt")
inputs_on_device = {k: v.to(device) for k, v in inputs.items()}
# 計算分數
scores = model(**inputs_on_device, return_dict=True).logits.view(-1,).float()
scores = torch.sigmoid(scores)
3. 基於sentence_transformers
對於EmbeddingModel
:
from sentence_transformers import SentenceTransformer
# 句子列表
sentences = ['sentence_0', 'sentence_1', ...]
# 初始化嵌入模型
## sentence-transformers有新更新。因此,首先清理 "`SENTENCE_TRANSFORMERS_HOME`/maidalun1020_bce-embedding-base_v1" 或 "~/.cache/torch/sentence_transformers/maidalun1020_bce-embedding-base_v1" 以下載新版本。
model = SentenceTransformer("maidalun1020/bce-embedding-base_v1")
# 提取嵌入向量
embeddings = model.encode(sentences, normalize_embeddings=True)
對於RerankerModel
:
from sentence_transformers import CrossEncoder
# 初始化重排模型
model = CrossEncoder('maidalun1020/bce-reranker-base_v1', max_length=512)
# 計算句子對的分數
scores = model.predict(sentence_pairs)
RAG框架集成
1. 在langchain
中使用
from langchain.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_community.vectorstores.utils import DistanceStrategy
query = 'apples'
passages = [
'I like apples',
'I like oranges',
'Apples and oranges are fruits'
]
# 初始化嵌入模型
model_name = 'maidalun1020/bce-embedding-base_v1'
model_kwargs = {'device': 'cuda'}
encode_kwargs = {'batch_size': 64, 'normalize_embeddings': True, 'show_progress_bar': False}
embed_model = HuggingFaceEmbeddings(
model_name=model_name,
model_kwargs=model_kwargs,
encode_kwargs=encode_kwargs
)
# 示例 #1. 提取嵌入向量
query_embedding = embed_model.embed_query(query)
passages_embeddings = embed_model.embed_documents(passages)
# 示例 #2. langchain檢索器示例
faiss_vectorstore = FAISS.from_texts(passages, embed_model, distance_strategy=DistanceStrategy.MAX_INNER_PRODUCT)
retriever = faiss_vectorstore.as_retriever(search_type="similarity", search_kwargs={"score_threshold": 0.5, "k": 3})
related_passages = retriever.get_relevant_documents(query)
2. 在llama_index
中使用
from llama_index.embeddings import HuggingFaceEmbedding
from llama_index import VectorStoreIndex, ServiceContext, SimpleDirectoryReader
from llama_index.node_parser import SimpleNodeParser
from llama_index.llms import OpenAI
query = 'apples'
passages = [
'I like apples',
'I like oranges',
'Apples and oranges are fruits'
]
# 初始化嵌入模型
model_args = {'model_name': 'maidalun1020/bce-embedding-base_v1', 'max_length': 512, 'embed_batch_size': 64, 'device': 'cuda'}
embed_model = HuggingFaceEmbedding(**model_args)
# 示例 #1. 提取嵌入向量
query_embedding = embed_model.get_query_embedding(query)
passages_embeddings = embed_model.get_text_embedding_batch(passages)
# 示例 #2. RAG示例
llm = OpenAI(model='gpt-3.5-turbo-0613', api_key=os.environ.get('OPENAI_API_KEY'), api_base=os.environ.get('OPENAI_BASE_URL'))
service_context = ServiceContext.from_defaults(llm=llm, embed_model=embed_model)
documents = SimpleDirectoryReader(input_files=["BCEmbedding/tools/eval_rag/eval_pdfs/Comp_en_llama2.pdf"]).load_data()
node_parser = SimpleNodeParser.from_defaults(chunk_size=512)
nodes = node_parser.get_nodes_from_documents(documents[0:36])
index = VectorStoreIndex(nodes, service_context=service_context)
query_engine = index.as_query_engine()
response = query_engine.query("What is llama?")
✨ 主要特性
- 雙語和跨語種能力:基於有道翻譯引擎的強大能力,具備強大的中英雙語和跨語種語義表徵能力,支持中英日韓四個語種,未來還將支持更多語言。
- RAG適配:面向RAG做了針對性優化,可以適配大多數相關任務,如翻譯、摘要、問答等。此外,針對問題理解(query understanding)也做了針對性優化,詳見基於LlamaIndex的RAG評測指標。
- 高效且精確的語義檢索:
EmbeddingModel
採用雙編碼器,可在第一階段實現高效的語義檢索;RerankerModel
採用交叉編碼器,可在第二階段實現更高精度的語義順序精排。 - 更好的領域泛化性:為了在更多場景實現更好的效果,收集了多種多樣的領域數據。
- 用戶友好:語義檢索時不需要特殊指令前綴,無需為各種任務設計指令前綴。
- 有意義的重排序分數:
RerankerModel
可以提供有意義的語義相關性分數(不僅僅是排序),可用於過濾無意義文本片段,提高大模型生成效果。 - 產品化檢驗:
BCEmbedding
已經在有道的眾多真實產品中得到驗證。
📦 安裝指南
創建並激活conda環境
conda create --name bce python=3.10 -y
conda activate bce
最小化安裝
pip install BCEmbedding==0.1.1
從源代碼安裝
git clone git@github.com:netease-youdao/BCEmbedding.git
cd BCEmbedding
pip install -v -e .
💻 使用示例
基礎用法
# 使用EmbeddingModel提取嵌入向量
from BCEmbedding import EmbeddingModel
sentences = ['sentence_0', 'sentence_1', ...]
model = EmbeddingModel(model_name_or_path="maidalun1020/bce-embedding-base_v1")
embeddings = model.encode(sentences)
高級用法
# 使用RerankerModel進行重排
from BCEmbedding import RerankerModel
query = 'input_query'
passages = ['passage_0', 'passage_1', ...]
sentence_pairs = [[query, passage] for passage in passages]
model = RerankerModel(model_name_or_path="maidalun1020/bce-reranker-base_v1")
rerank_results = model.rerank(query, passages)
📚 詳細文檔
模型列表
模型名稱 | 模型類型 | 支持語言 | 參數數量 | 權重下載 |
---|---|---|---|---|
bce-embedding-base_v1 | EmbeddingModel |
中文、英文 | 279M | 下載 |
bce-reranker-base_v1 | RerankerModel |
中文、英文、日文、韓文 | 279M | 下載 |
最新更新
- 2024-01-03:模型發佈 - bce-embedding-base_v1 和 bce-reranker-base_v1 已發佈。
- 2024-01-03:RAG評測數據 [CrosslingualMultiDomainsDataset] - 基於LlamaIndex的RAG評測數據已發佈。
- 2024-01-03:跨語種語義表徵評測數據 [詳情] - 基於MTEB的跨語種評測數據已發佈。
有道BCEmbedding API
對於那些更喜歡直接調用API的用戶,有道提供方便的BCEmbedding
調用API。該方式是一種簡化和高效的方式,將BCEmbedding
集成到您的項目中,避開了手動設置和系統維護的複雜性。更詳細的API調用接口說明詳見有道BCEmbedding API。
微信交流群
歡迎大家掃碼加入官方微信交流群。
引用
如果在您的研究或任何項目中使用本工作,煩請按照下方進行引用,並打個小星星~
@misc{youdao_bcembedding_2023,
title={BCEmbedding: Bilingual and Crosslingual Embedding for RAG},
author={NetEase Youdao, Inc.},
year={2023},
howpublished={\url{https://github.com/netease-youdao/BCEmbedding}}
}
許可證
BCEmbedding
採用Apache 2.0許可證。
相關鏈接
🔧 技術細節
基於MTEB評估語義表徵
嵌入模型評估
運行以下命令在雙語和跨語種(如["en", "zh", "en-zh", "zh-en"]
)模式下評估your_embedding_model
(如maidalun1020/bce-embedding-base_v1
):
python BCEmbedding/tools/eval_mteb/eval_embedding_mteb.py --model_name_or_path maidalun1020/bce-embedding-base_v1 --pooler cls
評測包含 "Retrieval"、 "STS"、 "PairClassification"、 "Classification"、 "Reranking" 和 "Clustering" 這六大類任務的共 114個數據集。
重排模型評估
運行以下命令在雙語和跨語種(如["en", "zh", "en-zh", "zh-en"]
)模式下評估your_reranker_model
(如maidalun1020/bce-reranker-base_v1
):
python BCEmbedding/tools/eval_mteb/eval_reranker_mteb.py --model_name_or_path maidalun1020/bce-reranker-base_v1
評測包含 "Reranking" 任務的 12個數據集。
指標可視化工具
我們提供了embedding
和reranker
模型的指標可視化一鍵腳本,輸出一個markdown文件,詳見Embedding模型指標彙總和Reranker模型指標彙總。
python BCEmbedding/evaluation/mteb/summarize_eval_results.py --results_dir {your_embedding_results_dir | your_reranker_results_dir}
基於LlamaIndex評估RAG
指標定義
- 命中率(Hit Rate):計算在檢索的前k個文檔中找到正確答案的查詢所佔的比例,該指標越大越好。
- 平均倒數排名(Mean Reciprocal Rank,MRR):對於每個查詢,通過查看最高排名的相關文檔的排名來評估系統的準確性,是所有查詢中這些排名的倒數的平均值,該指標越大越好。
復現LlamaIndex博客結果
為了公平起見,運行以下腳本復現LlamaIndex博客的結果,將BCEmbedding
與其他embedding和reranker模型進行對比分析:
# 至少需要兩個可用的GPU
CUDA_VISIBLE_DEVICES=0,1 python BCEmbedding/tools/eval_rag/eval_llamaindex_reproduce.py
然後,通過以下命令彙總評估結果:
python BCEmbedding/tools/eval_rag/summarize_eval_results.py --results_dir results/rag_reproduce_results
復現結果詳見LlamaIndex RAG評測結果復現,可以看出:
- 在
WithoutReranker
設置下,bce-embedding-base_v1
比其他embedding模型效果都要好。 - 在固定embedding模型設置下,
bce-reranker-base_v1
比其他reranker模型效果都要好。 bce-embedding-base_v1
和bce-reranker-base_v1
組合表現SOTA。
多領域適應性評估
為了評測算法模型的領域泛化性、雙語和跨語種能力,我們構建了多領域(計算機科學、物理學、生物學、經濟學、數學、量化金融等)的雙語種、跨語種評測數據CrosslingualMultiDomainsDataset,採用OpenAI的gpt-4-1106-preview
保證數據質量。
首先,運行以下命令評估最流行和強大的嵌入和重排模型:
# 至少需要兩個可用的GPU
CUDA_VISIBLE_DEVICES=0,1 python BCEmbedding/tools/eval_rag/eval_llamaindex_multiple_domains.py
然後,運行以下腳本彙總評估結果:
python BCEmbedding/tools/eval_rag/summarize_eval_results.py --results_dir results/rag_results
多領域評估總結詳見多領域場景。
排行榜
MTEB語義表徵評估
嵌入模型
模型 | 維度 | Pooler | 指令要求 | 檢索(47) | STS(19) | 成對分類(5) | 分類(21) | 重排(12) | 聚類(15) | 平均(119) |
---|---|---|---|---|---|---|---|---|---|---|
bge-base-en-v1.5 | 768 | cls |
需要 | 37.14 | 55.06 | 75.45 | 59.73 | 43.00 | 37.74 | 47.19 |
bge-base-zh-v1.5 | 768 | cls |
需要 | 47.63 | 63.72 | 77.40 | 63.38 | 54.95 | 32.56 | 53.62 |
bge-large-en-v1.5 | 1024 | cls |
需要 | 37.18 | 54.09 | 75.00 | 59.24 | 42.47 | 37.32 | 46.80 |
bge-large-zh-v1.5 | 1024 | cls |
需要 | 47.58 | 64.73 | 79.14 | 64.19 | 55.98 | 33.26 | 54.23 |
e5-large-v2 | 1024 | mean |
需要 | 35.98 | 55.23 | 75.28 | 59.53 | 42.12 | 36.51 | 46.52 |
gte-large | 1024 | mean |
無需 | 36.68 | 55.22 | 74.29 | 57.73 | 42.44 | 38.51 | 46.67 |
gte-large-zh | 1024 | cls |
無需 | 41.15 | 64.62 | 77.58 | 62.04 | 55.62 | 33.03 | 51.51 |
jina-embeddings-v2-base-en | 768 | mean |
無需 | 31.58 | 54.28 | 74.84 | 58.42 | 41.16 | 34.67 | 44.29 |
m3e-base | 768 | mean |
無需 | 46.29 | 63.93 | 71.84 | 64.08 | 52.38 | 37.84 | 53.54 |
m3e-large | 1024 | mean |
無需 | 34.85 | 59.74 | 67.69 | 60.07 | 48.99 | 31.62 | 46.78 |
multilingual-e5-base | 768 | mean |
需要 | 54.73 | 65.49 | 76.97 | 69.72 | 55.01 | 38.44 | 58.34 |
multilingual-e5-large | 1024 | mean |
需要 | 56.76 | 66.79 | 78.80 | 71.61 | 56.49 | 43.09 | 60.50 |
bce-embedding-base_v1 | 768 | cls |
無需 | 57.60 | 65.73 | 74.96 | 69.00 | 57.29 | 38.95 | 59.43 |
要點:
- 對比其他開源的相同規模的嵌入模型,bce-embedding-base_v1 表現最好,效果比最好的large模型稍差。
- 評測包含 "Retrieval"、 "STS"、 "PairClassification"、 "Classification"、 "Reranking" 和 "Clustering" 這六大類任務的共 114個數據集。
- 我們開源的跨語種語義表徵評測數據屬於
Retrieval
任務。 - 更詳細的評測結果詳見Embedding模型指標彙總。
重排模型
模型 | 重排(12) | 平均(12) |
---|---|---|
bge-reranker-base | 59.04 | 59.04 |
bge-reranker-large | 60.86 | 60.86 |
bce-reranker-base_v1 | 61.29 | 61.29 |
要點:
- bce-reranker-base_v1 優於其他開源重排模型。
- 評測包含 "Reranking" 任務的 12個數據集。
- 更詳細的評測結果詳見Reranker模型指標彙總。
LlamaIndex RAG評估
多領域場景
要點:
- 評測在
["en", "zh", "en-zh", "zh-en"]
設置下進行。 - 在
WithoutReranker
設置下,bce-embedding-base_v1
優於其他嵌入模型,包括開源和閉源。 - 在固定嵌入模型設置下,
bce-reranker-base_v1
比其他重排模型效果都要好,包括開源和閉源。 bce-embedding-base_v1
和bce-reranker-base_v1
組合表現SOTA。
📄 許可證
BCEmbedding
採用Apache 2.0許可證。







