|
|
|
import os |
|
import torch |
|
from langchain.text_splitter import RecursiveCharacterTextSplitter |
|
from langchain.embeddings import HuggingFaceEmbeddings |
|
from langchain.vectorstores import Chroma |
|
from langchain.llms.huggingface_pipeline import HuggingFacePipeline |
|
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline, BitsAndBytesConfig |
|
from langchain.document_loaders import PyPDFLoader |
|
from langchain.chains.question_answering import load_qa_chain |
|
from langchain.prompts import PromptTemplate |
|
import gradio as gr |
|
|
|
|
|
quantization_config = BitsAndBytesConfig( |
|
load_in_4bit=True, |
|
bnb_4bit_compute_dtype=torch.bfloat16 |
|
) |
|
|
|
|
|
model_kwargs = {'device': 'cuda'} |
|
|
|
embeddings = HuggingFaceEmbeddings(model_kwargs=model_kwargs) |
|
|
|
tokenizer = AutoTokenizer.from_pretrained("mistralai/Mistral-7B-Instruct-v0.2") |
|
model = AutoModelForCausalLM.from_pretrained("mistralai/Mistral-7B-Instruct-v0.2", device_map='auto', quantization_config=quantization_config) |
|
|
|
|
|
|
|
pipe = pipeline("text-generation", model=model, tokenizer=tokenizer, max_new_tokens=150) |
|
llm = HuggingFacePipeline(pipeline=pipe) |
|
|
|
|
|
pdf_link = "testrag.pdf" |
|
loader = PyPDFLoader(pdf_link, extract_images=False) |
|
pages = loader.load_and_split() |
|
|
|
|
|
|
|
text_splitter = RecursiveCharacterTextSplitter( |
|
chunk_size = 4000, |
|
chunk_overlap = 20, |
|
length_function = len, |
|
add_start_index = True, |
|
) |
|
chunks = text_splitter.split_documents(pages) |
|
print(chunks) |
|
|
|
|
|
db=Chroma.from_documents(chunks,embedding=embeddings,persist_directory="CHROMA"+pdf_link) |
|
db.persist() |
|
|
|
|
|
vectordb = Chroma(persist_directory="CHROMA"+pdf_link, embedding_function = embeddings) |
|
|
|
|
|
retriever = vectordb.as_retriever(search_kwargs = {"k" : 3}) |
|
|
|
qna_prompt_template="""### [INST] Instruction : tu dois répondre en francais. Des questions et des données associées vous seront fournies en francais. Votre tâche consiste à trouver les réponses aux questions en francais en utilisant les données fournies. Si les données ne contiennent pas la réponse à la question, vous devez alors renvoyer ' Pas assez d informations .' |
|
|
|
{context} |
|
|
|
### Question: {question} [/INST]""" |
|
|
|
PROMPT = PromptTemplate( |
|
template=qna_prompt_template, input_variables=["context", "question"] |
|
) |
|
chain = load_qa_chain(llm, chain_type="stuff", prompt=PROMPT) |
|
|
|
|
|
def loadfile(myfile): |
|
pdf_link = myfile |
|
|
|
loader = PyPDFLoader(pdf_link, extract_images=False) |
|
pages = loader.load_and_split() |
|
|
|
|
|
|
|
text_splitter = RecursiveCharacterTextSplitter( |
|
chunk_size = 4000, |
|
chunk_overlap = 20, |
|
length_function = len, |
|
add_start_index = True, |
|
) |
|
chunks = text_splitter.split_documents(pages) |
|
print(chunks) |
|
|
|
db=Chroma.from_documents(chunks,embedding=embeddings,persist_directory="CHROMA"+pdf_link) |
|
db.persist() |
|
|
|
answer="" |
|
return answer |
|
|
|
|
|
|
|
def ask(question): |
|
context = retriever.get_relevant_documents(question) |
|
print(context) |
|
answer = (chain({"input_documents": context, "question": question}, return_only_outputs=True))['output_text'] |
|
return answer |
|
|
|
|
|
def summarize_pdf (input_pdf_question, custom_prompt=""): |
|
|
|
summary = ask(input_pdf_question) |
|
return summary |
|
|
|
|
|
|
|
|
|
gradio_app1 = gr.Interface( |
|
fn = summarize_pdf, |
|
inputs = gr.components.Textbox(label="Entrer la question",value="je dois repeindre un mur de 30 m2 avec de la peinture PEINTURE MATE a lille, quel est le prix final ?"), |
|
outputs = gr.components.Textbox(label=" "), |
|
title = "PDF question", |
|
description = "vous pouvez questionner un pdf.", |
|
) |
|
|
|
gradio_app2 = gr.Interface( |
|
fn = summarize_pdf, |
|
inputs = gr.components.Textbox(label="Entrer la question",value="quel est le prix le moins cher pour une COUCHE ANTI-MOISISSURE"), |
|
outputs = gr.components.Textbox(label=" "), |
|
title = "PDF question", |
|
description = "vous pouvez questionner un pdf.", |
|
) |
|
|
|
demo = gr.TabbedInterface([gradio_app1, gradio_app2], ["app1", "app2"]) |
|
|
|
|
|
if __name__ == "__main__": |
|
demo.launch( auth=("username", "password"), auth_message="Try this",share=True, debug=True) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|