cesar commited on
Commit
85b6c95
·
verified ·
1 Parent(s): 1b22788

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +38 -25
app.py CHANGED
@@ -42,27 +42,33 @@ def extraer_texto(pdf_path: str) -> str:
42
  return texto_total
43
 
44
  def parsear_con_llm(texto_pdf: str, model: GenerativeModel) -> dict:
45
- # Instrucciones para parsear:
46
- prompt = f"""
47
- Eres un parser de texto.
48
- A continuación tienes el contenido de un PDF con un examen (o respuestas).
49
- Debes extraer todas las preguntas y sus respuestas.
50
- Considera que las palabras podrían estar en mayúsculas, minúsculas o plural
51
- (por ejemplo 'Pregunta', 'PREGUNTA', 'Preguntas', 'RESPUESTA', 'RESPUESTAS', etc.).
52
- Devuélvelas en formato JSON puro, sin explicación adicional.
53
- Usa este formato de salida:
54
-
55
- {{
56
- "Pregunta 1": "Texto de la respuesta",
57
- "Pregunta 2": "Texto de la respuesta"
58
- }}
59
-
60
- Si hay preguntas sin respuesta, pon la respuesta como cadena vacía.
61
- Si no hay ninguna pregunta, devuelve un JSON vacío: {{}}
62
-
63
- Texto PDF:
64
- {texto_pdf}
65
  """
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
  part_text = Part.from_text(prompt)
67
 
68
  response = model.generate_content(
@@ -85,7 +91,9 @@ def comparar_preguntas_respuestas(dict_docente: dict, dict_alumno: dict) -> str:
85
  for pregunta, resp_correcta in dict_docente.items():
86
  resp_alumno = dict_alumno.get(pregunta, None)
87
  if resp_alumno is None:
88
- retroalimentacion.append(f"**{pregunta}**\nNo fue asignada al alumno.\n")
 
 
89
  else:
90
  retroalimentacion.append(
91
  f"**{pregunta}**\n"
@@ -102,21 +110,25 @@ def revisar_examen(json_cred, pdf_docente, pdf_alumno):
102
  texto_docente = extraer_texto(pdf_docente.name)
103
  texto_alumno = extraer_texto(pdf_alumno.name)
104
 
 
105
  model = GenerativeModel(
106
  "gemini-1.5-pro-001",
107
  system_instruction=["Eres un parser estricto."]
108
  )
109
 
 
110
  dict_docente = parsear_con_llm(texto_docente, model)
111
  dict_alumno = parsear_con_llm(texto_alumno, model)
112
 
 
113
  feedback = comparar_preguntas_respuestas(dict_docente, dict_alumno)
114
 
115
  if len(feedback.strip()) < 5:
116
  return "No se encontraron preguntas o respuestas válidas."
117
-
 
118
  summary_prompt = f"""
119
- Eres un profesor experto. Te muestro la comparación de preguntas y respuestas:
120
  {feedback}
121
  Por favor, genera un breve resumen del desempeño del alumno
122
  sin inventar preguntas adicionales.
@@ -144,8 +156,9 @@ interface = gr.Interface(
144
  ],
145
  outputs=gr.Markdown(),
146
  title="Revisión de Exámenes con LLM (Permisivo)",
147
- description="Sube credenciales, el PDF del docente y del alumno; se emplea un LLM para encontrar 'Pregunta/Respuesta' aun con variaciones."
 
 
148
  )
149
 
150
  interface.launch(debug=True)
151
-
 
42
  return texto_total
43
 
44
  def parsear_con_llm(texto_pdf: str, model: GenerativeModel) -> dict:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
45
  """
46
+ Usa el LLM para extraer preguntas y respuestas:
47
+ - Considera que 'Explicá' o 'Explica' o 'Explique' es una pregunta,
48
+ aunque no diga 'Pregunta:'.
49
+ - Reconoce 'RESPUESTA', 'RESPUESTAS', con o sin dos puntos,
50
+ como inicio de la respuesta.
51
+ """
52
+ prompt = f"""
53
+ Eres un parser de texto.
54
+ Te entrego el contenido de un PDF con una pregunta o varias,
55
+ y su(s) respuesta(s). Usa estas reglas para interpretarlo:
56
+ 1. Si ves 'Explicá', 'Explica', 'Explique', 'Teniendo en cuenta que...'
57
+ o algo similar, asúmelo como una pregunta.
58
+ Si no hay 'Pregunta:' literal, aun así consideralo pregunta.
59
+ 2. Las respuestas podrían estar marcadas como 'RESPUESTAS', 'RESPUESTA', 'RESPUESTAS:', etc.
60
+ 3. Devuelve un JSON con la estructura:
61
+ {{
62
+ "Pregunta 1": "Texto de la respuesta"
63
+ }}
64
+ Si hay más de una pregunta, enumerarlas como 'Pregunta 2', etc.
65
+ 4. Si no hay nada reconocible, devuelve {{}}.
66
+
67
+ Texto PDF:
68
+ {texto_pdf}
69
+
70
+ Devuelve solo el JSON, sin explicaciones ni texto extra.
71
+ """
72
  part_text = Part.from_text(prompt)
73
 
74
  response = model.generate_content(
 
91
  for pregunta, resp_correcta in dict_docente.items():
92
  resp_alumno = dict_alumno.get(pregunta, None)
93
  if resp_alumno is None:
94
+ retroalimentacion.append(
95
+ f"**{pregunta}**\nNo fue asignada al alumno.\n"
96
+ )
97
  else:
98
  retroalimentacion.append(
99
  f"**{pregunta}**\n"
 
110
  texto_docente = extraer_texto(pdf_docente.name)
111
  texto_alumno = extraer_texto(pdf_alumno.name)
112
 
113
+ # 1) Instanciar el modelo
114
  model = GenerativeModel(
115
  "gemini-1.5-pro-001",
116
  system_instruction=["Eres un parser estricto."]
117
  )
118
 
119
+ # 2) Convertir PDF Docente y Alumno en dict {Pregunta X: Respuesta X}
120
  dict_docente = parsear_con_llm(texto_docente, model)
121
  dict_alumno = parsear_con_llm(texto_alumno, model)
122
 
123
+ # 3) Comparar y generar feedback
124
  feedback = comparar_preguntas_respuestas(dict_docente, dict_alumno)
125
 
126
  if len(feedback.strip()) < 5:
127
  return "No se encontraron preguntas o respuestas válidas."
128
+
129
+ # 4) Generar un resumen
130
  summary_prompt = f"""
131
+ Eres un profesor experto de bioquímica. Te muestro la comparación de preguntas y respuestas:
132
  {feedback}
133
  Por favor, genera un breve resumen del desempeño del alumno
134
  sin inventar preguntas adicionales.
 
156
  ],
157
  outputs=gr.Markdown(),
158
  title="Revisión de Exámenes con LLM (Permisivo)",
159
+ description=("Sube credenciales, el PDF del docente y del alumno; "
160
+ "se emplea un LLM para encontrar 'Explicá' y 'RESPUESTAS' etc. "
161
+ "y evitar alucinaciones.")
162
  )
163
 
164
  interface.launch(debug=True)