File size: 3,054 Bytes
a23dda1
 
9a98211
 
61e5603
9a98211
5e73cde
 
 
 
 
 
 
 
9a98211
5e73cde
9a98211
9ff205d
9a98211
 
 
 
 
 
 
 
 
5e73cde
9a98211
 
 
 
 
 
 
 
 
 
 
5e73cde
 
9a98211
 
 
 
 
94e0df5
6dd3f45
9a98211
5e73cde
9a98211
 
5e73cde
9a98211
5e73cde
 
 
 
9a98211
 
 
 
 
 
 
 
 
 
 
 
 
5e73cde
 
 
 
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
68
69
70
71
72
73
74
75
import os
import json
import openai
from langchain.document_loaders import PDFMinerLoader, UnstructuredURLLoader
from langchain.chat_models import ChatOpenAI
from langchain import PromptTemplate, LLMChain
from langchain.text_splitter import CharacterTextSplitter
from langchain.prompts import PromptTemplate
from langchain.chains.summarize import load_summarize_chain
import gradio as gr

#chargement des paramètres
with open("parametres.json", "r") as p:
    params = json.load(p)
    max_pages = params["max_pages"]

def summarize(taille_resume, Document, url):

    # loads a PDF document
    if not Document and not url:
            return "Merci de fournir un document PDF ou lien vers un site web"
    elif not Document:
        loader = UnstructuredURLLoader(urls = [url])
    elif not Document.name.endswith('.pdf'):
            return ("Merci de fournir un document PDF")
    else:
        loader = PDFMinerLoader(Document.name) #PyPDFLoader créerait des pages trop petites (ex : 1 mot par page si ca vient d'un Ppt)

    docs = loader.load()
    
    #préparation du texte 
    text_splitter = CharacterTextSplitter(separator = "\n", chunk_size=5000)
    docs = text_splitter.split_documents(docs)
    print(str(len(docs)) + " pages pour un maximum de " + str(max_pages))
    
    chunked_docs = docs[:int(max_pages/3)]
    
    #définition du LLM 
    llm = ChatOpenAI(model_name="gpt-3.5-turbo", max_tokens = taille_resume*2.2, temperature=0, openai_api_key = os.environ['OpenaiKey'])

    #résumé 
    prompt_template = f"""Écris un résumé structuré et détaillé du document délimité par des triples accents graves.
    ASSURE-TOI que la longueur de ce résumé soit supérieure à {int(taille_resume/1.5)} mots et inférieure à {int(taille_resume*1.5)} mots.
    ASSURE-TOI AUSSI, C'EST LE PLUS IMPORTANT que la dernière phrase de ton résumé soit complète et se termine par un point.
    AJOUTE ENFIN le signe " |" après ce point final.
    """ + """DOCUMENT : ```{text}```"""
    summary_langage_prompt = PromptTemplate(template=prompt_template, input_variables=['text'])
    chain = load_summarize_chain(llm, chain_type="map_reduce", return_intermediate_steps=True, map_prompt=summary_langage_prompt, combine_prompt = summary_langage_prompt)
    steps = chain({"input_documents": chunked_docs}, return_only_outputs=True)
    
    summary = steps['output_text']
    summary = summary + " " + str(len(summary.split())) + " mots"

    return summary

# Création de l'interface Gradio

iface = gr.Interface(
    fn=summarize,
    inputs=[gr.Slider(
                    minimum=100,
                    maximum=500,
                    label="Taille indicative en mots",
                    value=100,
                    step=50),
            "file",
            gr.Textbox(label="Ou copier le lien")
            ],
    outputs=[gr.Textbox(label="Résumé")],
    title="Document Summarizer",
    description="par Nicolas \nRésume un PDF ou un site web",
    allow_flagging = "never")

# Lancer l'interface
iface.launch()