模型概述
模型特點
模型能力
使用案例
🚀 BCEmbedding:用於RAG的雙語和跨語種嵌入模型
BCEmbedding是由網易有道開發的雙語和跨語種語義表徵算法模型庫,包含EmbeddingModel
和RerankerModel
兩類基礎模型。EmbeddingModel
可生成語義向量,在語義搜索和問答中起關鍵作用;RerankerModel
則擅長優化搜索結果和排序。該模型庫以其出色的雙語和跨語種能力著稱,能消除中英語言差異,實現強大的語義表徵和RAG評測表現。
🚀 快速開始
最新、最詳細的bce-embedding-base_v1相關信息,請移步:GitHub
安裝
首先,創建並激活一個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?")
✨ 主要特性
- 雙語和跨語種能力:基於有道翻譯引擎的強大能力,
BCEmbedding
具備強大的中英雙語和跨語種語義表徵能力,後續還將支持更多語言。 - RAG適配:針對RAG任務進行了優化,適用於翻譯、摘要、問答等多種任務,能準確理解查詢意圖。詳見 基於LlamaIndex的RAG評測指標。
- 高效且精確的語義檢索:
EmbeddingModel
採用雙編碼器,可在第一階段實現高效檢索;RerankerModel
採用交叉編碼器,在第二階段實現更高精度的重排和深度語義分析。 - 廣泛的領域適應性:在多樣化的數據集上進行訓練,能在教育、法律、金融、醫療、文學、FAQ、教科書、維基百科等多個領域表現出色。
- 用戶友好設計:無需為每個任務指定查詢指令,使用更加便捷。
- 有意義的重排序分數:
RerankerModel
提供相關分數,可提高結果質量,優化大語言模型性能。 - 經過生產驗證:已在有道的產品中成功實現並驗證。
📦 安裝指南
環境準備
首先,創建並激活一個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
和RerankerModel
的基礎示例:
# 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")
scores = model.compute_score(sentence_pairs)
rerank_results = model.rerank(query, passages)
高級用法
以下是在langchain
和llama_index
中使用的高級示例:
# 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
)
query_embedding = embed_model.embed_query(query)
passages_embeddings = embed_model.embed_documents(passages)
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)
# 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)
query_embedding = embed_model.get_query_embedding(query)
passages_embeddings = embed_model.get_text_embedding_batch(passages)
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?")
📚 詳細文檔
模型列表
模型名稱 | 模型類型 | 支持語言 | 參數數量 | 權重下載 |
---|---|---|---|---|
bce-embedding-base_v1 | EmbeddingModel |
中文、英文 | 279M | 下載 |
bce-reranker-base_v1 | RerankerModel |
中文、英文、日文、韓文 | 279M | 下載 |
評測
基於MTEB評估語義表徵
我們基於MTEB和C_MTEB,提供embedding
和reranker
模型的語義表徵評測工具。
- Embedding模型評測:運行以下命令在雙語和跨語種設置下評測
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個數據集。
- Reranker模型評測:運行以下命令在雙語和跨語種設置下評測
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
模型的評估結果彙總為Embedding模型指標彙總和Reranker模型指標彙總。
python BCEmbedding/evaluation/mteb/summarize_eval_results.py --results_dir {your_embedding_results_dir | your_reranker_results_dir}
基於LlamaIndex評估RAG
LlamaIndex是一個著名的大模型應用的開源工具,在RAG中很受歡迎。我們按照其評測流程驗證BCEmbedding
在RAG中的效果。
- 安裝LlamaIndex:
pip install llama-index==0.9.22
- 指標定義:
- 命中率(Hit Rate):計算在檢索的前k個文檔中找到正確答案的查詢所佔的比例,該指標越大越好。
- 平均倒數排名(Mean Reciprocal Rank,MRR):通過查看最高排名的相關文檔的排名來評估系統的準確性,是所有查詢中這些排名的倒數的平均值,該指標越大越好。
- 復現LlamaIndex博客結果:
# 至少需要兩個可用的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。- 多領域適應性評估:為了評估
BCEmbedding
的領域泛化性、雙語和跨語種能力,我們構建了多領域評估數據集CrosslingualMultiDomainsDataset。
# 至少需要兩個可用的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中的語義表徵評估
Embedding模型
模型 | 維度 | 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
在相同規模的開源嵌入模型中表現出色。- 評測包含“Retrieval”、 “STS”、 “PairClassification”、 “Classification”、 “Reranking”和“Clustering”六大類任務的114個數據集。
- 我們發佈的跨語種語義表徵評測數據屬於
Retrieval
任務。 - 更詳細的評測結果詳見Embedding模型指標彙總。
Reranker模型
模型 | 重排(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 API
對於更喜歡直接調用API的用戶,有道提供了方便的BCEmbedding
調用API。這種方式可以簡化和高效地將BCEmbedding
集成到項目中,避免手動設置和系統維護的複雜性。更詳細的API調用接口說明詳見有道BCEmbedding API。
🔧 技術細節
雙語和跨語種優勢
現有的單個語義表徵模型在雙語和跨語種場景中常常表現不佳,特別是在中文、英文及其跨語種任務中。BCEmbedding
充分利用有道翻譯引擎的優勢,實現只需一個模型就可以在單語、雙語和跨語種場景中表現出卓越的性能。
EmbeddingModel
支持中文和英文(之後會支持更多語種)。RerankerModel
支持中文、英文、日文和韓文。
最新更新
- 2024-01-03:模型發佈 - bce-embedding-base_v1和bce-reranker-base_v1已發佈。
- 2024-01-03:RAG評測數據 [CrosslingualMultiDomainsDataset] - 基於LlamaIndex的RAG評測數據已發佈。
- 2024-01-03:跨語種語義表徵評測數據 [詳情] - 基於MTEB的跨語種評測數據已發佈。
📄 許可證
BCEmbedding
採用Apache 2.0許可證。
🔗 相關鏈接
🧲 微信交流群
歡迎大家掃碼加入官方微信交流群。
✏️ 引用
如果在您的研究或項目中使用BCEmbedding
,請按照以下方式引用並給項目點個星:
@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}}
}







