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适用于需要处理大量文本数据且需要高性能搜索的场景,例如文档检索系统、问答系统、推荐系统等。
实践建议
- 数据预处理:大规模文本数据需要在插入Milvus之前进行清洗和预处理,以提高嵌入生成的质量。
- 结合使用:结合密集和稀疏搜索可以提高搜索结果的相关性和多样性。
- 性能优化:根据具体应用场景调整搜索参数和索引,以获得最佳性能。
如果遇到问题欢迎在评论区交流。
—END—