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()