使用Weaviate向量存储实现混合搜索
欢迎来到这篇技术博客!今天我们将探讨如何使用Weaviate向量存储和LlamaIndex实现混合搜索。如果你在Colab上打开这个Notebook,你可能需要安装LlamaIndex。
%pip install llama-index-vector-stores-weaviate
!pip install llama-index
设置日志记录
首先,我们设置日志记录以便更好地调试和查看输出。
import logging
import sys
logging.basicConfig(stream=sys.stdout, level=logging.INFO)
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))
创建Weaviate客户端
接下来,我们需要创建一个Weaviate客户端。我们将使用OpenAI的API密钥,并连接到Weaviate集群。
import os
import openai
os.environ["OPENAI_API_KEY"] = "your_openai_api_key"
openai.api_key = os.environ["OPENAI_API_KEY"]
import weaviate
# 连接到云实例
cluster_url = "your_weaviate_cluster_url"
api_key = "your_weaviate_api_key"
client = weaviate.connect_to_wcs(
cluster_url=cluster_url,
auth_credentials=weaviate.auth.AuthApiKey(api_key),
)
# 连接到本地实例
# client = weaviate.connect_to_local()
下载数据
我们将下载一些示例数据,这里以Paul Graham的散文为例。
!mkdir -p 'data/paul_graham/'
!wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/paul_graham/paul_graham_essay.txt' -O 'data/paul_graham/paul_graham_essay.txt'
加载文档
使用LlamaIndex的SimpleDirectoryReader
加载文档。
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
# 加载文档
documents = SimpleDirectoryReader("./data/paul_graham/").load_data()
构建向量存储索引
我们将使用WeaviateVectorStore来构建向量存储索引。
from llama_index.vector_stores.weaviate import WeaviateVectorStore
from llama_index.core import StorageContext
vector_store = WeaviateVectorStore(weaviate_client=client)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
index = VectorStoreIndex.from_documents(
documents, storage_context=storage_context
)
# 注意:你也可以选择手动定义一个index_name。
# index_name = "test_prefix"
# vector_store = WeaviateVectorStore(weaviate_client=client, index_name=index_name)
使用默认向量搜索查询索引
我们可以使用默认的向量搜索来查询索引。
# 设置日志级别为DEBUG以获取更详细的输出
query_engine = index.as_query_engine(similarity_top_k=2)
response = query_engine.query("What did the author do growing up?")
display_response(response)
使用混合搜索查询索引
Weaviate支持混合搜索,结合了bm25和向量搜索。alpha参数决定了权重的分配(alpha = 0 -> bm25,alpha = 1 -> 向量搜索)。默认情况下,alpha=0.75(非常接近向量搜索)。
# 设置日志级别为DEBUG以获取更详细的输出
query_engine = index.as_query_engine(
vector_store_query_mode="hybrid", similarity_top_k=2
)
response = query_engine.query(
"What did the author do growing up?",
)
display_response(response)
设置alpha=0.0以偏向bm25
我们可以将alpha设置为0.0,以偏向bm25搜索。
# 设置日志级别为DEBUG以获取更详细的输出
query_engine = index.as_query_engine(
vector_store_query_mode="hybrid", similarity_top_k=2, alpha=0.0
)
response = query_engine.query(
"What did the author do growing up?",
)
display_response(response)
总结
通过这篇博客,我们学习了如何使用Weaviate向量存储和LlamaIndex实现混合搜索。我们从创建Weaviate客户端开始,下载并加载文档,构建向量存储索引,并使用默认向量搜索和混合搜索进行查询。希望这篇博客对你有所帮助,让你更好地理解和应用这些技术。
如果你有任何问题或需要进一步的帮助,请随时在评论区留言。感谢阅读!