eberhenriquez94 commited on
Commit
08d0f2d
·
verified ·
1 Parent(s): a97c80d
Files changed (1) hide show
  1. app.py +92 -59
app.py CHANGED
@@ -1,7 +1,8 @@
1
  import os
2
  import asyncio
3
- import gradio as gr
4
  from openai import OpenAI
 
5
 
6
  # Configuración de claves de API
7
  NVIDIA_API_KEY = os.getenv("NVIDIA_API_KEY")
@@ -10,21 +11,57 @@ GEMINI_API_KEY = os.getenv("GEMINI_API_KEY")
10
  if not NVIDIA_API_KEY or not GEMINI_API_KEY:
11
  raise ValueError("Las claves de API no están configuradas. Asegúrate de establecer 'NVIDIA_API_KEY' y 'GEMINI_API_KEY'.")
12
 
13
- # Configuración de clientes OpenAI
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
  nvidia_client = OpenAI(
15
  base_url="https://integrate.api.nvidia.com/v1",
16
  api_key=NVIDIA_API_KEY
17
  )
18
-
19
- gemini_client = OpenAI(
20
- base_url="https://generativelanguage.googleapis.com/v1beta/openai/",
21
- api_key=GEMINI_API_KEY
22
- )
23
-
24
- # Mensaje del sistema
25
- system_message = {
26
  "role": "system",
27
- "content": """Asume el rol de Ministro de la Corte Suprema de Chile especializado en Derecho de Familia. Tu propósito es mejorar, perfeccionar y llevar al más alto nivel de redacción jurídica el borrador de una resolución judicial, siguiendo principios de estilo que aseguren claridad, precisión, concisión y formalidad sin modificar la sustancia, fundamentos ni contenido esencial de la decisión. Mantén un tono formal, técnico, imparcial y riguroso, propio de la Corte Suprema.
 
28
 
29
  Identidad y Propósito: Eres un asistente de IA que opera como un Ministro de la Corte Suprema de Chile, especializado en Derecho de Familia. Actúas con la autoridad y formalidad judicial necesarias para revisar y perfeccionar borradores de resoluciones judiciales. Cada fase del flujo debe cumplir con los estándares de claridad, precisión, concisión y formalidad del lenguaje judicial chileno sin alterar la esencia ni los fundamentos de las decisiones.
30
 
@@ -49,15 +86,24 @@ La salida será el borrador de la resolución judicial revisado y mejorado, pres
49
 
50
  # Notas
51
 
52
- Es crucial que el asistente de IA se adhiera estrictamente a las instrucciones, sin alterar la sustancia de la decisión judicial. El objetivo es perfeccionar la redacción, no modificar el contenido. Se debe mantener la formalidad y el rigor característico de los documentos de la Corte Suprema de Chile."""
 
53
  }
54
 
55
- # Función para interactuar con la API
56
- async def call_api(client, model_name, message, history):
57
  try:
58
- messages = [system_message] + history + [{"role": "user", "content": message}]
59
- completion = client.chat.completions.create(
60
- model=model_name,
 
 
 
 
 
 
 
 
61
  messages=messages,
62
  temperature=0.5,
63
  top_p=0.7,
@@ -65,65 +111,53 @@ async def call_api(client, model_name, message, history):
65
  )
66
  return completion.choices[0].message.content
67
  except Exception as e:
68
- return f"Error API: {e}"
69
-
70
- async def nvidia_response(message, history):
71
- return await call_api(nvidia_client, "meta/llama-3.1-405b-instruct", message, history)
72
 
73
- async def gemini_response(message, history):
74
- return await call_api(gemini_client, "gemini", message, history)
 
 
75
 
76
- # Función principal para procesar ambas respuestas
77
- async def respond_both_models(message, history, loading_state):
78
- loading_state = True
79
- yield history + [{"role": "user", "content": message}], loading_state
80
-
81
- nvidia_result, gemini_result = await asyncio.gather(
82
- nvidia_response(message, history),
83
- gemini_response(message, history)
84
  )
85
 
86
- loading_state = False
87
-
88
- if "Error API:" in nvidia_result:
89
- history.append({"role": "assistant", "content": f"**Error NVIDIA:**\n{nvidia_result}"})
90
- else:
91
- history.append({"role": "assistant", "content": f"**NVIDIA Response:**\n{nvidia_result}"})
92
 
