File size: 3,030 Bytes
cf3dd65
 
 
 
 
 
 
 
393c64f
cf3dd65
 
2b261c4
cf3dd65
393c64f
 
 
cf3dd65
 
393c64f
 
 
cf3dd65
 
 
 
 
 
 
 
 
 
 
 
 
2b261c4
 
 
 
 
 
 
 
 
 
 
cf3dd65
4f39cf4
18583f0
8f1ccbc
 
cf3dd65
 
 
2b261c4
 
 
cf3dd65
2b261c4
 
cf3dd65
 
 
 
 
 
2b261c4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import gradio as gr
import tiktoken
import os
import numpy as np
import requests
from dotenv import load_dotenv
from sentence_transformers import SentenceTransformer
from langchain_community.chat_models import ChatOllama
from basesrc.strategies import convert_pdf_to_text, split_pages_into_chunks, vectorize
from prompt_query import generate_prompt

def process_pdf(pdf_url, embedding_model, llm_model, top_k=5):
    response = requests.get(pdf_url)
    pdf_filename = pdf_url.split('/')[-1]
    
    with open(pdf_filename, 'wb') as f:
        f.write(response.content)
    
    pages = convert_pdf_to_text(pdf_filename)
    print(f"Je suis Llama3, de l'équipe DREAMS TEAM, votre assistant QA pour répondre à vos questions liés aux documents 🙂 !\nDéjà pour info, le nombre de pages de vote document est: {len(pages)}")
    
    tokenizer = tiktoken.get_encoding("cl100k_base")
    chunks = split_pages_into_chunks(pages, 128, tokenizer)
    embedding_model = SentenceTransformer(embedding_model)

    knowledge_base = vectorize(chunks, embedding_model)
    chunks, embeddings = list(zip(*knowledge_base))
    corpus_embeddings = np.vstack(embeddings)

    llm_model = ChatOllama(model=llm_model)

    def chat_interface(question):
        return generate_prompt(question, chunks, corpus_embeddings, embedding_model, llm_model, top_k)

    return chat_interface, pdf_filename

def create_interface():
    def main(pdf_url, question):
        embedding_model = "Sahajtomar/french_semantic"
        llm_model = "llama3"
        top_k = 5
        chat_interface, pdf_filename = process_pdf(pdf_url, embedding_model, llm_model, top_k)
        response = chat_interface(question)
        return response

    examples = [
        ["https://razvanbarbulescu.pages.math.cnrs.fr/inequalities.pdf", "Quel est ton rôle ?"],
        #["https://maths-olympiques.fr/wp-content/uploads/2019/11/Inegalites-Theo.pdf", "Que nous parle ce document ?"],
        # ["https://hellofuture.orange.com/app/uploads/2024/05/2024-Orange-white-paper-on-Mobile-Network-Technology-Evolutions-Beyond-2030.pdf", "Fais-moi un résumé des éléments essentiels de ce document"],
        # ["https://hellofuture.orange.com/app/uploads/2024/05/2024-Orange-white-paper-on-Mobile-Network-Technology-Evolutions-Beyond-2030.pdf", "Comment puis-je présenter ce document dans une réunion d'équipe de professionnels ?"]
    ]

    iface = gr.Interface(
        fn=main,
        inputs=[gr.Textbox(label="URL du PDF", placeholder="Entrez l'URL de votre PDF ici..."),
                gr.Textbox(lines=3, label="✨Posez votre question en français 😎", placeholder="Posez une question...")],
        outputs=gr.Textbox(label="Réponse"),
        title="Assistant de chat sur le document | by PSW",
        description="Entrez l'URL de votre PDF et posez votre question en français pour obtenir une réponse basée sur le contexte du document.",
        examples=examples
    )

    iface.launch(share=True)

if __name__ == "__main__":
    create_interface()