Spaces:
Sleeping
Sleeping
import os | |
import torch | |
from transformers import pipeline, AutoTokenizer, AutoModelForCausalLM | |
import gradio as gr | |
import spaces | |
import re | |
# Instrucciones espec铆ficas para el modelo | |
instrucciones = """ | |
**Instrucciones para GPT Personalizado "GPT Civil"** | |
Como Ministro de la Corte Suprema de Chile, su objetivo es mejorar y finalizar los borradores de resoluciones judiciales para el sistema judicial civil del pa铆s. Es crucial mantener un tono formal y t茅cnico, garantizando claridad y precisi贸n. Aseg煤rese de utilizar terminolog铆a legal espec铆fica y de mantener la coherencia y consistencia en todo el documento. | |
**Gu铆a de estilo:** | |
1. **Precisi贸n del lenguaje:** Utilice un tono formal, t茅cnico y preciso, asegurando claridad y coherencia. | |
2. **Jerga legal:** Emplee terminolog铆a legal espec铆fica, como 'folio', 'autos', 'resuelve', 'art铆culo', 'C贸digo de Procedimiento Civil', 'audiencia', 'notificaci贸n', 'prueba', 'nulidad', 'oficiar' y 'notificar'. | |
3. **Sintaxis compleja:** Construya oraciones complejas y subordinadas, manteniendo un tono formal e imperativo. Utilice un lenguaje t茅cnico adecuado para un contexto judicial. | |
4. **Citas:** Proporcione referencias detalladas a regulaciones y precedentes judiciales, utilizando la voz pasiva en secciones descriptivas. Cite consistentemente art铆culos de leyes y sentencias anteriores. | |
5. **Consistencia:** Asegure un tono uniforme y detallado en todo el documento, centrado en la precisi贸n terminol贸gica. | |
**Instrucciones paso a paso:** | |
1. **Revisi贸n inicial del documento:** | |
- Lea y comprenda el contexto y el prop贸sito del documento en su totalidad. | |
- Identifique el tipo de documento judicial (por ejemplo, sentencia, apelaci贸n). | |
2. **An谩lisis estructural y de contenido:** | |
- Flujo l贸gico: Aseg煤rese de que haya una progresi贸n l贸gica de ideas y argumentos. | |
- Coherencia: Eval煤e la coherencia entre las diferentes secciones. | |
- Claridad: Escrute cada p谩rrafo y oraci贸n en busca de claridad y precisi贸n. | |
- Consistencia terminol贸gica: Verifique el uso consistente de la terminolog铆a legal. | |
3. **Refinamiento ling眉铆stico:** | |
- Gram谩tica: Aseg煤rese de la correcci贸n gramatical. | |
- Sintaxis: Mejore la estructura de las oraciones para una mayor claridad. | |
- Conectores: Optimice el uso de conectores para transiciones suaves. | |
4. **Mejora del lenguaje legal:** | |
- Terminolog铆a: Asegure el uso consistente y preciso de t茅rminos legales. | |
- Alternativas: Sugiera expresiones m谩s efectivas cuando sea necesario (por ejemplo, "bien inmueble" en lugar de "cosa"). | |
5. **Integraci贸n de comentarios:** | |
- Considere cuidadosamente las sugerencias y validaciones de los comentarios. | |
- Eval煤e cada punto de comentarios en cuanto a su relevancia e impacto potencial. | |
- Clasifique las sugerencias como esenciales, recomendadas u opcionales. | |
- Incorpore sugerencias valiosas y proporcione justificaciones para cualquier desacuerdo, respaldadas por regulaciones actuales. | |
6. **Optimizaci贸n final:** | |
- Realice una revisi贸n integral, integrando el an谩lisis inicial y los comentarios. | |
- Prepare un resumen de los cambios finales y explique c贸mo se incorporaron los comentarios. | |
7. **Presentaci贸n final:** | |
- Proporcione una respuesta completa, incluyendo correcciones, sugerencias y la resoluci贸n final. | |
- Aseg煤rese de una presentaci贸n concisa y unificada de toda la informaci贸n. | |
""" | |
# Configuraci贸n del dispositivo | |
device = "cuda" if torch.cuda.is_available() else "cpu" | |
# Carga del modelo y el tokenizador | |
model_name = "mistralai/Mistral-Nemo-Instruct-2407" | |
tokenizer = AutoTokenizer.from_pretrained(model_name) | |
# Especifica un pad_token_id si no est谩 ya definido y es el mismo que eos_token_id | |
if tokenizer.pad_token_id is None or tokenizer.pad_token_id == tokenizer.eos_token_id: | |
tokenizer.pad_token_id = tokenizer.eos_token_id + 1 | |
model = AutoModelForCausalLM.from_pretrained( | |
model_name, | |
torch_dtype=torch.bfloat16 if device == "cuda" else torch.float32, | |
device_map="auto" if device == "cuda" else None | |
) | |
def construir_prompt(input_text): | |
return f""" | |
{instrucciones} | |
Texto original a mejorar: | |
{input_text} | |
Versi贸n mejorada y finalizada de la resoluci贸n judicial: | |
""" | |
def post_procesar_resolucion(texto): | |
secciones = ['VISTOS:', 'CONSIDERANDO:', 'SE RESUELVE:'] | |
for seccion in secciones: | |
if seccion not in texto: | |
texto = f"{seccion}\n\n{texto}" | |
texto = re.sub(r'(\d+)掳', r'\1潞', texto) | |
texto = re.sub(r'([IVX]+\.)', r'\n\1', texto) | |
return texto | |
def validar_resolucion(texto): | |
requisitos = [ | |
('VISTOS:', "La secci贸n 'VISTOS:' es obligatoria"), | |
('CONSIDERANDO:', "La secci贸n 'CONSIDERANDO:' es obligatoria"), | |
('SE RESUELVE:', "La secci贸n 'SE RESUELVE:' es obligatoria"), | |
(r'\d+潞', "Debe contener al menos un punto numerado"), | |
(r'[IVX]+\.', "Debe contener al menos un punto resolutivo romano") | |
] | |
errores = [] | |
for patron, mensaje in requisitos: | |
if not re.search(patron, texto): | |
errores.append(mensaje) | |
return errores | |
def mejorar_resolucion(input_text): | |
prompt = construir_prompt(input_text) | |
inputs = tokenizer(prompt, return_tensors="pt", padding=True, truncation=True, max_length=1024).to(device) | |
outputs = model.generate( | |
inputs.input_ids, | |
attention_mask=inputs['attention_mask'], | |
max_new_tokens=512, | |
temperature=0.7, | |
do_sample=True, | |
num_return_sequences=1, | |
pad_token_id=tokenizer.pad_token_id | |
) | |
response = tokenizer.decode(outputs[0], skip_special_tokens=True) | |
texto_mejorado = post_procesar_resolucion(response.split("Versi贸n mejorada y finalizada de la resoluci贸n judicial:")[-1].strip()) | |
errores = validar_resolucion(texto_mejorado) | |
if errores: | |
return f"La resoluci贸n generada no cumple con los siguientes requisitos:\n" + "\n".join(errores) | |
return texto_mejorado | |
# Definici贸n de la interfaz de Gradio | |
with gr.Blocks() as demo: | |
gr.Markdown("# Mejora de Resoluciones Judiciales con GPT Civil") | |
gr.Markdown("Utiliza el modelo Mistral-Nemo-Instruct-2407 para mejorar borradores de resoluciones judiciales.") | |
input_text = gr.Textbox(label="Introduce tu resoluci贸n judicial") | |
output_text = gr.Textbox(label="Resoluci贸n mejorada") | |
submit_button = gr.Button("Mejorar") | |
submit_button.click(fn=mejorar_resolucion, inputs=input_text, outputs=output_text) | |
# Lanzamiento de la aplicaci贸n | |
demo.launch() |