在AI浪潮风起云涌的当下,AI正在不断地重塑着每一个行业。笔者的目标是在公众号中把所有当下流行的AI应用都梳理一遍,在整理技术拓展思路的同时也给大家做一个科普。有一段时间没有介绍aigc相关的应用了,今天翻到了一个很早之前调研过的火了很久的一个项目—pdfGPT。
PDF GPT允许你使用GPT功能与上传的PDF文件进行聊天。这时候看过笔者推文的同学就会问,这个项目和Quivr有什么区别呢?实际上,这个项目比Quivr要早,只是Quivr适配了更多的数据类型,比如文本、图片、代码片段,应有尽有。对Quivr感兴趣的可以翻一下之前的文章:Quivr - 你的第二个大脑,由AIGC赋能
本篇文章的目的更多是为了整理和科普,后面笔者会输出一些AI实战应用的文章,小伙伴们可以持续关注一下。 本篇的pdfGPT项目的github地址为:https://github.com/bhaskatripathi/pdfGPT
演示
1.演示URL : https://bit.ly/41ZXBJM
注意 : 如果你喜欢这个项目,请给它点赞!
问题描述 :
1.当你向Open AI传递大量文本时,它会受到4K令牌限制。它不能将整个pdf文件作为输入 2.Open AI有时会变得过于健谈,并返回与你的查询无直接关系的无关应答。这是因为Open AI使用了质量较差的嵌入。 3.ChatGPT不能直接与外部数据进行交互。一些解决方案使用Langchain,但如果没有正确实现,它会消耗大量的令牌。 4.有许多解决方案,如https://www.chatpdf.com, https://www.bespacific.com/chat-with-any-pdf, https://www.filechat.io,它们的内容质量较差,容易产生幻觉问题。避免幻觉并提高真实性的一个好方法是使用改进的嵌入。为了解决这个问题,我建议使用Universal Sentence Encoder系列算法来改进嵌入(在这里阅读更多:https://tfhub.dev/google/collections/universal-sentence-encoder/1)。
解决方案: 什么是PDF GPT ?
1.PDF GPT允许你使用GPT功能与上传的PDF文件进行聊天。 2.该应用程序智能地将文档分解成更小的块,并使用强大的Deep Averaging Network Encoder生成嵌入。 3.首先在你的pdf内容上进行语义搜索,然后将最相关的嵌入传递给Open AI。 4.自定义逻辑生成精确的响应。返回的响应甚至可以在方括号([])中引用信息所在的页码,增加了响应的可信度,帮助快速定位相关信息。这些响应比Open AI的原始响应要好得多。 5.Andrej Karpathy在这篇文章中提到,对于类似的问题,KNN算法是最合适的:https://twitter.com/karpathy/status/1647025230546886658 6.使用langchain-serve[1] 在生产环境中启用API。
Docker
运行docker-compose -f docker-compose.yaml up
使用Docker compose。
使用langchain-serve[2]在生产环境中使用pdfGPT
本地游乐场
1.在一个终端上运行lc-serve deploy local api
使用langchain-serve将应用程序作为API暴露出来。
2.在另一个终端上运行python app.py
进行本地gradio游乐场。
3.在你的浏览器上打开http://localhost:7860
并与应用程序进行交互。
云部署
通过在Jina Cloud[3]上部署使pdfGPT
生产就绪。
lc-serve deploy jcloud api
显示命令输出【公众号格式问题,请移步原文】
使用cURL进行交互
(将URL更改为你自己的端点)
PDF url
curl -X 'POST' \
'https://langchain-3ff4ab2c9d.wolf.jina.ai/ask_url' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"url": "https://uiic.co.in/sites/default/files/uploads/downloadcenter/Arogya%20Sanjeevani%20Policy%20CIS_2.pdf",
"question": "What'\''s the cap on room rent?",
"envs": {
"OPENAI_API_KEY": "'"${OPENAI_API_KEY}"'"
}
}'
{"result":" Room rent is subject to a maximum of INR 5,000 per day as specified in the Arogya Sanjeevani Policy [Page no. 1].","error":"","stdout":""}
PDF文件
QPARAMS=$(echo -n 'input_data='$(echo -n '{"question": "What'\''s the cap on room rent?", "envs": {"OPENAI_API_KEY": "'"${OPENAI_API_KEY}"'"}}' | jq -s -R -r @uri))
curl -X 'POST' \
'https://langchain-3ff4ab2c9d.wolf.jina.ai/ask_file?'"${QPARAMS}" \
-H 'accept: application/json' \
-H 'Content-Type: multipart/form-data' \
-F 'file=@Arogya_Sanjeevani_Policy_CIS_2.pdf;type=application/pdf'
{"result":" Room rent is subject to a maximum of INR 5,000 per day as specified in
在Arogya Sanjeevani Policy [Page no. 1].","error":"","stdout":""}
在本地主机上运行
鸣谢 : Adithya S[4]
1.通过在你的终端或命令提示符中输入以下命令来拉取镜像:
docker pull registry
.
hf
.
space
/
bhaskartripathi
-
pdfchatter
:
latest
1.将Universal Sentence Encoder下载到你的项目的根文件夹。这很重要,因为否则,每次运行时都会下载915 MB。 2.使用这个链接[5]下载编码器。 3.解压下载的文件,并将其放在你的项目的根文件夹中,如下所示:
你的项目的根文件夹
└───Universal Sentence Encoder
| ├───assets
| └───variables
| └───saved_model.pb
|
└───app.py
- 如果你已经在本地下载了它,将API文件中第68行的代码:
self
.
use
=
hub
.
load
(
'https://tfhub.dev/google/universal-sentence-encoder/4'
)
替换为:
self
.
use
=
hub
.
load
(
'./Universal Sentence Encoder/'
)
- 现在,要运行PDF-GPT,输入以下命令:
docker run
-
it
-
p
7860
:
7860
--
platform
=
linux
/
amd64 registry
.
hf
.
space
/
bhaskartripathi
-
pdfchatter
:
latest python app
.
py
原始源代码 (托管在Hugging Face的演示) : https://huggingface.co/spaces/bhaskartripathi/pdfChatter/blob/main/app.py
UML
sequenceDiagram
participant User
participant System
User->>System: 输入API密钥
User->>System: 上传PDF/PDF URL
User->>System: 提问
User->>System: 提交行动呼吁
System->>System: 空字段验证
System->>System: 将PDF转换为文本
System->>System: 将文本分解为块(150字长度)
System->>System: 检查是否存在嵌入文件
System->>System: 如果文件存在,则加载嵌入并将拟合属性设置为True
System->>System: 如果文件不存在,则生成嵌入,拟合推荐器,将嵌入保存到文件并将拟合属性设置为True
System->>System: 执行语义搜索并返回KNN的前5个块
System->>System: 加载Open AI提示
System->>System: 在Open AI提示中嵌入前5个块
System->>System: 使用Davinci生成答案
System-->>User: 返回答案
流程图
flowchart TB
A[输入] --> B[URL]
A -- 手动上传文件 --> C[解析PDF]
B -->
D[解析PDF] -- 预处理 --> E[动态文本块]
C -- 预处理 --> E[动态文本块与引文历史]
E --拟合-->F[使用Deep Averaging Network Encoder在每个块上生成文本嵌入]
F -- 查询 --> G[获取顶部结果]
G -- K-最近邻 --> K[获取最近邻 - 匹配引文引用]
K -- 生成提示 --> H[生成答案]
H -- 输出 --> I[输出]
References
[1]
langchain-serve: https://github.com/jina-ai/langchain-serve
[2]
langchain-serve: https://github.com/jina-ai/langchain-serve
[3]
Jina Cloud: https://cloud.jina.ai/
[4]
Adithya S: https://github.com/200901002
[5]
链接: https://tfhub.dev/google/universal-sentence-encoder/4?tf-hub-format=compressed