数据科学和机器学习从业者经常发现自己在模型、库和框架的迷宫中徘徊。选择哪个模型,嵌入大小是多少,以及如何进行分词,仅仅是开始工作时面临的一些问题。我们理解许多数据科学家希望有一种更简单、更直观的方式来进行嵌入工作。这就是我们创建FastEmbed的原因,这是一款为速度、效率和可用性而设计的Python库。我们创建了易于使用的默认工作流,处理NLP嵌入中的80%用例。
生成嵌入的当前状态
通常,您通过利用 PyTorch 或 TensorFlow 模型来进行嵌入。然而,使用这些库在易用性和计算速度方面是有代价的。这至少部分是因为这些库是为了模型推断和改进而构建的,例如通过微调。
为了应对这些问题,我们建立了一个小型库,专注于快速高效地创建文本嵌入。我们还决定仅从几种最优秀的变换器模型开始。在保持小型和专注于特定用例的情况下,我们可以使我们的库专注,而没有所有多余的依赖项。我们提供有限的模型,对模型权重进行量化,并与ONNX Runtime无缝集成。FastEmbed在推理时间、资源利用和性能(召回/准确率)之间达成了平衡。
快速嵌入文本文件示例
这是我们如何简化嵌入文本文档的一个示例:
documents: List[str] = [
"Hello, World!",
"fastembed is supported by and maintained by Qdrant."
]
embedding_model = DefaultEmbedding()
embeddings: List[np.ndarray] = list(embedding_model.embed(documents))
这三行代码为您完成了很多繁重的工作:它们下载量化模型,使用ONNXRuntime加载它,并然后对您的文档进行批量嵌入创建。
代码演示
让我们逐行深入探讨一个更高级的示例代码片段:
from fastembed.embedding import DefaultEmbedding
在这里,我们从 FastEmbed 导入 FlagEmbedding 类并将其命名为 Embedding。这个核心类负责根据您选择的文本模型生成嵌入。这也是您可以直接导入的类,作为 DefaultEmbedding,即 BAAI/bge-small-en-v1.5
documents: List[str] = [
"passage: Hello, World!",
"query: How is the World?",
"passage: This is an example passage.",
"fastembed is supported by and maintained by Qdrant."
]
在这个名为 documents 的列表中,我们定义了四个文本字符串,想要将它们转换为嵌入。
注意使用前缀“passage”和“query”来区分要生成的嵌入类型。这是BAAI/bge系列模型的交叉编码实现所继承的。这对于检索尤其有用,我们强烈建议也使用此方法。
使用诸如“query”和“passage”的文本前缀不仅仅是语法糖;它向算法说明了如何处理文本以生成嵌入。“query”前缀通常会触发模型生成针对相似性比较优化的嵌入,而“passage”嵌入则经过微调以理解上下文。如果您省略前缀,将应用默认行为,尽管建议指定它以获得更细致的结果。
接下来,我们使用默认模型初始化嵌入模型: BAAI/bge-small-en-v1.5。
embedding_model = DefaultEmbedding()
默认模型和其他几个模型的上下文窗口最大为512个标记。这个最大限制源于嵌入模型的训练和设计。如果您想嵌入超过这个大小的序列,我们推荐使用某种池化策略来从序列中获取单个向量。例如,您可以使用文档不同块嵌入的均值。这也是SBERT Paper推荐的
该模型在速度和准确性之间取得了平衡,非常适合实际应用。
embeddings: List[np.ndarray] = list(embedding_model.embed(documents))
最后,我们在我们的 embedding_model 对象上调用 embed() 方法,传入 documents 列表。该方法返回一个 Python 生成器,因此我们将其转换为一个列表以获取所有的嵌入。这些嵌入是优化快速数学运算的 NumPy 数组。
该 embed() 方法返回一个 NumPy 数组的列表,每个数组对应于您原始文档列表中一个文档的嵌入。这些数组的维度由您选择的模型决定,例如,对于“BAAI/bge-small-en-v1.5”,它是一个 384 维的向量。
您可以轻松解析这些NumPy数组以用于任何下游应用程序——无论是聚类、相似性比较,还是将它们输入机器学习模型以进行进一步分析。
FastEmbed的三个关键特性
FastEmbed 旨在提高推理速度,而不牺牲(太多)性能:
- 比PyTorch Transformers快50%
- 比句子变换器和OpenAI Ada-002表现更好
- 量化模型和原始模型向量的余弦相似度为0.92
我们使用 BAAI/bge-small-en-v1.5 作为我们的默认嵌入,因此我们选择了它进行比较:

