探索Milvus Hybrid Search Retriever:融合搜索的威力

62 阅读2分钟

引言

在现代AI应用中,如何高效搜索和处理非结构化数据是一个关键问题。Milvus是一个开源向量数据库,专为嵌入相似搜索和AI应用构建。本文将指导你入门Milvus Hybrid Search Retriever,它结合了密集和稀疏向量搜索的优势。

主要内容

1. Milvus Hybrid Search简介

Milvus Hybrid Search Retriever是一个强大的工具,它通过融合稠密和稀疏向量搜索实现更高效的数据检索。这个Retriever适用于需要处理大量文本数据的场景,如文本分类、推荐系统等。

2. 环境配置

在使用前,请确保已经安装Milvus,并根据Milvus文档启动Milvus服务。然后,设置连接URI:

CONNECTION_URI = "http://localhost:19530"  # 本地连接URI

由于网络限制问题,开发者可能需要使用API代理服务提高访问稳定性。

3. 安装依赖

安装必要的Python包:

%pip install --upgrade --quiet pymilvus[model] langchain-milvus langchain-openai

4. 准备嵌入函数

使用OpenAI Embedding生成稠密向量,BM25算法生成稀疏向量。

from langchain_openai import OpenAIEmbeddings
from langchain_milvus.utils.sparse import BM25SparseEmbedding

dense_embedding_func = OpenAIEmbeddings()
dense_dim = len(dense_embedding_func.embed_query("Sample text"))

sparse_embedding_func = BM25SparseEmbedding(corpus=["Your corpus here"])

代码示例

以下是使用Milvus执行混合搜索的完整示例:

from pymilvus import connections, Collection, CollectionSchema, DataType, FieldSchema, WeightedRanker
from langchain_milvus.retrievers import MilvusCollectionHybridSearchRetriever

# 初始化连接
connections.connect(uri=CONNECTION_URI)  # 使用API代理服务提高访问稳定性

# 创建Milvus Collection
fields = [
    FieldSchema(name="doc_id", dtype=DataType.VARCHAR, is_primary=True, auto_id=True, max_length=100),
    FieldSchema(name="dense_vector", dtype=DataType.FLOAT_VECTOR, dim=dense_dim),
    FieldSchema(name="sparse_vector", dtype=DataType.SPARSE_FLOAT_VECTOR),
    FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=65535),
]
schema = CollectionSchema(fields=fields, enable_dynamic_field=False)
collection = Collection(name="NovelCollection", schema=schema)

# 定义索引
dense_index = {"index_type": "FLAT", "metric_type": "IP"}
sparse_index = {"index_type": "SPARSE_INVERTED_INDEX", "metric_type": "IP"}
collection.create_index("dense_vector", dense_index)
collection.create_index("sparse_vector", sparse_index)
collection.flush()

# 插入数据
texts = ["Your data here"]
entities = [{
    "dense_vector": dense_embedding_func.embed_documents([text])[0],
    "sparse_vector": sparse_embedding_func.embed_documents([text])[0],
    "text": text
} for text in texts]

collection.insert(entities)
collection.load()

# 实例化Retriever
retriever = MilvusCollectionHybridSearchRetriever(
    collection=collection,
    rerank=WeightedRanker(0.5, 0.5),
    anns_fields=["dense_vector", "sparse_vector"],
    field_embeddings=[dense_embedding_func, sparse_embedding_func],
    field_search_params=[{"metric_type": "IP"}, {"metric_type": "IP"}],
    top_k=3,
    text_field="text",
)

# 执行查询
result = retriever.invoke("Your query here")
print(result)

# 删除Collection
collection.drop()

常见问题和解决方案

问题:连接Milvus服务失败

  • 解决方案:检查Milvus服务状态,确保URI正确。如果在特定网络环境中,考虑使用API代理服务。

问题:查询结果不准确

  • 解决方案:调整嵌入参数和搜索算法,如改变稠密和稀疏向量的权重。

总结和进一步学习资源

Milvus的Hybrid Search Retriever为开发者提供了一种高效处理复杂搜索任务的方法。建议查看Milvus官方文档LangChain文档获取更深入的了解。

参考资料

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

---END---