关于前端:精读利用-GPT-解读-PDF

2次阅读

共计 4392 个字符,预计需要花费 11 分钟才能阅读完成。

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”>

咱们一步步解读:

  1. 找一些库把 PDF 内容文本提取进去。
  2. 把这些文本拆分成 N 份更小的文本,用 openai 进行文本向量化。
  3. 当用户发问时,对用户发问进行向量化,并用数学函数计算与 PDF 已向量化内容的类似水平。
  4. 把最类似的文本发送给 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"] = "***"

默认 langchainopenai 都会拜访 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 许可证)

正文完
 0