93
- if "Error API:" in gemini_result:
94
- history.append({"role": "assistant", "content": f"**Error Gemini:**\n{gemini_result}"})
95
- else:
96
- history.append({"role": "assistant", "content": f"**Gemini Response:**\n{gemini_result}"})
97
 
98
- yield history, loading_state
99
 
100
- # Interfaz de usuario
101
  with gr.Blocks(theme=gr.themes.Soft()) as demo:
102
- gr.Markdown("# Ministro IA de la Corte Suprema - Derecho de Familia")
103
  with gr.Row():
104
- gr.Markdown("### Comparación de Modelos: NVIDIA vs Gemini")
105
 
106
- chatbot = gr.Chatbot(label="Respuestas de los Modelos", type='messages')
107
- message_input = gr.Textbox(
108
- label="Borrador de la Resolución",
109
- placeholder="Ingrese el borrador aquí...",
110
- lines=6,
111
  )
112
  submit_button = gr.Button("Enviar")
113
  clear_button = gr.Button("Limpiar")
114
 
115
- loading_state = gr.State(False)
116
- history = gr.State([])
117
 
118
  submit_button.click(
119
- respond_both_models,
120
- inputs=[message_input, history, loading_state],
121
- outputs=[chatbot, loading_state]
122
  )
123
  clear_button.click(
124
  lambda: ([], False),
125
  inputs=None,
126
- outputs=[chatbot, loading_state]
127
  )
128
 
129
  gr.Examples(
@@ -131,10 +165,9 @@ with gr.Blocks(theme=gr.themes.Soft()) as demo:
131
  ["El juez decide que el padre puede ver a su hijo los fines de semana."],
132
  ["Se ordena pagar una pensión a la madre para los gastos del niño."],
133
  ["El padre debe pagar la mitad de los gastos del colegio."],
134
- ["Considero que lo mejor para el niño es..."]
135
  ],
136
- inputs=message_input
137
  )
138
 
139
  if __name__ == "__main__":
140
- demo.launch()
 
1
  import os
2
  import asyncio
3
+ import google.generativeai as genai
4
  from openai import OpenAI
5
+ import gradio as gr
6
 
7
  # Configuración de claves de API
8
  NVIDIA_API_KEY = os.getenv("NVIDIA_API_KEY")
 
11
  if not NVIDIA_API_KEY or not GEMINI_API_KEY:
12
  raise ValueError("Las claves de API no están configuradas. Asegúrate de establecer 'NVIDIA_API_KEY' y 'GEMINI_API_KEY'.")
13
 
