Francesco-A's picture
env_debug
ebabcc8
# %% auto 0
__all__ = ['text_splitter', 'embeddings', 'hub_llm', 'pdf_example_1', 'pdf_example_2', 'question_example_1', 'question_example_2',
'title', 'description', 'file_upload', 'question', 'output', 'split_pdf', 'ask_pdf']
import dotenv
from dotenv import load_dotenv
load_dotenv()
# Import qa chain
from langchain.chains.question_answering import load_qa_chain
# Import gradio for UI/app interface
import gradio as gr
# Import PDF Loaders
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
# Create an instance of RecursiveCharacterTextSplitter with your desired chunk_size and chunk_overlap
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=250)
def split_pdf(pdf):
if pdf is not None:
# load pdf
loader = PyPDFLoader(pdf)
# Split pages from pdf (SEE: https://api.python.langchain.com/en/latest/document_loaders/langchain.document_loaders.pdf.PyPDFLoader.html)
chunks = loader.load_and_split(text_splitter=text_splitter)
return chunks
# Import HuggingFace as main LLM service
from langchain.embeddings import HuggingFaceEmbeddings
embeddings = HuggingFaceEmbeddings(
model_name = "bert-base-nli-mean-tokens",
model_kwargs = {'device': 'cpu'},
encode_kwargs = {'normalize_embeddings': True}
)
# Import FAISS as the vector store
from langchain.vectorstores import FAISS
# import transformers
# from transformers import AutoTokenizer, AutoModelForCausalLM
from langchain import HuggingFaceHub
import torch
hub_llm = HuggingFaceHub(
repo_id = 'tiiuae/falcon-7b-instruct',
# repo_id = 'tiiuae/falcon-7b-instruct',
model_kwargs = {'temperature' : 0.01, # 'randomness' of outputs, 0.0 is the min and 1.0 the max
# 'top_p': 0.15, # select from top tokens whose probability add up to x%
'top_k': 25, # select from top x tokens
'max_new_tokens': 300, # mex number of tokens to generate in the output
'repetition_penalty': 999 # without this output begins repeating
}
)
chain = load_qa_chain(hub_llm, chain_type="stuff")
# App Function
def ask_pdf(pdf, user_question):
if pdf is not None and user_question != '':
chunks = split_pdf(pdf) # split pdf into smaller chunks
store = FAISS.from_documents(chunks, embeddings) # Load documents into vector database
docs = store.similarity_search(user_question) # take user input and look for chunks that might contain the answer
# run chain
response = chain.run(input_documents=docs, question=user_question)
return response
pdf_example_1 = '/attention.pdf'
pdf_example_2 = '/bert.pdf'
question_example_1 = "What does 'attention' mean in this context?"
question_example_2 = "What does BERT stand for?"
title="LangChain project: Conversational Retrieval Chain"
description="Upload a PDF file and ask a question related to its content."
# Create Gradio interface
file_upload = gr.File(file_types = ['.pdf'],
file_count='single',
label="Upload a PDF file")
question = gr.Textbox(label="Write your question here:", show_copy_button= True)
output = gr.Textbox(label="Your answer:")
gr.Interface(
fn=ask_pdf,
inputs=[file_upload, question],
outputs=output,
title=title,
description=description,
examples=[[pdf_example_1, question_example_1], [pdf_example_2, question_example_2]]
).launch() #share=True