前言在AI浪潮風(fēng)起云涌的當(dāng)下,,AI正在不斷地重塑著每一個(gè)行業(yè),。筆者的目標(biāo)是在公眾號(hào)中把所有當(dāng)下流行的AI應(yīng)用都梳理一遍,,在整理技術(shù)拓展思路的同時(shí)也給大家做一個(gè)科普,。有一段時(shí)間沒有介紹aigc相關(guān)的應(yīng)用了,,今天翻到了一個(gè)很早之前調(diào)研過的火了很久的一個(gè)項(xiàng)目—pdfGPT。 PDF GPT允許你使用GPT功能與上傳的PDF文件進(jìn)行聊天,。這時(shí)候看過筆者推文的同學(xué)就會(huì)問,,這個(gè)項(xiàng)目和Quivr有什么區(qū)別呢?實(shí)際上,,這個(gè)項(xiàng)目比Quivr要早,,只是Quivr適配了更多的數(shù)據(jù)類型,,比如文本、圖片,、代碼片段,,應(yīng)有盡有。對(duì)Quivr感興趣的可以翻一下之前的文章:Quivr - 你的第二個(gè)大腦,,由AIGC賦能 本篇文章的目的更多是為了整理和科普,后面筆者會(huì)輸出一些AI實(shí)戰(zhàn)應(yīng)用的文章,,小伙伴們可以持續(xù)關(guān)注一下,。 本篇的pdfGPT項(xiàng)目的github地址為:https://github.com/bhaskatripathi/pdfGPT
pdfGPT演示1.演示URL: https:///41ZXBJM 注意: 如果你喜歡這個(gè)項(xiàng)目,請(qǐng)給它點(diǎn)贊,! 問題描述 :1.當(dāng)你向Open AI傳遞大量文本時(shí),,它會(huì)受到4K令牌限制。它不能將整個(gè)pdf文件作為輸入2.Open AI有時(shí)會(huì)變得過于健談,,并返回與你的查詢無直接關(guān)系的無關(guān)應(yīng)答,。這是因?yàn)镺pen AI使用了質(zhì)量較差的嵌入。3.ChatGPT不能直接與外部數(shù)據(jù)進(jìn)行交互,。一些解決方案使用Langchain,,但如果沒有正確實(shí)現(xiàn),它會(huì)消耗大量的令牌,。4.有許多解決方案,,如https://www., https://www./chat-with-any-pdf, https://www.,,它們的內(nèi)容質(zhì)量較差,,容易產(chǎn)生幻覺問題。避免幻覺并提高真實(shí)性的一個(gè)好方法是使用改進(jìn)的嵌入,。為了解決這個(gè)問題,,我建議使用Universal Sentence Encoder系列算法來改進(jìn)嵌入(在這里閱讀更多:https://v/google/collections/universal-sentence-encoder/1)。 解決方案: 什么是PDF GPT ?1.PDF GPT允許你使用GPT功能與上傳的PDF文件進(jìn)行聊天,。2.該應(yīng)用程序智能地將文檔分解成更小的塊,,并使用強(qiáng)大的Deep Averaging Network Encoder生成嵌入。3.首先在你的pdf內(nèi)容上進(jìn)行語義搜索,,然后將最相關(guān)的嵌入傳遞給Open AI,。4.自定義邏輯生成精確的響應(yīng)。返回的響應(yīng)甚至可以在方括號(hào)([])中引用信息所在的頁碼,,增加了響應(yīng)的可信度,,幫助快速定位相關(guān)信息。這些響應(yīng)比Open AI的原始響應(yīng)要好得多,。5.Andrej Karpathy在這篇文章中提到,,對(duì)于類似的問題,,KNN算法是最合適的:https://twitter.com/karpathy/status/16470252305468866586.使用langchain-serve[1]在生產(chǎn)環(huán)境中啟用API。 Docker運(yùn)行docker-compose -f docker-compose.yaml up 使用Docker compose,。 使用langchain-serve[2]在生產(chǎn)環(huán)境中使用pdfGPT 本地游樂場(chǎng)1.在一個(gè)終端上運(yùn)行lc-serve deploy local api 使用langchain-serve將應(yīng)用程序作為API暴露出來,。2.在另一個(gè)終端上運(yùn)行python app.py 進(jìn)行本地gradio游樂場(chǎng)。3.在你的瀏覽器上打開http://localhost:7860 并與應(yīng)用程序進(jìn)行交互,。 云部署通過在Jina Cloud[3]上部署使pdfGPT 生產(chǎn)就緒,。 lc-serve deploy jcloud api 顯示命令輸出【公眾號(hào)格式問題,請(qǐng)移步原文】使用cURL進(jìn)行交互(將URL更改為你自己的端點(diǎn)) PDF url curl -X 'POST' \ 'https://langchain-3ff4ab2c9d.wolf./ask_url' \ -H 'accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "url": "https:///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./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":""}
在本地主機(jī)上運(yùn)行鳴謝 : Adithya S[4]1.通過在你的終端或命令提示符中輸入以下命令來拉取鏡像: docker pull registry.hf.space/bhaskartripathi-pdfchatter:latest
1.將Universal Sentence Encoder下載到你的項(xiàng)目的根文件夾,。這很重要,,因?yàn)榉駝t,每次運(yùn)行時(shí)都會(huì)下載915 MB,。2.使用這個(gè)鏈接[5]下載編碼器,。3.解壓下載的文件,并將其放在你的項(xiàng)目的根文件夾中,,如下所示: 你的項(xiàng)目的根文件夾 └───Universal Sentence Encoder | ├───assets | └───variables | └───saved_model.pb | └───app.py
4. 如果你已經(jīng)在本地下載了它,,將API文件中第68行的代碼: self.use = hub.load('https://v/google/universal-sentence-encoder/4')
替換為: self.use = hub.load('./Universal Sentence Encoder/')
5. 現(xiàn)在,要運(yùn)行PDF-GPT,,輸入以下命令: docker run -it -p 7860:7860 --platform=linux/amd64 registry.hf.space/bhaskartripathi-pdfchatter:latest python app.py
原始源代碼 (托管在Hugging Face的演示) : https:///spaces/bhaskartripathi/pdfChatter/blob/main/app.pyUMLsequenceDiagram participant User participant System
User->>System: 輸入API密鑰 User->>System: 上傳PDF/PDF URL User->>System: 提問 User->>System: 提交行動(dòng)呼吁
System->>System: 空字段驗(yàn)證 System->>System: 將PDF轉(zhuǎn)換為文本 System->>System: 將文本分解為塊(150字長(zhǎng)度) System->>System: 檢查是否存在嵌入文件 System->>System: 如果文件存在,,則加載嵌入并將擬合屬性設(shè)置為True System->>System: 如果文件不存在,則生成嵌入,,擬合推薦器,,將嵌入保存到文件并將擬合屬性設(shè)置為True System->>System: 執(zhí)行語義搜索并返回KNN的前5個(gè)塊 System->>System: 加載Open AI提示 System->>System: 在Open AI提示中嵌入前5個(gè)塊 System->>System: 使用Davinci生成答案
System-->>User: 返回答案
流程圖flowchart TB A[輸入] --> B[URL] A -- 手動(dòng)上傳文件 --> C[解析PDF] B -->
D[解析PDF] -- 預(yù)處理 --> E[動(dòng)態(tài)文本塊] C -- 預(yù)處理 --> E[動(dòng)態(tài)文本塊與引文歷史] E --擬合-->F[使用Deep Averaging Network Encoder在每個(gè)塊上生成文本嵌入] F -- 查詢 --> G[獲取頂部結(jié)果] 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./
[4] Adithya S: https://github.com/200901002
[5] 鏈接: https://v/google/universal-sentence-encoder/4?tf-hub-format=compressed
|