14
+ # Configuración de clientes
15
+ # Cliente Google Generative AI
16
+ genai.configure(api_key=GEMINI_API_KEY)
17
+ google_model = genai.GenerativeModel(
18
+ model_name="gemini-exp-1114",
19
+ system_instruction= """
20
+ Asume el rol de Ministro de la Corte Suprema de Chile especializado en Derecho de Familia. Tu propósito es mejorar, perfeccionar y llevar al más alto nivel de redacción jurídica el borrador de una resolución judicial, siguiendo principios de estilo que aseguren claridad, precisión, concisión y formalidad sin modificar la sustancia, fundamentos ni contenido esencial de la decisión. Mantén un tono formal, técnico, imparcial y riguroso, propio de la Corte Suprema.
21
+
22
+ Identidad y Propósito: Eres un asistente de IA que opera como un Ministro de la Corte Suprema de Chile, especializado en Derecho de Familia. Actúas con la autoridad y formalidad judicial necesarias para revisar y perfeccionar borradores de resoluciones judiciales. Cada fase del flujo debe cumplir con los estándares de claridad, precisión, concisión y formalidad del lenguaje judicial chileno sin alterar la esencia ni los fundamentos de las decisiones.
23
+
24
+ Principios Generales para la Redacción Jurídica:
25
+ * Tono Formal y Técnico: Mantén un tono formal, autoritario e impersonal. Emplea el modo imperativo en expresiones de orden y mandato judicial, como 'Notifíquese', 'Archívese' o 'Cítese'. Proyecta neutralidad y profesionalismo en todo el texto; evita cualquier tono subjetivo o interpretativo.
26
+ * Precisión y Claridad: Usa terminología jurídica específica del Derecho de Familia, como 'patria potestad', 'derecho de visitas' o 'pensión alimenticia', evitando sinónimos menos técnicos. Asegura que cada enunciado sea claro y preciso, sin ambigüedades que puedan dar lugar a interpretaciones erróneas.
27
+ * Concisión y Economía de Palabras: Emplea una redacción directa, donde cada palabra tenga una función clara. Evita redundancias y expresiones superfluas para facilitar una comprensión inmediata y sin distracciones.
28
+ * Uso de Términos y Expresiones Propios del Derecho Chileno: Utiliza expresiones tradicionales y formales del ámbito judicial chileno, como 'Notifíquese por el estado diario'. En conclusiones y firmas, emplea frases estándar del lenguaje jurídico chileno, como 'Proveyó y firmó el Juez mediante firma electrónica avanzada'.
29
+
30
+ # Pasos
31
+
32
+ 1. **Lectura y Análisis del Borrador:** Revisa el borrador completo de la resolución judicial para entender el contexto, los argumentos presentados y la decisión tomada. Identifica áreas que requieran mejoras en términos de claridad, precisión, concisión y formalidad.
33
+ 2. **Aplicación del Tono Formal y Técnico:** Asegúrate de que el lenguaje utilizado sea apropiado para una resolución judicial de la Corte Suprema. Utiliza el modo imperativo en los mandatos judiciales. Elimina cualquier expresión coloquial o subjetiva, reemplazándola con un lenguaje técnico y neutral.
34
+ 3. **Mejora de la Precisión y Claridad:** Verifica que la terminología jurídica utilizada sea específica y correcta, especialmente aquella relacionada con el Derecho de Familia. Revisa cada enunciado para eliminar ambigüedades y asegurar que la intención de la corte sea clara e inequívoca.
35
+ 4. **Asegurar la Concisión y Economía de Palabras:** Revisa cada frase y párrafo para eliminar redundancias y expresiones innecesarias. Simplifica la estructura de las oraciones sin perder la precisión, asegurando que cada palabra contribuya al significado del texto.
36
+ 5. **Uso Adecuado de Términos y Expresiones Judiciales Chilenas:** Incorpora o revisa las expresiones formales tradicionales del ámbito judicial chileno, asegurando que se utilicen correctamente y en el contexto adecuado. Verifica que las conclusiones y firmas sigan el formato estándar del lenguaje jurídico chileno.
37
+ 6. **Revisión Final y Corrección:** Realiza una revisión final del documento para asegurar que todas las modificaciones se hayan implementado correctamente y que la resolución mantenga su coherencia y lógica. Corrige cualquier error gramatical o de estilo que pueda haber quedado.
38
+
39
+ # Formato de Salida
40
+
41
+ La salida será el borrador de la resolución judicial revisado y mejorado, presentado en formato de texto. El texto debe mantener el formato y la estructura original del borrador, pero con las mejoras estilísticas y de lenguaje implementadas según las directrices proporcionadas.
42
+
43
+ # Notas
44
+
45
+ Es crucial que el asistente de IA se adhiera estrictamente a las instrucciones, sin alterar la sustancia de la decisión judicial. El objetivo es perfeccionar la redacción, no modificar el contenido. Se debe mantener la formalidad y el rigor característico de los documentos de la Corte Suprema de Chile.
46
+ """.strip(),
47
+ generation_config={
48
+ "temperature": 0.5,
49
+ "top_p": 0.7,
50
+ "top_k": 40,
51
+ "max_output_tokens": 4000,
52
+ "response_mime_type": "text/plain",
53
+ },
54
+ )
55
+
56
+ Cliente NVIDIA
57
  nvidia_client = OpenAI(
58
  base_url="https://integrate.api.nvidia.com/v1",
59
  api_key=NVIDIA_API_KEY
60
  )
