-
Demo URL: https://bit.ly/41ZXBJM
-
Demo Video:
- When you pass a large text to Open AI, it suffers from a 4K token limit. It cannot take an entire pdf file as an input
- Open AI sometimes becomes overtly chatty and returns irrelevant response not directly related to your query. This is because Open AI uses poor embeddings.
- ChatGPT cannot directly talk to external data. Some solutions use Langchain but it is token hungry if not implemented correctly.
- There are a number of solutions like https://www.chatpdf.com, https://www.bespacific.com/chat-with-any-pdf, https://www.filechat.io they have poor content quality and are prone to hallucination problem. One good way to avoid hallucinations and improve truthfulness is to use improved embeddings. To solve this problem, I propose to improve embeddings with Universal Sentence Encoder family of algorithms (Read more here: https://tfhub.dev/google/collections/universal-sentence-encoder/1).
- PDF GPT allows you to chat with an uploaded PDF file using GPT functionalities.
- The application intelligently breaks the document into smaller chunks and employs a powerful Deep Averaging Network Encoder to generate embeddings.
- A semantic search is first performed on your pdf content and the most relevant embeddings are passed to the Open AI.
- A custom logic generates precise responses. The returned response can even cite the page number in square brackets([]) where the information is located, adding credibility to the responses and helping to locate pertinent information quickly. The Responses are much better than the naive responses by Open AI.
- Andrej Karpathy mentioned in this post that KNN algorithm is most appropriate for similar problems: https://twitter.com/karpathy/status/1647025230546886658
- Enables APIs on Production using langchain-serve.
Run docker-compose -f docker-compose.yaml up
to use it with Docker compose.
Use pdfGPT
on Production using langchain-serve
- Run
lc-serve deploy local api
on one terminal to expose the app as API using langchain-serve. - Run
python app.py
on another terminal for a local gradio playground. - Open
http://localhost:7860
on your browser and interact with the app.
Make pdfGPT
production ready by deploying it on Jina Cloud.
lc-serve deploy jcloud api
Show command output
╭──────────────┬──────────────────────────────────────────────────────────────────────────────────────╮
│ App ID │ langchain-3ff4ab2c9d │
├──────────────┼──────────────────────────────────────────────────────────────────────────────────────┤
│ Phase │ Serving │
├──────────────┼──────────────────────────────────────────────────────────────────────────────────────┤
│ Endpoint │ https://langchain-3ff4ab2c9d.wolf.jina.ai │
├──────────────┼──────────────────────────────────────────────────────────────────────────────────────┤
│ App logs │ dashboards.wolf.jina.ai │
├──────────────┼──────────────────────────────────────────────────────────────────────────────────────┤
│ Swagger UI │ https://langchain-3ff4ab2c9d.wolf.jina.ai/docs │
├──────────────┼──────────────────────────────────────────────────────────────────────────────────────┤
│ OpenAPI JSON │ https://langchain-3ff4ab2c9d.wolf.jina.ai/openapi.json │
╰──────────────┴──────────────────────────────────────────────────────────────────────────────────────╯
(Change the URL to your own endpoint)
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 file
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 the Arogya Sanjeevani Policy [Page no. 1].","error":"","stdout":""}
Credits : Adithya S
- Pull the image by entering the following command in your terminal or command prompt:
docker pull registry.hf.space/bhaskartripathi-pdfchatter:latest
- Download the Universal Sentence Encoder locally to your project's root folder. This is important because otherwise, 915 MB will be downloaded at runtime everytime you run it.
- Download the encoder using this link.
- Extract the downloaded file and place it in your project's root folder as shown below:
Root folder of your project
└───Universal Sentence Encoder
| ├───assets
| └───variables
| └───saved_model.pb
|
└───app.py
- If you have downloaded it locally, replace the code on line 68 in the API file:
self.use = hub.load('https://tfhub.dev/google/universal-sentence-encoder/4')
with:
self.use = hub.load('./Universal Sentence Encoder/')
- Now, To run PDF-GPT, enter the following command:
docker run -it -p 7860:7860 --platform=linux/amd64 registry.hf.space/bhaskartripathi-pdfchatter:latest python app.py
Original Source code (for demo hosted in Hugging Face) : https://huggingface.co/spaces/bhaskartripathi/pdfChatter/blob/main/app.py
sequenceDiagram
participant User
participant System
User->>System: Enter API Key
User->>System: Upload PDF/PDF URL
User->>System: Ask Question
User->>System: Submit Call to Action
System->>System: Blank field Validations
System->>System: Convert PDF to Text
System->>System: Decompose Text to Chunks (150 word length)
System->>System: Check if embeddings file exists
System->>System: If file exists, load embeddings and set the fitted attribute to True
System->>System: If file doesn't exist, generate embeddings, fit the recommender, save embeddings to file and set fitted attribute to True
System->>System: Perform Semantic Search and return Top 5 Chunks with KNN
System->>System: Load Open AI prompt
System->>System: Embed Top 5 Chunks in Open AI Prompt
System->>System: Generate Answer with Davinci
System-->>User: Return Answer
flowchart TB
A[Input] --> B[URL]
A -- Upload File manually --> C[Parse PDF]
B --> D[Parse PDF] -- Preprocess --> E[Dynamic Text Chunks]
C -- Preprocess --> E[Dynamic Text Chunks with citation history]
E --Fit-->F[Generate text embedding with Deep Averaging Network Encoder on each chunk]
F -- Query --> G[Get Top Results]
G -- K-Nearest Neighbour --> K[Get Nearest Neighbour - matching citation references]
K -- Generate Prompt --> H[Generate Answer]
H -- Output --> I[Output]
I am looking for more contributors from the open source community who can take up backlog items voluntarily and maintain the application jointly with me.
TypeTruth detects whether a text is written by a human or AI. Ideal for fact-checking and content validation in the age of AI content generators. https://github.com/bhaskatripathi/TypeTruth
This project is licensed under the MIT License. See the LICENSE.txt file for details.