import warnings warnings.simplefilter(action='ignore', category=FutureWarning) import PyPDF2 import gradio as gr from langchain.prompts import PromptTemplate from langchain.chains.summarize import load_summarize_chain from huggingface_hub import login from pathlib import Path from langchain_huggingface import ChatHuggingFace, HuggingFaceEndpoint from transformers import AutoTokenizer, AutoModelForSequenceClassification import torch import os huggingface_token = os.getenv('HUGGINGFACE_TOKEN') # Realizar el inicio de sesión de Hugging Face solo si el token está disponible if huggingface_token: login(token=huggingface_token) # Configuración del modelo LLM llm = HuggingFaceEndpoint( repo_id="mistralai/Mistral-7B-Instruct-v0.3", task="text-generation", max_new_tokens=4096, temperature=0.5, do_sample=False, return_full_text=True, ) llm_engine_hf = ChatHuggingFace(llm=llm) # Configuración del modelo de clasificación tokenizer = AutoTokenizer.from_pretrained("mrm8488/legal-longformer-base-8192-spanish") model = AutoModelForSequenceClassification.from_pretrained("mrm8488/legal-longformer-base-8192-spanish") id2label = {0: "multas", 1: "politicas_de_privacidad", 2: "contratos", 3: "denuncias", 4: "otros"} def read_file(file): file_path = file.name if file_path.endswith('.pdf'): return read_pdf(file_path) else: with open(file_path, 'r', encoding='utf-8') as f: return f.read() def read_pdf(file_path): pdf_reader = PyPDF2.PdfReader(file_path) text = "" for page in range(len(pdf_reader.pages)): text += pdf_reader.pages[page].extract_text() return text def summarize(text, summary_length): if summary_length == 'Corto': length_instruction = "El resumen debe tener un máximo de 100 palabras." elif summary_length == 'Medio': length_instruction = "El resumen debe tener un máximo de 500 palabras." else: length_instruction = "El resumen debe tener un máximo de 1000 palabras." template = f''' Por favor, lea detenidamente el siguiente documento: {{TEXT}} Después de leer el documento, identifique los puntos clave y las ideas principales cubiertas en el texto. {length_instruction} Su objetivo es ser exhaustivo en la captura del contenido central del documento, mientras que también es conciso en la expresión de cada punto del resumen. Omita los detalles menores y concéntrese en los temas centrales y hechos importantes. ''' prompt = PromptTemplate( template=template, input_variables=['TEXT'] ) formatted_prompt = prompt.format(TEXT=text) output_summary = llm_engine_hf.invoke(formatted_prompt) return output_summary.content def classify_text(text): inputs = tokenizer(text, return_tensors="pt", max_length=4096, truncation=True, padding="max_length") model.eval() with torch.no_grad(): outputs = model(**inputs) logits = outputs.logits predicted_class_id = logits.argmax(dim=-1).item() predicted_label = id2label[predicted_class_id] return f"Clasificación: {predicted_label}" def translate(text, target_language): template = ''' Por favor, traduzca el siguiente documento al {LANGUAGE}: {TEXT} Asegúrese de que la traducción sea precisa y conserve el significado original del documento. ''' prompt = PromptTemplate( template=template, input_variables=['TEXT', 'LANGUAGE'] ) formatted_prompt = prompt.format(TEXT=text, LANGUAGE=target_language) translated_text = llm_engine_hf.invoke(formatted_prompt) return translated_text.content def process_file(file, action, target_language=None, summary_length=None): text = read_file(file) if action == "Resumen": return summarize(text, summary_length) elif action == "Clasificar": return classify_text(text) elif action == "Traducir": return translate(text, target_language) else: return "Acción no válida" # Crear la interfaz de Gradio with gr.Blocks() as demo: gr.Markdown("## LexAIcon: Traducción Resumen y Clasificación de textos legales.") with gr.Row(): with gr.Column(): file = gr.File(label="Subir un archivo") action = gr.Radio(label="Seleccione una acción", choices=["Resumen", "Clasificar", "Traducir"]) summary_length = gr.Radio(label="Seleccione la longitud del resumen", choices=["Corto", "Medio", "Largo"], visible=False) target_language = gr.Dropdown(label="Seleccionar idioma de traducción", choices=["en", "fr", "de"], visible=False) with gr.Column(): output_text = gr.Textbox(label="Resultado", lines=20) def update_ui(action): if action == "Traducir": return gr.update(visible=False), gr.update(visible=True) elif action == "Resumen": return gr.update(visible=True), gr.update(visible=False) elif action == "Clasificar": return gr.update(visible=False), gr.update(visible(False)) else: return gr.update(visible=False), gr.update(visible(False)) action.change(update_ui, inputs=action, outputs=[summary_length, target_language]) submit_button = gr.Button("Procesar") submit_button.click(process_file, inputs=[file, action, target_language, summary_length], outputs=output_text) # Ejecutar la aplicación Gradio demo.launch(share=True)