61
+ nvidia_system_message = {
 
 
 
 
 
 
 
62
  "role": "system",
63
+ "content": """
64
+ Asume el rol de Ministro de la Corte Suprema de Chile especializado en Derecho de Familia. Tu propósito es mejorar, perfeccionar y llevar al más alto nivel de redacción jurídica el borrador de una resolución judicial, siguiendo principios de estilo que aseguren claridad, precisión, concisión y formalidad sin modificar la sustancia, fundamentos ni contenido esencial de la decisión. Mantén un tono formal, técnico, imparcial y riguroso, propio de la Corte Suprema.
65
 
66
  Identidad y Propósito: Eres un asistente de IA que opera como un Ministro de la Corte Suprema de Chile, especializado en Derecho de Familia. Actúas con la autoridad y formalidad judicial necesarias para revisar y perfeccionar borradores de resoluciones judiciales. Cada fase del flujo debe cumplir con los estándares de claridad, precisión, concisión y formalidad del lenguaje judicial chileno sin alterar la esencia ni los fundamentos de las decisiones.
67
 
 
86
 
87
  # Notas
88
 
89
+ Es crucial que el asistente de IA se adhiera estrictamente a las instrucciones, sin alterar la sustancia de la decisión judicial. El objetivo es perfeccionar la redacción, no modificar el contenido. Se debe mantener la formalidad y el rigor característico de los documentos de la Corte Suprema de Chile.
90
+ """.strip()
91
  }
92
 
93
+ # Función para llamar al modelo de Google
94
+ async def google_response(borrador):
95
  try:
96
+ response = google_model.generate_content(prompt=borrador)
97
+ return response.text
98
+ except Exception as e:
99
+ return f"Error en Google Generative AI: {e}"
100
+
101
+ # Función para llamar al modelo de NVIDIA
102
+ async def nvidia_response(borrador):
103
+ try:
104
+ messages = [nvidia_system_message, {"role": "user", "content": borrador}]
105
+ completion = nvidia_client.chat.completions.create(
106
+ model="meta/llama-3.1-405b-instruct", # Cambiar si usas otro modelo NVIDIA
107
  messages=messages,
108
  temperature=0.5,
109
  top_p=0.7,
 
111
  )
112
  return completion.choices[0].message.content
113
  except Exception as e:
114
+ return f"Error en NVIDIA API: {e}"
 
 
 
115
 
116
+ # Función para procesar ambas respuestas
117
+ async def procesar_respuestas(borrador, chat_historial, cargando):
118
+ cargando = True
119
+ yield chat_historial + [{"role": "user", "content": borrador}], cargando
120
 
121
+ google_result, nvidia_result = await asyncio.gather(
122
+ google_response(borrador),
123
+ nvidia_response(borrador)
 
 
 
 
 
124
  )
125
 
126
+ cargando = False
 
 
 
 
 
127
 
128
+ # Agregar respuestas al historial
129
+ chat_historial.append({"role": "assistant", "content": f"**Google Response:**\n{google_result}"})
130
+ chat_historial.append({"role": "assistant", "content": f"**NVIDIA Response:**\n{nvidia_result}"})
 
131
 
132
+ yield chat_historial, cargando
133
 
134
+ # Configuración de la interfaz de usuario
135
  with gr.Blocks(theme=gr.themes.Soft()) as demo:
136
+ gr.Markdown("# Comparador de Modelos Jurídicos: Google Gemini vs NVIDIA")
137
  with gr.Row():
138
+ gr.Markdown("### Prueba dos modelos IA para redactar resoluciones judiciales")
139
 
140
+ chatbox = gr.Chatbot(label="Respuestas de los Modelos", type="messages")
141
+ input_text = gr.Textbox(
142
+ label="Borrador de Resolución",
143
+ placeholder="Introduce el texto que deseas perfeccionar...",
144
+ lines=6
145
  )
146
  submit_button = gr.Button("Enviar")
147
  clear_button = gr.Button("Limpiar")
148
 
149
+ cargando = gr.State(False)
150
+ chat_historial = gr.State([])
151
 
152
  submit_button.click(
153
+ procesar_respuestas,
154
+ inputs=[input_text, chat_historial, cargando],
155
+ outputs=[chatbox, cargando]
156
  )
157
  clear_button.click(
158
  lambda: ([], False),
159
  inputs=None,
160
+ outputs=[chatbox, cargando]
161
  )
162
 
163
  gr.Examples(
 
165
  ["El juez decide que el padre puede ver a su hijo los fines de semana."],
166
  ["Se ordena pagar una pensión a la madre para los gastos del niño."],
167
  ["El padre debe pagar la mitad de los gastos del colegio."],
 
168
  ],
169
+ inputs=input_text
170
  )
171
 
172
  if __name__ == "__main__":
173
+ demo.launch()