ChatPDF 最近比拟火,上传 PDF 文件后,即可通过问答的形式让他帮你总结内容,比方让它帮你概括外围观点、询问问题,或者做观点判断。
背地用到了几个比拟时尚的技术,还好有 ChatGPT for YOUR OWN PDF files with LangChain 解释了背地的原理,我感觉十分精彩,因而记录下来并做一些思考,心愿能够帮到大家。
技术思路概括
因为 GPT 十分弱小,只有你把 PDF 文章内容发给他,他就能够解答你对于该文章的任何问题了。– 全文完。
等等,那么为什么要提到 langChain 与 vector dataBase?因为 PDF 文章内容太长了,间接传给 GPT 很容易超出 Token 限度,就算他容许无限度的 Token 传输,可能一个问题可能须要破费 10~100 美元,这个 老本 也是不可承受的。
因而黑魔法来了,下图截取自视频 ChatGPT for YOUR OWN PDF files with LangChain:
<img width=600 src=”https://s1.ax1x.com/2023/04/16/p9CCejs.png”>
咱们一步步解读:
- 找一些库把 PDF 内容文本提取进去。
- 把这些文本拆分成 N 份更小的文本,用 openai 进行文本向量化。
- 当用户发问时,对用户发问进行向量化,并用数学函数计算与 PDF 已向量化内容的类似水平。
- 把最类似的文本发送给 openai,让他总结并答复你的问题。
利用 GPT 解读 PDF 的实现步骤
我把视频里每一步操作从新介绍一遍,并补上本人的了解。
登录 colab
你能够在本地电脑运行 python 一步步执行,也能够间接登录 colab 这个 python 运行平台,它提供了很不便的 python 环境,并且能够一步步执行代码并保留,非常适合做钻研。
只有你有谷歌账号就能够应用 colab。
装置依赖
要运行一堆 gpt 相干函数,须要装置一些包,尽管实质上都是一直给 gpt openapi 发 http 申请,但封装后的确会语义化很多:
!pip install langchain
!pip install openai
!pip install PyPDF2
!pip install faiss-cpu
!pip install tiktoken
其中 tiktoken
包是教程里没有的,我执行某处代码时被提醒短少这个包,大家能够提前按上。接下来提前引入一些前面须要用到的函数:
from PyPDF2 import PdfReader
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import ElasticVectorSearch, pinecone, Weaviate, FAISS
定义 openapi token
为了调用 openapi 服务,须要先申请 token,当你申请到 token 后,通过如下形式定义:
import os
os.environ["OPENAI_API_KEY"] = "***"
默认 langchain
与 openai
都会拜访 python 环境的 os.environ
来寻找 token,所以这里定义后,接下来就能够间接调用服务了。
如果你还没有 GPT openapi 的账号,详见 保姆级注册教程。(惋惜的是中国被墙了,为了学习第一手陈腐常识,你须要本人找 vpn,甚至花钱买国外手机号验证码接管服务,尽管过程比拟崎岖,但亲测可行)。
读取 PDF 内容
为了不便在 colab 平台读取 PDF,你能够先把 PDF 上传到本人的 Google Drive,它是谷歌推出的集体云服务,集成了包含 colab 与文件存储等所有云服务(PS:微软相似的服务叫 One Drive,好吧,实践上你用哪个巨头的服务都行)。
传上去之后,在 colab 运行如下代码,会弹开一个受权网页,受权后就能够拜访你的 drive 门路下资源了:
from google.colab import drive
drive.mount('/content/gdrive', force_remount=True)
root_dir = "/content/gdrive/My Drive/"
reader = PdfReader('/content/gdrive/My Drive/2023_GPT4All_Technical_Report.pdf')
咱们读取了 2023_GPT4All_Technical_Report.pdf
报告,这是一个号称本地可跑对标 GPT4 的服务(测评)。
将 PDF 内容文本化并拆分为多个小 chunk
首先执行如下代码读取 PDF 文本内容:
raw_text = ''
for i, page in enumerate(reader.pages):
text = page.extract_text()
if text:
raw_text += text
接下来要为调用 openapi 服务对文本向量化做筹备,因为一次调用的 token 数量有限度,因而咱们须要将一大段文本拆分为若干小文本:
text_splitter = CharacterTextSplitter(
separator = "\n",
chunk_size = 1000,
chunk_overlap = 200,
length_function = len,
)
texts = text_splitter.split_text(raw_text)
其中 chunk_size=1000
示意一个 chunk 有 1000 个字符,而 chunk_overlap
示意下一个 chunk 会反复上一个 chunk 最初 200 字符的内容,不便给每个 chunk 做连接,这样能够让找相似性的时候尽量多找几个 chunk,找到更多的上下文。
向量化来了!
最重要的一步,利用 openapi 对之前拆分好的文本 chunk 做向量化:
embeddings = OpenAIEmbeddings()
docsearch = FAISS.from_texts(texts, embeddings)
就是这么简略,docsearch
是一个封装对象,在这一步曾经循环调用了若干次 openapi 接口将文本转化为十分长的向量。
文本向量化又是一个深水区,能够看下这个 介绍视频,简略来说就是一把文本转化为一系列数字,示意 N 维的向量,利用数学计算类似度,能够把文字处理转化为间断的数字进行数学解决,甚至进行文字加减法(比方 北京 - 中国 + 美国 = 华盛顿)。
总之这一步之后,咱们本地就拿到了各段文本与其向量的对应关系,比方“这是一段文字”对应的向量为 [-0.231, 0.423, -0.2347831, ...]
。
利用 chain 生成问答服务
接下来要串起残缺流程了,初始化一个 QA chain 示意与 GPT 应用 chat 模型进行问答:
from langchain.chains.question_answering import load_qa_chain
from langchain.llms import OpenAI
chain = load_qa_chain(OpenAI(), chain_type="stuff")
接下来就能够问他 PDF 相干问题了:
query = "who are the main author of the article?"
docs = docsearch.similarity_search(query)
chain.run(input_documents=docs, question=query)
# The main authors of the article are Yuvanesh Anand, Zach Nussbaum, Brandon Duderstadt, Benjamin Schmidt, and Andriy Mulyar.
当然也能够用中文发问,openapi 会调用内置模块翻译给你:
query = "训练 GPT4ALL 的老本是多少?"
docs = docsearch.similarity_search(query)
chain.run(input_documents=docs, question=query)
# 依据文章,大概四天的工作,800 美元的 GPU 老本(包含几次失败的训练)和 500 美元的 OpenAI API 开销。咱们公布的模型 gpt4all-lora 大概在 Lambda Labs DGX A100 8x 80GB 上须要八个小时的训练,总成本约为 100 美元。
QA 环节产生了什么?
依据我的了解,当你问出 who are the main author of the article?
这个问题时,产生了如下几步。
第一步:调用 openapi 将问题进行向量化,失去一堆向量。
第二步:利用数学函数与本地向量数据库进行匹配,找到匹配度最高的几个文本 chunk(之前咱们拆分的 PDF 文本内容)。
第三步:把这些相关度最高的文本发送给 openapi,让他帮咱们演绎。
对于第三步是否联合了 langchain 进行多步骤对答还不得而知,下次我筹备抓包看一下这个程序与 openapi 的通信内容,能力解开其中的机密。
当然,如果问题须要联合 PDF 所有内容能力概括进去,这种向量匹配的形式就不太行了,因为他总是发送与问题最相干的文本片段。然而呢,因为第三步的机密还没有解决,很有可能当内容片段不够时,gpt4 会询问寻找更多类似片段,这样一直反复晓得 gpt4 感觉能够答复了,再给出答案(想想感觉后背一凉)。
总结
解读 PDF 的技术思路还能够用在任意问题上,比方网页搜寻:
网页搜寻就是一个典型的从常识陆地里搜寻要害信息并解读的场景,只有背地将所有网页信息向量化,存储在某个向量数据库,就能够做一个 GPT 搜索引擎了,步骤是:一、将用户输出关键字分词并向量化。二:在数据库进行向量匹配,把匹配度最高的几个网页内容提取进去。三:把这些内容喂给 GPT,让他总结外面的常识并答复用户问题。
向量化能够解决任意场景模糊化匹配,比方我本人的备忘录会存储许多平台账号与明码,但有一天搜寻 ChatGPT 明码却没搜到,起初发现关键词写成了 OpenAPI。向量化就能够解决这个问题,他能够将无奈匹配的关键词也在备忘录里搜寻到。
配合向量化搜寻,再加上 GPT 的思考与总结能力,一个超级 AI 助手可做的事将会远远超过咱们的设想。
留给大家一个思考题:联合向量化与 GPT 这两个能力,你还能想到哪些应用场景?
探讨地址是:精读《利用 GPT 解读 PDF》· Issue #479 · dt-fe/weekly
如果你想参加探讨,请 点击这里,每周都有新的主题,周末或周一公布。前端精读 – 帮你筛选靠谱的内容。
关注 前端精读微信公众号
<img width=200 src=”https://img.alicdn.com/tfs/TB165W0MCzqK1RjSZFLXXcn2XXa-258-258.jpg”>
版权申明:自在转载 - 非商用 - 非衍生 - 放弃署名(创意共享 3.0 许可证)