引言
在现代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---