km1lo commited on
Commit
29e28a9
·
verified ·
1 Parent(s): 68c0ddf

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +52 -39
app.py CHANGED
@@ -8,13 +8,13 @@ Original file is located at
8
  """
9
 
10
  # -*- coding: utf-8 -*-
11
- from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
12
  from sentence_transformers import SentenceTransformer, util
13
  import numpy as np
14
  import joblib
15
  import torch
16
  import gradio as gr
17
- from transformers import TextGenerationPipeline
18
 
19
  # === Cargar modelos entrenados ===
20
  modelo_riesgo = joblib.load("modelo_riesgo.pkl")
@@ -26,21 +26,18 @@ modelo_vector = SentenceTransformer("Snowflake/snowflake-arctic-embed-xs")
26
  # === Cargar modelo de lenguaje Mistral 7B Instruct ===
27
  model_id = "mistralai/Mistral-7B-Instruct-v0.1"
28
 
29
- tokenizer = AutoTokenizer.from_pretrained(model_id)
 
 
 
 
30
  model = AutoModelForCausalLM.from_pretrained(
31
  model_id,
 
32
  torch_dtype=torch.bfloat16 if torch.cuda.is_available() else torch.float32,
33
  device_map="auto"
34
  )
35
 
36
- modelo_llm = TextGenerationPipeline(
37
- model=model,
38
- tokenizer=tokenizer,
39
- max_new_tokens=1000,
40
- temperature=0.2,
41
- do_sample=False,
42
- )
43
-
44
  # === Frases prototipo para verificador semántico ===
45
  frases_fisica = [
46
  "Me golpeó con el puño cerrado", "Me pateó", "Me lanzó contra la pared",
@@ -63,7 +60,7 @@ def verificar_semantico(descripcion):
63
  tipos_detectados.append("sexual")
64
  return tipos_detectados
65
 
66
- # === FUNCIÓN PRINCIPAL MODIFICADA ===
67
  def predecir_con_recomendacion(edad, genero, hijos, convivencia_agresor, consumo_sustancias, apoyo_familiar, descripcion):
68
  # Codificar variables tabulares
69
  vector_tabular = np.array([
@@ -97,37 +94,53 @@ def predecir_con_recomendacion(edad, genero, hijos, convivencia_agresor, consumo
97
  tipos_combinados = list(set([tipo_violencia_pred] + tipos_semantico))
98
  tipos_str = ", ".join(tipos_combinados)
99
 
100
- # PROMPT claro y detallado
101
- prompt = f"""Eres un jurista colombiano experto en violencia intrafamiliar.
102
- Analiza este caso y redacta un Auto de Medida Provisional conforme a la Ley 575 de 2000, Ley 1257 de 2008 y Ley 2126 de 2021.
103
-
104
- Hechos del caso:
105
- Tipo de violencia: {tipos_str}
106
- Nivel de riesgo: {riesgo}
107
- Medida cautelar sugerida: {tipo_medida}
108
- Descripción detallada: {descripcion}
109
-
110
- Redacta con este formato:
111
-
112
- CONSIDERACIONES:
113
- - Hechos relevantes y valoración del riesgo.
114
- - Fundamentos jurídicos aplicables.
115
- - Justificación breve de cada literal del Artículo 5 aplicable.
116
-
117
- RESUELVE:
118
- PRIMERO: Admitir la solicitud.
119
- SEGUNDO: Ordenar las siguientes medidas (una por línea).
120
- TERCERO: Cúmplase y notifíquese.
121
-
122
- Limita tu respuesta a máximo 600 palabras, en estilo formal.
123
- """
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
124
 
125
- salida = modelo_llm(prompt)[0]["generated_text"]
126
- auto_redactado = salida.strip()
 
127
 
128
  return tipos_str, riesgo, tipo_medida, auto_redactado
129
 
130
- # === Interfaz Gradio (idéntica) ===
131
  with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
132
  gr.Markdown("<h1 style='text-align:center; color:#004aad;'>LEGALFAMI – Asistente Legal con Razonamiento Jurídico</h1>")
133
  gr.Markdown("Predice tipo de violencia, riesgo, medida cautelar y genera un Auto conforme a la Ley 575 Art.5.")
 
8
  """
9
 
10
  # -*- coding: utf-8 -*-
