使用 Milvus Hybrid Search Retriever:结合密集和稀疏向量搜索

Milvus Hybrid Search Retriever 使用指南

Milvus是一款开源向量数据库,专为提升嵌入相似性搜索和AI应用而构建。它使得非结构化数据搜索更加便捷,并在不同的部署环境中提供一致的用户体验。本文将帮助您开始使用Milvus Hybrid Search Retriever,这种检索器结合了密集和稀疏向量搜索的优势。有关所有Milvus Collection Hybrid Search Retriever功能和配置的详细文档,请参阅API参考。


技术背景介绍

Milvus作为一款强大的向量数据库,特别适合处理嵌入搜索任务。它能够高效管理和搜索大规模向量数据,支持密集和稀疏向量的混合搜索,为不同类型的AI应用提供强有力的支持。


核心原理解析

Milvus Hybrid Search Retriever结合密集向量搜索和稀疏向量搜索,使得搜索性能更为优越。密集向量主要通过深度学习模型产生,而稀疏向量则可通过传统的文本检索方法(如BM25算法)生成,结合两者进行搜索可以兼顾搜索的广度和深度。


代码实现演示

下面的代码示例演示了如何使用Milvus和OpenAI来设置一个混合搜索检索器。

环境安装

首先安装所需的Python包:

%pip install --upgrade --quiet pymilvus[model] langchain-milvus langchain-openai

启动Milvus服务

启动Milvus服务并指定连接URI:

CONNECTION_URI = "http://localhost:19530"

准备OpenAI API密钥

export OPENAI_API_KEY=<your_api_key>

准备数据嵌入功能

假设我们有一组小说的描述文本:

texts = [
    # 示例文本...
]

生成密集和稀疏向量:

dense_embedding_func = OpenAIEmbeddings()
sparse_embedding_func = BM25SparseEmbedding(corpus=texts)

创建Milvus集合并加载数据

connections.connect(uri=CONNECTION_URI)

fields = [
    FieldSchema(name="doc_id", dtype=DataType.VARCHAR, is_primary=True, auto_id=True, max_length=100),
    FieldSchema(name="dense_vector", dtype=DataType.FLOAT_VECTOR, dim=dense_dim),
    FieldSchema(name="sparse_vector", dtype=DataType.SPARSE_FLOAT_VECTOR),
    FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=65_535),
]

schema = CollectionSchema(fields=fields, enable_dynamic_field=False)
collection = Collection(name="IntroductionToTheNovels", schema=schema, consistency_level="Strong")

# 插入数据
entities = [{"dense_vector": dense_embedding_func.embed_documents([text])[0], "sparse_vector": sparse_embedding_func.embed_documents([text])[0], "text": text} for text in texts]
collection.insert(entities)
collection.load()

实例化检索器

retriever = MilvusCollectionHybridSearchRetriever(
    collection=collection,
    rerank=WeightedRanker(0.5, 0.5),
    anns_fields=["dense_vector", "sparse_vector"],
    field_embeddings=[dense_embedding_func, sparse_embedding_func],
    field_search_params=[{"metric_type": "IP"}, {"metric_type": "IP"}],
    top_k=3,
    text_field="text",
)

使用检索器

results = retriever.invoke("What are the story about ventures?")

在应用链中使用

定义一个问答链并执行查询:

llm = ChatOpenAI()

prompt = PromptTemplate(template=PROMPT_TEMPLATE, input_variables=["context", "question"])

rag_chain = (
    {"context": retriever | format_docs, "question": RunnablePassthrough()}
    | prompt
    | llm
    | StrOutputParser()
)

answer = rag_chain.invoke("What novels has Lila written and what are their contents?")

删除集合

collection.drop()

应用场景分析

Milvus Hybrid Search Retriever适用于需要处理大量文本数据且需要高性能搜索的场景,例如文档检索系统、问答系统、推荐系统等。


实践建议

  1. 数据预处理:大规模文本数据需要在插入Milvus之前进行清洗和预处理,以提高嵌入生成的质量。
  2. 结合使用:结合密集和稀疏搜索可以提高搜索结果的相关性和多样性。
  3. 性能优化:根据具体应用场景调整搜索参数和索引,以获得最佳性能。

如果遇到问题欢迎在评论区交流。

—END—

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值