引言
随着大型语言模型 (LLM) 的日益流行,我们知道如何利用这些模型来解决特定的问题变得越来越重要。生成式人工智能是一种强大的工具,在各行各业都有广泛应用。本文将指导你创建一个简单的文档摘要应用,并使用 OpenAI 提供的 LLM 来实现。
文档摘要小能手
我们将建立一个网页应用,用户可以上传 PDF 文件,然后通过调用 OpenAI 的大模型来为该文件生成一份简洁的摘要。这可以帮助我们快速了解大型文档的内容,而不需要完整阅读它。
虽然使用 ChatGPT 在线就能解决这种问题,但如果你需要处理成百上千份文档的话,还是建立一个独立的应用更有必要。此外,在撰写本文时,ChatGPT 对单个文件大小限制为 512MB。如果想在公司的现有应用中集成这一功能,了解如何用代码实现这一点就很有用了。
小贴士
- Streamlit: 这是一个开源的 Python 框架,帮助工程师快速构建网页应用,无需单独搭建前端框架。我们将使用 Streamlit 来构建一个基本的前端界面。
- 大型语言模型 (LLM): 如果你在数据领域工作的话,你应该已经知道 LLM 是什么了。本文中,我们会通过 OpenAI API 生成文档摘要。要调用 OpenAI 的 API 需要有一定的成本,并不是免费提供的。比如 GPT 3.5 Turbo 大约是每百万 token 花费 $1.50。当然,你也可以选择其他一些免费的大模型,如 Llama、Google PALM 和 Hugging face 提供的 LLM 模型。
Embeddings: 文本的魔法变身
在自然语言处理(NLP)的世界里,嵌入就像是文本的魔法师。它们将文字、句子甚至文档转换成连续的向量空间,捕捉到其中蕴含的意义和关系。相似的内容,在这个神奇的空间里也会变得亲近起来。
组装代码拼图
为了保持我们的程序模块化,我们将整个项目分为两个主要部分(Python脚本):
- Streamlit前端代码:这部分包含网页的头部、文本显示区域、输入框以及文件上传按钮等。
- 辅助函数后端处理:这部分负责加载数据、生成嵌入向量、创建向量数据库,并调用大模型来获取回复。
这样做的好处是,即使项目规模扩大,我们的代码也能保持整洁和模块化,不会变得一团糟。
Streamlit前端代码
首先,你需要安装Streamlit库:
bash
pip install streamlit
然后,在你的Python文件中导入需要的库。我们从辅助函数脚本langchain_function.py
导入了名为summarize_article()
的功能模块:
python
import streamlit as st
from langchain_function import summarize_article
这里,我们使用Streamlit的subheader
和write
功能创建了一个副标题,并在网页上显示了一些文本。接着,我们利用file_uploader
函数添加了文件上传按钮。由于我们的项目只处理PDF文档,所以我们将类型设置为'pdf'。
python
st.subheader("欢迎来到摘要工具")
st.write("请上传PDF文件")
selection = st.sidebar.file_uploader('请选择一个.pdf文件', type='pdf')
if selection:
response = summarize_article(selection)
st.write(response)
辅助函数
在接下来的部分,我们将详细介绍这个神奇的summarize_article()
函数是如何工作的。
现在,我们来聊聊辅助函数的部分。第一步是设置一个 API 密钥以访问 OpenAI 的 API 吧!这个密钥可是相当保密的哦,每个人都要自己生成一个,而且绝对不能和别人共享哟。在下面的代码中,请用你的密钥替换 openai_key 哦!
python
from OpenAIKey import openai_key
os.environ['OPENAI_API_KEY'] = openai_key
别忘了安装以下库哦(使用 pip install
):
需要安装的库
ini
langchain
langchain_community
openai==0.28.0
tiktoken
faiss_cpu
接下来,就是导入需要用到的库啦!
python
import os
import pickle
from langchain.llms import OpenAI
from langchain_community.document_loaders import PyPDFLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.embeddings import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
from langchain.chains import RetrievalQAWithSourcesChain
然后,我们要把通过 Streamlit 网页上传的 PDF 文件保存到本地存储哦。在这个例子中我们只使用一个 PDF 文件,并且把它存放在本地,当然如果文件较大也可以选择存在云端呢。
本地保存上传的 PDF 文件
python
with open(selection.name, 'wb') as w:
w.write(selection.getvalue())
好了,现在用 PyPDFLoader(这是专门为处理 PDF 文件设计的哦)来加载 PDF 文件到文档列表中。如果是其他类型的文件,就需要使用不同的 loader 哟!
如果找到了有效的文件,则使用 PyPDFLoader 加载
python
loader = PyPDFLoader(selection.name)
data = loader.load()
print("文件已上传!!")
为了让信息检索更高效,我们需要用 text splitter 将输入数据分割成可以管理的块。这里我们用了 RecursiveCharacterTextSplitter,当然还有其他各种类型的 text splitters 可以选择哦!更多关于文本分割器的信息可以在 langchain 文档中找到。
文本分割
python
text_splitter = RecursiveCharacterTextSplitter(separators=['\n\n', '\n', '.', ','],
chunk_size=1000)
docs = text_splitter.split_documents(data)
这样,我们就完成了辅助函数的设置啦!希望这过程能让你觉得轻松有趣,如果你有任何问题或者建议,请随时告诉我哦。
创建嵌入
嘿,小伙伴们!我们要开始一段神奇的冒险了。首先,我们需要用 OpenAI 的魔法棒生成一些奇妙的"嵌入"------没错,就是那种能让文档变得超乎想象的东西。
python
# <!-- CODE_BLOCK_1 -->
embeddings=OpenAIEmbeddings()
vectorstore_openai=FAISS.from_documents(docs, embeddings)
with open(file_path, "wb") as f:
pickle.dump(vectorstore_openai, f)
看,我们已经把文档的魔法力量(嵌入)存储起来了,并且用一个叫"pickle"的神秘咒语封存了它。哇哦!
调用 OpenAI 模型
接下来,我们要调用一个强大的 AI 魔法师,让它来回答我们的疑问。首先,我们需要从上次封印的地方开始,也就是加载之前保存的魔法力量(向量数据库)。
python
# <!-- CODE_BLOCK_2 -->
llm=OpenAI(temperature=0.6, max_tokens=1000)
if os.path.exists(file_path):
with open(file_path, "rb") as r:
vectorstore=pickle.load(r)
chain=RetrievalQAWithSourcesChain.from_llm(llm=llm,
retriever=vectorstore.as_retriever())
现在,我们准备好了魔法链(chain),等着提问呢。来吧,让我们试着问一些有趣的问题:
python
query=("Can you describe what is the pdf document about and summarize the document in 5 bullet points?")
result=chain({"question" : query}, return_only_outputs=True)
return result["answer"]
看,我们用一个小小的咒语(问题)来召唤出强大 AI 的回答!
执行代码
最后一步超级简单!只需要在命令行输入 streamlit run main.py
就可以了。然后点击本地 URL 进入神奇的世界。
图片时间
-
图2 展示了初始的网页,看起来是不是很酷呢?
-
然后我们就可以上传一个 PDF 文档啦!只需按一下"浏览文件"按钮,魔法就开始了!
-
当你上传完 PDF 后,AI 就会用它那强大的智慧(LLM)来总结文档,并把结果展示在屏幕上。
结论
哇哦!我们就这样完成了整个流程。现在你可以享受 AI 的魔法力量了,快去试试吧!
创建了一个应用,利用大语言模型(LLMs)的力量来总结PDF文档。这个应用场景可以扩展到处理多种文件类型,包括但不限于PDF、Word文档和JPEG等图片文件。我们还可以集成URL链接,指向新闻或阅读文章。另一个潜在的应用场景是添加一个问答框,允许用户输入问题并得到基于上传文档的回答。组织内部使用LLMs的场景数不胜数哦!我们的目标就是通过这个例子展示如何利用数据有效调用大语言模型。
当然啦,应用场景远不止这些呢!重要的是要找到你个人或职业生活中可以应用LLMs来提高效率的具体情景。