本案例展示了如何使用LlamaIndex从PDF文档中获取信息,并在回答中提供准确的页码引用,同时支持流式响应输出。
1. 案例目标
本案例的主要目标是:
- 演示如何从PDF文档中提取内容并建立索引
- 展示如何在查询响应中包含准确的页码引用
- 实现流式响应输出,提高用户体验
- 提供源节点检查功能,便于验证引用的准确性
2. 技术栈与核心依赖
- LlamaIndex- 用于文档索引和查询的核心框架
- llama-index-llms-openai- OpenAI语言模型集成
- SimpleDirectoryReader- 用于读取PDF文档
- VectorStoreIndex- 用于创建向量索引
- OpenAI- GPT-3.5-turbo模型作为语言模型
核心依赖安装:
%pip install llama-index-llms-openai !pip install llama-index3. 环境配置
案例需要配置OpenAI API,初始化语言模型:
from llama_index.llms.openai import OpenAI llm = OpenAI(temperature=0, model="gpt-3.5-turbo")4. 案例实现
4.1 数据准备
首先需要下载示例PDF文档(Lyft 2021年10K报告):
!mkdir -p 'data/10k/' !wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/examples/data/10k/lyft_2021.pdf' -O 'data/10k/lyft_2021.pdf'4.2 文档加载与索引构建
使用SimpleDirectoryReader加载PDF文档,并创建向量索引:
from llama_index.core import SimpleDirectoryReader, VectorStoreIndex # 加载PDF文档 reader = SimpleDirectoryReader(input_files=["./data/10k/lyft_2021.pdf"]) data = reader.load_data() # 创建向量索引 index = VectorStoreIndex.from_documents(data)4.3 查询引擎配置
创建支持流式响应的查询引擎,并设置返回最相似的3个文档片段:
query_engine = index.as_query_engine(streaming=True, similarity_top_k=3)4.4 执行查询与流式响应
执行查询并获取带有页码引用的流式响应:
response = query_engine.query( "What was the impact of COVID? Show statements in bullet form and show" " page reference after each statement." ) response.print_response_stream()4.5 源节点检查
检查响应的源节点,验证引用的准确性:
for node in response.source_nodes: print("-----") text_fmt = node.node.get_content().strip().replace("\n", " ")[:1000] print(f"Text:\t {text_fmt} ...") print(f"Metadata:\t {node.node.metadata}") print(f"Score:\t {node.score:.3f}")5. 案例效果
案例实现了以下效果:
- 页码引用:每个回答条目都包含准确的页码引用,如"(page 6)"
- 流式输出:回答以流式方式逐步输出,提高用户体验
- 相关性评分:每个源节点都有相关性评分,如"Score: 0.821"
- 元数据展示:显示文档元数据,包括文件名和页码标签
示例输出
• The ongoing COVID-19 pandemic continues to impact communities in the United States, Canada and globally (page 6).
• The pandemic and related responses caused decreased demand for our platform leading to decreased revenues as well as decreased earning opportunities for drivers on our platform (page 6).
• Our business continues to be impacted by the COVID-19 pandemic (page 6).
6. 案例实现思路
本案例的核心实现思路是:
- 元数据提取:利用PDF加载器自动提取页码信息作为元数据
- 向量索引:将文档内容转换为向量并建立索引,支持语义搜索
- 查询处理:将用户查询转换为向量,在索引中查找最相关的文档片段
- 响应生成:将找到的相关片段和元数据传递给语言模型生成回答
- 引用注入:在生成的回答中自动注入源文档的页码引用
7. 扩展建议
- 多文档支持:扩展为支持多个PDF文档的索引和查询,并在引用中包含文档名
- 精确引用:不仅提供页码,还可以提供段落或章节级别的精确引用
- 引用格式自定义:允许用户自定义引用格式,如APA、MLA等学术引用格式
- 交互式界面:开发Web界面,提供更友好的查询和结果展示体验
- 多语言支持:扩展支持非英语文档的索引和查询
- 引用验证:添加引用验证功能,确保引用的准确性和可靠性
8. 总结
本案例展示了LlamaIndex在文档引用和页码标注方面的强大功能。通过结合PDF加载器的元数据提取能力和向量索引的语义搜索能力,实现了准确、可靠的文档引用系统。这种技术在学术研究、法律文档分析、企业知识库等领域具有广泛的应用前景,能够大大提高信息检索的准确性和可信度。