引言
在处理不断更新的数据时,保持索引的最新性是一个重要的问题。在本文中,我们将介绍如何使用LlamaIndex管理来自Discord的文档数据,并展示如何增量更新索引而不重复数据。
创建初始索引
首先,假设我们有一个从Discord中#issues-and-help频道定期导出的目录文件。为了确保我们的索引始终包含最新数据,我们将建立一个初始索引。
以下代码块展示了如何处理初始数据并创建索引:
import json
import os
from llama_index.core import Document, VectorStoreIndex
# 读取数据
with open("./discord_dumps/help_channel_dump_05_25_23.json", "r") as f:
data = json.load(f)
threads = data["messages"] # 处理数据并将其转化为线程形式
# 创建Document对象
documents = []
for thread in threads:
thread_text = thread["content"]
thread_id = thread["id"]
timestamp = thread["timestamp"]
documents.append(
Document(text=thread_text, id_=thread_id, metadata={"date": timestamp})
)
# 创建索引
index = VectorStoreIndex.from_documents(documents)
# 检查索引中实际摄取的文档
print("ref_docs ingested: ", len(index.ref_doc_info))
print("number of input documents: ", len(documents))
# 保存初始索引
index.storage_context.persist(persist_dir="./storage")
# 加载索引以确认保存成功
from llama_index.core import StorageContext, load_index_from_storage
index = load_index_from_storage(
StorageContext.from_defaults(persist_dir="./storage")
)
print("Double check ref_docs ingested: ", len(index.ref_doc_info))
增量更新索引
当我们有新的数据转储时,可以使用refresh()
函数进行增量更新,而无需从头开始构建索引。
以下代码展示了如何处理新的数据并增量更新索引:
# 读取新数据
with open("./discord_dumps/help_channel_dump_06_02_23.json", "r") as f:
data = json.load(f)
new_threads = data["messages"]
# 创建新的Document对象
new_documents = []
for thread in new_threads:
thread_text = thread["content"]
thread_id = thread["id"]
timestamp = thread["timestamp"]
new_documents.append(
Document(text=thread_text, id_=thread_id, metadata={"date": timestamp})
)
print("Number of new documents: ", len(new_documents) - len(documents))
# 增量更新索引
refreshed_docs = index.refresh(
new_documents,
update_kwargs={"delete_kwargs": {"delete_from_docstore": True}},
)
print("Number of newly inserted/refreshed docs: ", sum(refreshed_docs))
可能遇到的错误
-
文件未找到错误:
- 错误信息:
FileNotFoundError: [Errno 2] No such file or directory: './discord_dumps/help_channel_dump_05_25_23.json'
- 解决方法:确保数据文件路径正确并且文件存在。
- 错误信息:
-
JSON解析错误:
- 错误信息:
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
- 解决方法:确认输入文件是有效的JSON格式。
- 错误信息:
-
索引更新错误:
- 错误信息:
AttributeError: 'Field' object has no attribute 'get'
- 解决方法:此错误可能是由于数据格式不一致或索引的API版本不匹配造成的。检查文档和数据格式的正确性以及使用的API版本。
- 错误信息:
参考资料
- LlamaIndex官方文档:http://example.com
- Python
json
模块文档:https://docs.python.org/3/library/json.html - LlamaIndex API参考:http://example.com
如果你觉得这篇文章对你有帮助,请点赞,关注我的博客,谢谢!