【Milvus】嵌入模型(Embedding Models)的概述、列举和示例代码

感谢你提供的详细文档和明确的需求!我们将专注于 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 工作流程

  1. 安装依赖pip install "pymilvus[model]"
  2. 选择模型:根据任务选择嵌入模型(如 SentenceTransformers、SPLADE)。
  3. 生成嵌入:使用 encode_documents()encode_queries() 方法生成向量。
  4. 存储到 Milvus:将向量和元数据插入 Milvus 集合。
  5. 搜索:使用 client.searchclient.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. 配置嵌入模型

根据文档,使用嵌入模型的步骤如下:

  1. 安装依赖
    pip install --upgrade pymilvus
    pip install "pymilvus[model]"
    
  2. 实例化嵌入函数
    • 使用 pymilvus.model 中的嵌入函数类(如 SentenceTransformerEmbeddingFunction)。
    • 配置模型名称、设备(cpucuda:n)和 API 密钥(若需)。
  3. 生成嵌入
    • 使用 encode_documents() 处理文档。
    • 使用 encode_queries() 处理查询。
  4. Milvus 配置
    • 创建集合,指定向量字段(FLOAT_VECTORSPARSE_FLOAT_VECTOR)。
    • 配置索引(如 HNSWAUTOINDEX)。
    • 插入数据并执行搜索。

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
    • 包含 contentVARCHAR)、splade_vector(稀疏)、sentence_vector(密集)、openai_vector(密集)。
  • 索引
    • AUTOINDEX:稀疏向量(IP 度量)。
    • HNSW:密集向量(COSINE 度量)。
  • 搜索
    • SentenceTransformers:语义搜索。
    • SPLADE:关键词搜索。
    • OpenAI:高精度语义搜索。

5. 适用场景

根据文档,嵌入模型在以下场景中广泛应用:

  • RAG(Retrieval-Augmented Generation)
    • OpenAIBGE-M3:提供高精度语义上下文。
    • SPLADE:优化关键词检索。
  • 语义搜索
    • SentenceTransformersInstructor:轻量高效,适合本地部署。
    • VoyageGemini:高性能,适合企业级应用。
  • 多语言检索
    • BGE-M3mGTE:支持 100+ 语言,跨语言搜索。
  • 资源受限环境
    • Model2Vec:轻量模型,适合边缘设备。
  • 任务定制
    • Instructor:通过指令优化嵌入(如分类、聚类)。
    • Gemini:支持任务类型(如 SEMANTIC_SIMILARITYRETRIEVAL_DOCUMENT)。

6. 注意事项

  • 版本兼容性
    • 使用 Milvus 2.5.10 和 pymilvus 2.5.6pip show pymilvus)。
    • 确保 pymilvus[model] 安装正确(包含嵌入模型依赖)。
  • 嵌入模型
    • 密集向量需匹配 FLOAT_VECTORdim(如 384、1024)。
    • 稀疏向量需使用 SPARSE_FLOAT_VECTORAUTOINDEX
    • API 模型(OpenAI、Voyage、Gemini)需有效密钥。
  • 性能优化
    • 批量生成嵌入以减少计算时间(batch_size)。
    • 使用 GPU(cuda:n)加速嵌入生成。
    • 调整 HNSWef 参数优化搜索速度。
  • 错误处理
    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 的集成,覆盖语义搜索、关键词检索和混合搜索。

Azure Open AI Embedding是一种嵌入模型,通过使用Azure平台上的开放AI服务,可以将文本转换为高维向量表示。这种嵌入模型可以用于自然语言处理、推荐系统等领域,帮助我们更好地理解处理文本数据。在使用Azure Open AI Embedding时,我们可以利用Azure的强大计算资源高效的API接口,快速获取到所需的文本嵌入表示。 Milvus本地向量数据库是一种针对大规模向量数据的高性能数据库。它提供了快速的向量相似度搜索存储功能,可以高效地应用于图像识别、人脸识别、文本检索等领域。在搭建Milvus本地向量数据库的单例安装使用时,我们可以通过简单的配置管理,快速部署本地向量检索系统,并且能够自由定制化自己的向量索引。 对于私有模型的应用,可以将Azure Open AI Embedding模型Milvus本地向量数据库结合起来。首先,可以使用Azure Open AI Embedding模型将文本数据转换为向量表示,然后将这些向量存储到Milvus本地向量数据库中进行索引检索。这样可以实现自己的定制化文本嵌入表示快速的向量相似度搜索。同时,我们也可以通过对Milvus本地向量数据库进行单例安装私有化部署,更好地保护自己的数据模型隐私。这样的集成应用可以帮助我们更好地理解处理大规模文本数据,并且能够高效地进行相似度搜索检索。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彬彬侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值