主题
LlamaIndex 支持 HuggingFace 嵌入模型,包括 BGE、Mixedbread、Nomic、Jina、E5 等 Sentence Transformer 模型。我们可以使用这些模型为文档和查询生成嵌入,用于检索。
此外,我们还提供了一些工具,可使用 HuggingFace 的 Optimum 库 创建和使用 ONNX 与 OpenVINO 模型。
HuggingFaceEmbedding
基类 HuggingFaceEmbedding 是任意 HuggingFace 嵌入模型的通用封装。Hugging Face 上的所有嵌入模型 都应该可用。你可以参考嵌入模型排行榜 获取更多推荐。
该类依赖 sentence-transformers 包,可通过 pip install sentence-transformers 安装。
注意:如果你之前使用的是 LangChain 中的 HuggingFaceEmbeddings,这里应能得到等效的结果。
如果你在 Colab 中打开这个 Notebook,可能需要先安装 LlamaIndex 🦙。
%pip install llama-index-embeddings-huggingface1
!pip install llama-index1
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
# loads https://huggingface.co/BAAI/bge-small-en-v1.5
embed_model = HuggingFaceEmbedding(model_name="BAAI/bge-small-en-v1.5")1
2
3
4
2
3
4
embeddings = embed_model.get_text_embedding("Hello World!")
print(len(embeddings))
print(embeddings[:5])1
2
3
2
3
384
[-0.003275700844824314, -0.011690810322761536, 0.041559211909770966, -0.03814814239740372, 0.024183044210076332]1
2
2
基准测试
我们用一个经典的大型文档来比较——IPCC 气候报告第 3 章。
!curl https://www.ipcc.ch/report/ar6/wg2/downloads/report/IPCC_AR6_WGII_Chapter03.pdf --output IPCC_AR6_WGII_Chapter03.pdf1
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 20.7M 100 20.7M 0 0 69.6M 0 --:--:-- --:--:-- --:--:-- 70.0M1
2
3
4
5
2
3
4
5
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.core import Settings
documents = SimpleDirectoryReader(
input_files=["IPCC_AR6_WGII_Chapter03.pdf"]
).load_data()1
2
3
4
5
6
2
3
4
5
6
基础 HuggingFace 嵌入模型
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
# loads BAAI/bge-small-en-v1.5 with the default torch backend
embed_model = HuggingFaceEmbedding(
model_name="BAAI/bge-small-en-v1.5",
device="cpu",
embed_batch_size=8,
)
test_embeds = embed_model.get_text_embedding("Hello World!")
Settings.embed_model = embed_model1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
%%timeit -r 1 -n 1
index = VectorStoreIndex.from_documents(documents, show_progress=True)1
2
2
Parsing nodes: 100%|██████████| 172/172 [00:00<00:00, 428.44it/s]
Generating embeddings: 100%|██████████| 459/459 [00:19<00:00, 23.32it/s]
20.2 s ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)1
2
3
4
2
3
4
ONNX 嵌入模型
# pip install sentence-transformers[onnx]
# loads BAAI/bge-small-en-v1.5 with the onnx backend
embed_model = HuggingFaceEmbedding(
model_name="BAAI/bge-small-en-v1.5",
device="cpu",
backend="onnx",
model_kwargs={
"provider": "CPUExecutionProvider"
}, # For ONNX, you can specify the provider, see https://sbert.net/docs/sentence_transformer/usage/efficiency.html
)
test_embeds = embed_model.get_text_embedding("Hello World!")
Settings.embed_model = embed_model1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
%%timeit -r 1 -n 1
index = VectorStoreIndex.from_documents(documents, show_progress=True)1
2
2
Parsing nodes: 100%|██████████| 172/172 [00:00<00:00, 421.63it/s]
Generating embeddings: 100%|██████████| 459/459 [00:31<00:00, 14.53it/s]
32.1 s ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)1
2
3
4
2
3
4
OpenVINO 嵌入模型
# pip install sentence-transformers[openvino]
# loads BAAI/bge-small-en-v1.5 with the openvino backend
embed_model = HuggingFaceEmbedding(
model_name="BAAI/bge-small-en-v1.5",
device="cpu",
backend="openvino", # OpenVINO is very strong on CPUs
revision="refs/pr/16", # BAAI/bge-small-en-v1.5 itself doesn't have an OpenVINO model currently, but there's a PR with it that we can load: https://huggingface.co/BAAI/bge-small-en-v1.5/discussions/16
model_kwargs={
"file_name": "openvino_model_qint8_quantized.xml"
}, # If we're using an optimized/quantized model, we need to specify the file name like this
)
test_embeds = embed_model.get_text_embedding("Hello World!")
Settings.embed_model = embed_model1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
%%timeit -r 1 -n 1
index = VectorStoreIndex.from_documents(documents, show_progress=True)1
2
2
Parsing nodes: 100%|██████████| 172/172 [00:00<00:00, 403.15it/s]
Generating embeddings: 100%|██████████| 459/459 [00:08<00:00, 53.83it/s]
9.03 s ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)1
2
3
4
2
3
4
参考
- 本地嵌入模型 进一步介绍了如何使用这类本地模型。
- Sentence Transformers > 加速推理 包含大量关于如何有效使用后端选项的文档,包括针对 ONNX 和 OpenVINO 的优化与量化。