FastEmbed的背后
量化模型: 我们对CPU(和Mac Metal)进行模型量化 – 为您提供最佳的计算模型性价比。我们的默认模型非常小,您可以在AWS Lambda上运行它,如果您愿意的话!
向 Huggingface 的 最优 致敬 - 它使模型量化变得更容易。
缩短安装时间:
FastEmbed通过保持低的最低RAM/磁盘使用量而与众不同。
它被设计成灵活和快速,适用于希望将文本嵌入集成用于生产用途的企业。对于 FastEmbed,依赖项列表简洁明了:
- onnx: 版本 ^1.11 – 如果可以的话,我们将在未来尝试也去掉这个!
- onnxruntime: 版本 ^1.15
- tqdm: 版本 ^4.65 – 仅在下载时使用
- 请求:版本 ^2.31 - 仅在下载时使用
- 分词器:版本 ^0.13
这个简化的列表有两个目的。首先,它显著减少了安装时间,从而加快了部署速度。其次,它限制了所需的磁盘空间,即使在存储有限的环境中,它也是一个可行的选择。
显著缺失在依赖列表中的是像PyTorch这样庞大的库,并且没有对CUDA驱动程序的需求。这是故意的。FastEmbed旨在直接在您的CPU上提供最佳性能,消除了对专用硬件或复杂设置的需求。
ONNXRuntime: ONNXRuntime 使我们能够支持多个提供者。我们进行的量化仅限于 CPU(英特尔),但我们打算在未来支持相同的 GPU 版本。这允许更大的定制和优化,进一步与您的特定性能和计算要求相一致。
当前模型
我们已经开始支持一小部分模型:
我们支持的所有模型都经过量化以实现更快的计算!
如果您正在使用FastEmbed并且有想法或需要某些功能,请随时告诉我们。只需在我们的GitHub页面上提交一个问题。这是我们在决定接下来要研究的内容时首先查看的地方。您可以在这里做到这一点: FastEmbed GitHub 问题。
当涉及到FastEmbed的DefaultEmbedding模型时,我们致力于支持最佳的开源模型。
如果有任何变化,您会看到一个新的版本号出现,比如从0.0.6变为0.1。因此,锁定您正在使用的FastEmbed版本是个好主意,以避免意外情况。
使用 FastEmbed 与 Qdrant
Qdrant 是一个向量存储,提供全面、高效和可扩展的 企业解决方案,用于现代机器学习和人工智能应用。无论您是处理数十亿个数据点,需求低延迟高性能的 向量数据库解决方案,还是专门的量化方法 – Qdrant 被设计 以直接满足这些需求。
FastEmbed与Qdrant的向量存储功能的融合实现了一个透明的工作流程,用于无缝的嵌入生成、存储和检索。这简化了API设计——同时仍然给予您灵活性以进行重大更改,例如您可以使用FastEmbed制作您自己的嵌入,而不是DefaultEmbedding,并将其与Qdrant一起使用。
以下是关于如何开始使用FastEmbed与Qdrant的详细指南。
步骤 1:安装
在深入代码之前,第一步是安装Qdrant客户端和FastEmbed库。这可以使用pip完成:
pip install qdrant-client[fastembed]
对于使用 zsh 作为其 shell 的用户,您可能会遇到语法问题。在这种情况下,将包名用引号括起来:
pip install 'qdrant-client[fastembed]'
步骤 2:初始化 Qdrant 客户端
成功安装后,下一步涉及初始化 Qdrant 客户端。这可以在内存中完成,也可以通过指定数据库路径来完成:
from qdrant_client import QdrantClient
# Initialize the client
client = QdrantClient(":memory:") # or QdrantClient(path="path/to/db")
步骤 3: 准备文档、元数据和ID
一旦客户端初始化,准备您希望嵌入的文本文件,以及任何相关的元数据和唯一ID:
docs = [
"Qdrant has Langchain integrations",
"Qdrant also has Llama Index integrations"
]
metadata = [
{"source": "Langchain-docs"},
{"source": "LlamaIndex-docs"},
]
ids = [42, 2]
请注意,我们将使用的 add 方法是重载的:如果您跳过 ids,我们将为您生成这些。metadata 显然是可选的。因此,您也可以简单地使用这个:
docs = [
"Qdrant has Langchain integrations",
"Qdrant also has Llama Index integrations"
]
步骤 4:向集合中添加文档
准备好你的文档、元数据和ID后,你可以通过add方法将这些添加到Qdrant中指定的集合中:
client.add(
collection_name="demo_collection",
documents=docs,
metadata=metadata,
ids=ids
)
在这个函数内部,Qdrant Client 使用 FastEmbed 进行文本嵌入,生成缺失的 ID,然后将它们与元数据一起添加到索引中。这使用默认嵌入模型: BAAI/bge-small-en-v1.5

步骤 5:执行查询
最后,您可以对存储的文档执行查询。Qdrant 提供强大的查询功能,可以轻松检索查询结果,如下所示:
search_result = client.query(
collection_name="demo_collection",
query_text="This is a query document"
)
print(search_result)
在幕后,我们首先将query_text转换为嵌入,并使用它来查询向量索引。

通过遵循这些步骤,您有效地利用了FastEmbed和Qdrant的组合能力,从而简化了嵌入生成和检索任务。
Qdrant旨在处理具有数十亿数据点的大规模数据集。它的架构采用了如 二值量化 和 标量量化 的技术,以实现高效的存储和检索。当你将FastEmbed的CPU优先设计和轻量化特性加入到这个方程中时,你最终得到一个可以无缝扩展,同时保持低延迟的系统。
总结
如果您想了解 FastEmbed 和 Qdrant 如何使您的搜索任务轻而易举,何不亲自试一试?您会真正感受到它能做什么。以下是两种简单的入门方法:
云: 在Qdrant Cloud上开始免费计划。
Docker 容器: 如果你是自己动手类型,你可以在自己的机器上设置所有内容。这里有一个快速指南来帮助你: 使用 Docker 快速入门。
那么,去试驾一下吧。我们很期待听到你的想法!
最后,如果您觉得FastEmbed有用,并想了解我们正在做什么,给我们的GitHub仓库点个星对我们来说意义重大。这是点亮该仓库的链接。
如果您对FastEmbed有任何问题,请在Qdrant Discord上提问: https://discord.gg/Qy6HCJK9Dc

