type
status
date
slug
summary
tags
category
icon
password
comment
Status
20行代码构建一个PDF文件的问答系统
在企业中的文件或者学习的资料通常都是使用PDF文件传输,文件中往往包含了其他来源无法获得的关键非结构化数据。它们可能非常长,并且与纯文本文件不同,通常不能直接输入到大模型的提示词中。
我们将创建一个可以回答关于PDF文件中问题的问答系统,我们可以使用LangChain提供的文档加载器去加载文件,以获取大模型(LLM)可用的文本,然后创建一个 RAG 链去回答问题,并且给出参考引用的来源。
本教程将略过一些在RAG教程中更深入介绍的概念,所以如果您还没有看过,可能需要先去学习相关内容。
加载文档
首先需要加载选择的PDF文件,我们将使用耐克的年度报告,这篇报告长度超过100页,混合了数据图表和文本,你可以选择自己的任何文件。
选择好PDF文档后,下一步就是将文档加载成大语言模型易于理解的文本格式。
这里我们使用
PyPDFLoader
包去读取文件。PyPDFLoader
为我们做了哪些事情呢:- 加载PDF文件到系统内存;
- 然后使用
pypdf
提取文本数据;
- 最终,它为PDF的每一页创建了一个
Document
文档的对象,其中包含页面内容以及一些关于文本在文档中来源位置的元数据。
RAG 问答
现在我们准备好了检索器retrieval需要加载的文档,
- 接下来将使用文本分割器,将文档分割成适应大模型上下文窗口的更小片段。
- 然后将片段保存到向量数据库中。
- 最后就可以使用创建好的向量数据库构建一个retriever 检索器。
最后我们使用Langchain为我们提供的内置构造方法,来构建最终的RAG链
rag_chain
可看到,在返回的结果中不仅包含了最终的答案,还包含了大模型用来生成答案的PDF引用内容。
我们打印一下引用的内容及其元数据,可以看到结果不仅包含了页面内容块的文档,还保留了最初加载它们时的原始元数据,来源和页码:
上面的文章片段来源于的pdf文档及其页码,我们可以使用这些数据来显示答案来自哪个PDF的哪一页,允许用户快速验证答案是基于原始材料的哪些内容。
总结
本文中,我们使用了不到20行代码,创建了一个PDF文件问答系统。该系统能够加载PDF文件,提取文本内容,通过文本分割和向量存储构建检索器,并最终利用RAG链给出问题的回答,同时提供答案的引用来源和元数据。
官网链接:
- Author:小灰
- URL:https://blog.opencontent.cn//article/langchian-pdf-qa
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!