感谢你提供的详细文档和明确的需求!我们将专注于 Milvus 2.5.10(搭配 pymilvus 2.5.6)中的 嵌入模型(Embedding Models),基 Milvus 官方文档(https://milvus.io/docs/zh/embeddings.md),从零开始详细讲解 Milvus 中的嵌入模型,包括定义、支持的模型、配置方法、代码示例、适用场景和注意事项。
1. 嵌入模型(Embedding Models)概述
嵌入模型(Embedding Models) 是将数据(如文本、图像)映射到高维空间的机器学习模型,生成能够捕捉数据语义的向量表示(嵌入,Embeddings)。这些向量在高维空间中的数学距离反映了原始数据的语义相似性,支持信息检索(如搜索、推荐、RAG)。Milvus 2.5.10 是一个向量数据库,专注于存储和检索这些向量,但不提供内置的嵌入模型,而是通过 pymilvus[model]
集成主流外部嵌入模型,生成密集向量(FLOAT_VECTOR
)或稀疏向量(SPARSE_FLOAT_VECTOR
)。
1.1 嵌入模型的作用
- 语义表示:将文本、图像等非结构化数据转换为向量,捕捉语义关系。
- 相似性搜索:支持 Milvus 的 ANN(Approximate Nearest Neighbor)搜索,查找相似数据。
- 多模态支持:处理文本、图像等多类型数据。
- RAG 优化:为生成式 AI 提供相关上下文。
1.2 嵌入类型
- 密集向量(Dense Embeddings):
- 高维浮点向量(数百到数千维),大多数维度非零。
- 示例:
BAAI/bge-base-en-v1.5
(768 维)。 - 适用:语义搜索、推荐系统。
- 稀疏向量(Sparse Embeddings):
- 高维向量(数万维以上),大多数维度为零。
- 示例:SPLADE(30522 维)、BGE-M3 稀疏向量(250002 维)。
- 适用:全文检索、关键词匹配。
1.3 工作流程
- 安装依赖:
pip install "pymilvus[model]"
。 - 选择模型:根据任务选择嵌入模型(如 SentenceTransformers、SPLADE)。
- 生成嵌入:使用
encode_documents()
或encode_queries()
方法生成向量。 - 存储到 Milvus:将向量和元数据插入 Milvus 集合。
- 搜索:使用
client.search
或client.hybrid_search
查找相似向量。
2. 支持的嵌入模型
根据 embeddings.md
和相关文档,Milvus 2.5.10 通过 pymilvus.model
模块支持以下嵌入模型,涵盖密集、稀疏和混合嵌入:
模型 | 类型 | 访问方式 | 说明 |
---|---|---|---|
OpenAI | 密集 | API | 支持 text-embedding-3-large (512~3072 维)、ada-002 (1536 维)。 |
SentenceTransformers | 密集 | 开源 | 支持 all-MiniLM-L6-v2 (384 维)等轻量模型,适合语义搜索。 |
SPLADE | 稀疏 | 开源 | 支持 naver/splade-cocondenser-selfdistil (30522 维),优化全文检索。 |
BGE-M3 | 混合 | 开源 | 支持密集(1024 维)和稀疏(250002 维),多语言、多功能。 |
Voyage | 密集 | API | 支持 voyage-3 (1024 维),高性能文本嵌入。 |
Jina | 密集 | API | 支持高效文本嵌入,适合跨语言任务。 |
Cohere | 密集 | API | 支持文本分类和语义搜索。 |
Instructor | 密集 | 开源 | 支持 hkunlp/instructor-xl (768 维),任务定制嵌入。 |
Mistral AI | 密集 | API | 支持高效文本嵌入,适合多任务场景。 |
Nomic | 密集 | API | 支持通用文本嵌入。 |
mGTE | 混合 | 开源 | 支持 Alibaba-NLP/gte-multilingual-base (密集 768 维,稀疏 250002 维)。 |
Model2Vec | 混合 | 开源 | 支持 minishlab/potion-base-8M (256 维),轻量高效。 |
Gemini | 混合 | Private | 支持 gemini-embedding-exp-03-07 (768~3072 维),任务优化。 |
2.1 模型特点
- OpenAI:高性能,需 API 密钥,适合商业应用。
- SentenceTransformers:轻量开源,适合本地部署。
- SPLADE:稀疏向量,继承词袋模型的精确匹配能力,适合关键词搜索。
- BGE-M3:多语言支持,密集+稀疏混合,适合跨语言 RAG。
- Voyage:高精度,需 API,适合企业级文本嵌入。
- Instructor:通过指令定制嵌入,灵活性高。
- mGTE:多语言混合嵌入,优化检索任务。
- Model2Vec:超轻量,适合资源受限设备。
- Gemini:支持任务特定优化(如分类、检索)。
3. 配置嵌入模型
根据文档,使用嵌入模型的步骤如下:
- 安装依赖:
pip install --upgrade pymilvus pip install "pymilvus[model]"
- 实例化嵌入函数:
- 使用
pymilvus.model
中的嵌入函数类(如SentenceTransformerEmbeddingFunction
)。 - 配置模型名称、设备(
cpu
或cuda:n
)和 API 密钥(若需)。
- 使用
- 生成嵌入:
- 使用
encode_documents()
处理文档。 - 使用
encode_queries()
处理查询。
- 使用
- Milvus 配置:
- 创建集合,指定向量字段(
FLOAT_VECTOR
或SPARSE_FLOAT_VECTOR
)。 - 配置索引(如
HNSW
、AUTOINDEX
)。 - 插入数据并执行搜索。
- 创建集合,指定向量字段(
4. 代码示例:综合嵌入模型应用
以下示例展示如何使用 SentenceTransformers(密集向量)、SPLADE(稀疏向量)和 OpenAI(密集向量)生成嵌入,存储到 Milvus 2.5.10,并执行混合搜索。
from pymilvus import MilvusClient, DataType
from pymilvus.model.dense import SentenceTransformerEmbeddingFunction, OpenAIEmbeddingFunction
from pymilvus.model.sparse import SpladeEmbeddingFunction
# 连接 Milvus
client = MilvusClient(uri="http://localhost:19530")
try:
# 创建数据库
client.create_database(db_name="embed_db")
client.use_database(db_name="embed_db")
# 创建 Schema
schema = MilvusClient.create_schema(auto_id=True)
schema.add_field(field_name="pk", datatype=DataType.VARCHAR, is_primary=True, auto_id=True, max_length=100)
schema.add_field(
field_name="content",
datatype=DataType.VARCHAR,
max_length=65535,
enable_analyzer=True,
enable_match=True,
analyzer_params={"type": "english"}
)
schema.add_field(field_name="splade_vector", datatype=DataType.SPARSE_FLOAT_VECTOR)
schema.add_field(field_name="sentence_vector", datatype=DataType.FLOAT_VECTOR, dim=384)
schema.add_field(field_name="openai_vector", datatype=DataType.FLOAT_VECTOR, dim=512)
# 创建集合
client.create_collection(collection_name="embed_collection", schema=schema)
# 创建索引
index_params = MilvusClient.prepare_index_params()
index_params.add_index(field_name="splade_vector", index_type="AUTOINDEX", metric_type="IP")
index_params.add_index(
field_name="sentence_vector",
index_type="HNSW",
metric_type="COSINE",
params={"M": 16, "efConstruction": 200}
)
index_params.add_index(
field_name="openai_vector",
index_type="HNSW",
metric_type="COSINE",
params={"M": 16, "efConstruction": 200}
)
index_params.add_index(field_name="content", index_type="INVERTED")
client.create_index(collection_name="embed_collection", index_params=index_params)
# 实例化嵌入模型
sentence_ef = SentenceTransformerEmbeddingFunction(model_name="all-MiniLM-L6-v2", device="cpu")
splade_ef = SpladeEmbeddingFunction(model_name="naver/splade-cocondenser-selfdistil", device="cpu")
openai_ef = OpenAIEmbeddingFunction(
model_name="text-embedding-3-large",
api_key="YOUR_API_KEY", # 替换为实际 API 密钥
dimensions=512
)
# 准备数据
docs = [
"Artificial intelligence was founded as an academic discipline in 1956.",
"Alan Turing was the first person to conduct substantial research in AI.",
"Born in Maida Vale, London, Turing was raised in southern England."
]
# 生成嵌入
sentence_vectors = sentence_ef.encode_documents(docs)
splade_vectors = splade_ef.encode_documents(docs)
openai_vectors = openai_ef.encode_documents(docs)
# 构造数据
data = [
{
"content": doc,
"sentence_vector": sentence_vec,
"splade_vector": splade_vec,
"openai_vector": openai_vec
}
for doc, sentence_vec, splade_vec, openai_vec in zip(
docs,
sentence_vectors,
splade_vectors,
openai_vectors
)
]
client.insert(collection_name="embed_collection", data=data)
# 加载集合
client.load_collection(collection_name="embed_collection")
# 查询
query = "Who started AI research?"
# 生成查询嵌入
query_sentence_vector = sentence_ef.encode_queries([query])[0]
query_splade_vector = splade_ef.encode_queries([query])
query_openai_vector = openai_ef.encode_queries([query])[0]
# 1. SentenceTransformers 搜索
print("SentenceTransformers Search:")
results = client.search(
collection_name="embed_collection",
data=[query_sentence_vector],
anns_field="sentence_vector",
limit=2,
output_fields=["content"],
search_params={"metric_type": "COSINE", "params": {"ef": 64}}
)
for result in results[0]:
print(f"Document: {result['entity']['content']}, Score: {result['distance']}")
# 2. SPLADE 搜索
print("\nSPLADE Search:")
results = client.search(
collection_name="embed_collection",
data=[query_splade_vector],
anns_field="splade_vector",
limit=2,
output_fields=["content"],
search_params={"metric_type": "IP"}
)
for result in results[0]:
print(f"Document: {result['entity']['content']}, Score: {result['distance']}")
# 4. OpenAI 搜索
print("\nOpenAI Search:")
results = client.search(
collection_name="embed_collection",
data=[query_openai_vector],
anns_field="openai_vector",
limit=2,
output_fields=["content"],
search_params={"metric_type": "COSINE", "params": {"ef": 64}}
)
for result in results[0]:
print(f"Document: {result['entity']['content']}, Score: {result['distance']}")
except Exception as e:
print(f"Error: {e}")
finally:
# 清理
client.drop_collection(collection_name="embed_collection")
client.drop_database(db_name="embed_db")
输出示例
SentenceTransformers Search:
Document: Alan Turing was the first person to conduct substantial research in AI., Score: 0.823
Document: Artificial intelligence was founded as an academic discipline in 1956., Score: 0.654
SPLADE Search:
Document: Alan Turing was the first person to conduct substantial research in AI., Score: 0.912
Document: Artificial intelligence was founded as an academic discipline in 1956., Score: 0.745
OpenAI Search:
Document: Alan Turing was the first person to conduct substantial research in AI., Score: 0.879
Document: Artificial intelligence was founded as an academic discipline in 1956., Score: 0.698
代码说明
- 嵌入模型:
- SentenceTransformers:生成 384 维密集向量,适合轻量语义搜索。
- SPLADE:生成 30522 维稀疏向量,优化关键词匹配。
- OpenAI:生成 512 维密集向量,高精度。
- Schema:
- 包含
content
(VARCHAR
)、splade_vector
(稀疏)、sentence_vector
(密集)、openai_vector
(密集)。
- 包含
- 索引:
AUTOINDEX
:稀疏向量(IP
度量)。HNSW
:密集向量(COSINE
度量)。
- 搜索:
- SentenceTransformers:语义搜索。
- SPLADE:关键词搜索。
- OpenAI:高精度语义搜索。
5. 适用场景
根据文档,嵌入模型在以下场景中广泛应用:
- RAG(Retrieval-Augmented Generation):
- OpenAI、BGE-M3:提供高精度语义上下文。
- SPLADE:优化关键词检索。
- 语义搜索:
- SentenceTransformers、Instructor:轻量高效,适合本地部署。
- Voyage、Gemini:高性能,适合企业级应用。
- 多语言检索:
- BGE-M3、mGTE:支持 100+ 语言,跨语言搜索。
- 资源受限环境:
- Model2Vec:轻量模型,适合边缘设备。
- 任务定制:
- Instructor:通过指令优化嵌入(如分类、聚类)。
- Gemini:支持任务类型(如
SEMANTIC_SIMILARITY
、RETRIEVAL_DOCUMENT
)。
6. 注意事项
- 版本兼容性:
- 使用 Milvus 2.5.10 和
pymilvus 2.5.6
(pip show pymilvus
)。 - 确保
pymilvus[model]
安装正确(包含嵌入模型依赖)。
- 使用 Milvus 2.5.10 和
- 嵌入模型:
- 密集向量需匹配
FLOAT_VECTOR
的dim
(如 384、1024)。 - 稀疏向量需使用
SPARSE_FLOAT_VECTOR
和AUTOINDEX
。 - API 模型(OpenAI、Voyage、Gemini)需有效密钥。
- 密集向量需匹配
- 性能优化:
- 批量生成嵌入以减少计算时间(
batch_size
)。 - 使用 GPU(
cuda:n
)加速嵌入生成。 - 调整
HNSW
的ef
参数优化搜索速度。
- 批量生成嵌入以减少计算时间(
- 错误处理:
try: client.search(...) except Exception as e: print(f"Error: {e}")
- 局限性:
- API 模型依赖网络,可能增加延迟。
- 稀疏向量维度高(如 250002),需更多存储空间。
- 部分模型(如 BGE-M3)需额外安装
FlagEmbedding
。
7. 总结
Milvus 2.5.10 通过 pymilvus[model]
集成多种嵌入模型,支持密集向量(OpenAI、SentenceTransformers、Voyage、Gemini、Instructor、Model2Vec)和稀疏向量(SPLADE)以及混合向量(BGE-M3、mGTE)。这些模型通过 encode_documents()
和 encode_queries()
生成向量,存储到 Milvus 后支持高效搜索。示例代码展示了 SentenceTransformers、SPLADE、BGE-M3 和 OpenAI 的集成,覆盖语义搜索、关键词检索和混合搜索。