11
+ from transformers import AutoTokenizer, AutoModelForCausalLM
12
  from sentence_transformers import SentenceTransformer, util
13
  import numpy as np
14
  import joblib
15
  import torch
16
  import gradio as gr
17
+ import os
18
 
19
  # === Cargar modelos entrenados ===
20
  modelo_riesgo = joblib.load("modelo_riesgo.pkl")
 
26
  # === Cargar modelo de lenguaje Mistral 7B Instruct ===
27
  model_id = "mistralai/Mistral-7B-Instruct-v0.1"
28
 
29
+ tokenizer = AutoTokenizer.from_pretrained(
30
+ model_id,
31
+ token=os.environ.get("HF_TOKEN")
32
+ )
33
+
34
  model = AutoModelForCausalLM.from_pretrained(
35
  model_id,
36
+ token=os.environ.get("HF_TOKEN"),
37
  torch_dtype=torch.bfloat16 if torch.cuda.is_available() else torch.float32,
38
  device_map="auto"
39
  )
40
 
 
 
 
 
 
 
 
 
41
  # === Frases prototipo para verificador semántico ===
42
  frases_fisica = [
43
  "Me golpeó con el puño cerrado", "Me pateó", "Me lanzó contra la pared",
 
60
  tipos_detectados.append("sexual")
61
  return tipos_detectados
62
 
63
+ # === FUNCIÓN PRINCIPAL ===
64
  def predecir_con_recomendacion(edad, genero, hijos, convivencia_agresor, consumo_sustancias, apoyo_familiar, descripcion):
65
  # Codificar variables tabulares
66
  vector_tabular = np.array([
 
94
  tipos_combinados = list(set([tipo_violencia_pred] + tipos_semantico))
95
  tipos_str = ", ".join(tipos_combinados)
96
 
97
+ # Mensaje en formato chat
98
+ messages = [
99
+ {
100
+ "role": "system",
101
+ "content": "Eres un jurista colombiano experto en violencia intrafamiliar."
102
+ },
103
+ {
104
+ "role": "user",
105
+ "content": (
106
+ f"Analiza este caso y redacta un Auto de Medida Provisional conforme a la Ley 575 de 2000, Ley 1257 de 2008 y Ley 2126 de 2021.\n\n"
107
+ f"Hechos del caso:\n"
108
+ f"Tipo de violencia: {tipos_str}\n"
109
+ f"Nivel de riesgo: {riesgo}\n"
110
+ f"Medida cautelar sugerida: {tipo_medida}\n"
111
+ f"Descripción detallada: {descripcion}\n\n"
112
+ "Redacta con este formato:\n\n"
113
+ "CONSIDERACIONES:\n"
114
+ "- Hechos relevantes y valoración del riesgo.\n"
115
+ "- Fundamentos jurídicos aplicables.\n"
116
+ "- Justificación breve de cada literal del Artículo 5 aplicable.\n\n"
117
+ "RESUELVE:\n"
118
+ "PRIMERO: Admitir la solicitud.\n"
119
+ "SEGUNDO: Ordenar las siguientes medidas (una por línea).\n"
120
+ "TERCERO: Cúmplase y notifíquese.\n\n"
121
+ "Limita tu respuesta a máximo 600 palabras, en estilo formal."
122
+ )
123
+ }
124
+ ]
125
+
126
+ # Aplicar chat template
127
+ encoded = tokenizer.apply_chat_template(messages, return_tensors="pt").to(model.device)
128
+
129
+ # Generar salida
130
+ generated_ids = model.generate(
131
+ encoded,
132
+ max_new_tokens=1000,
133
+ do_sample=False,
134
+ temperature=0.2
135
+ )
136
 
137
+ # Decodificar
138
+ decoded = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)
139
+ auto_redactado = decoded[0].strip()
140
 
141
  return tipos_str, riesgo, tipo_medida, auto_redactado
142
 
143
+ # === Interfaz Gradio ===
144
  with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
145
  gr.Markdown("<h1 style='text-align:center; color:#004aad;'>LEGALFAMI – Asistente Legal con Razonamiento Jurídico</h1>")
146
  gr.Markdown("Predice tipo de violencia, riesgo, medida cautelar y genera un Auto conforme a la Ley 575 Art.5.")