Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -1,76 +1,148 @@
|
|
1 |
-
from langchain.
|
2 |
-
from langchain.
|
3 |
-
from langchain.
|
4 |
-
from
|
5 |
-
|
6 |
-
|
7 |
-
|
8 |
-
from langchain.prompts.chat import SystemMessagePromptTemplate, HumanMessagePromptTemplate
|
9 |
import gradio as gr
|
10 |
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
llm=llm,
|
39 |
-
retriever=vectordb.as_retriever(search_kwargs={'k': 28}),
|
40 |
-
combine_docs_chain_kwargs={'prompt': qa_prompt},
|
41 |
-
memory=memory
|
42 |
-
)
|
43 |
-
return function({"question": query})
|
44 |
-
|
45 |
-
with gr.Blocks() as demo:
|
46 |
-
chatbot = gr.Chatbot(label="Orientador de carreras", value=[[None, '''
|
47 |
-
¡Hola! Soy tu Orientador de Carreras. Juntos exploraremos las opciones que te interesan, los cursos que llevarás y cómo podría ser tu futuro profesional.
|
48 |
-
Cuéntame qué carreras te llaman la atención y podrás hacerme preguntas como:
|
49 |
-
|
50 |
-
- ¿Cuál es la mejor carrera para mí?
|
51 |
-
- ¿Qué cursos veré en esas carreras?
|
52 |
-
- ¿Cómo es un día típico como estudiante en la carrera que me interesa?
|
53 |
-
- ¿Cómo es la vida diaria de un egresado de esas carreras?
|
54 |
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
60 |
|
61 |
-
|
62 |
-
|
63 |
-
|
|
|
64 |
|
65 |
-
|
|
|
|
|
|
|
66 |
|
67 |
-
|
68 |
-
|
|
|
|
|
|
|
69 |
|
70 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
71 |
|
72 |
-
|
73 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
74 |
|
75 |
if __name__ == "__main__":
|
76 |
-
|
|
|
1 |
+
from langchain.prompts import PromptTemplate, ChatMessagePromptTemplate
|
2 |
+
from langchain.chains import LLMChain
|
3 |
+
from langchain.llms import OpenAI
|
4 |
+
from langchain_community.document_loaders import Docx2txtLoader
|
5 |
+
import tempfile
|
6 |
+
import magic
|
7 |
+
|
|
|
8 |
import gradio as gr
|
9 |
|
10 |
+
def classify_text_chat(template, work, exam):
|
11 |
+
response = openai.ChatCompletion.create(
|
12 |
+
model="gpt-4o-mini",
|
13 |
+
messages=[
|
14 |
+
{"role": "system", "content": template},
|
15 |
+
{"role": "user", "content": f"Estas son las indicaciones del examen: {exam} ."},
|
16 |
+
{"role": "user", "content": f"Este ese el trabajo del alumno: {work}"}
|
17 |
+
],
|
18 |
+
max_tokens=1000,
|
19 |
+
temperature=0)
|
20 |
+
return response['choices'][0]['message']['content'].strip()
|
21 |
+
|
22 |
+
def read_docx(file_path):
|
23 |
+
loader = Docx2txtLoader(file_path)
|
24 |
+
documents = loader.load()
|
25 |
+
return documents[0].page_content
|
26 |
+
|
27 |
+
# Predefined exam questions
|
28 |
+
loader = Docx2txtLoader("EXAMEN FINAL_DESARROLLO HUMANO Y SOCIAL.docx")
|
29 |
+
data = loader.load()
|
30 |
+
EXAM_QUESTIONS = data
|
31 |
+
|
32 |
+
def process_student_work(docx_file):
|
33 |
+
# Create a temporary file
|
34 |
+
with tempfile.NamedTemporaryFile(delete=False, suffix=".docx") as temp_file:
|
35 |
+
temp_file.write(docx_file)
|
36 |
+
temp_path = temp_file.name
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
37 |
|
38 |
+
try:
|
39 |
+
# Read the DOCX file
|
40 |
+
student_work = read_docx(temp_path)
|
41 |
+
|
42 |
+
# Define the template (you can also load this from a file if it's too long)
|
43 |
+
template = """
|
44 |
+
A continuación, evalúa el ensayo de un alumno utilizando los siguientes criterios de acuerdo con la rúbrica de evaluación. Para cada sección, asigna un puntaje y proporciona feedback detallado basado en los niveles de logro: Excelente, Bien, Regular, Deficiente, o Malo. Asegúrate de justificar cada puntuación dada y de señalar áreas de mejora. Asume el rol de un docente universitario que analiza con detenimiento y es sumamente estricto y minucioso al calfica, respetando al pie de la letra la rúbrica.
|
45 |
+
|
46 |
+
### Introducción (Máximo: 5 puntos)
|
47 |
+
|
48 |
+
- Excelente (5-4 puntos): Explica con claridad de qué trata el ensayo y cómo se abordará, especificando las partes que lo componen y una pequeña descripción de cada una de ellas.
|
49 |
+
- Bien (3 puntos): Explica de qué trata el ensayo, especificando las partes que lo componen, pero no brinda descripción de cada una de ellas.
|
50 |
+
- Regular (2 puntos): Presenta una introducción, pero no se refiere concretamente al ensayo, es decir, al qué y al cómo.
|
51 |
+
- Deficiente (1 punto): El propósito del ensayo no es claro ni específico.
|
52 |
+
- Malo (0 puntos): No incluye la introducción.
|
53 |
+
|
54 |
+
### Contenido y Análisis (Máximo: 6 puntos)
|
55 |
+
|
56 |
+
- Excelente (6-5 puntos): Presenta la idea principal del ensayo y desarrolla por lo menos cinco argumentos, notándose un análisis personal y sustentándolos con citas, notas o referencias bibliográficas.
|
57 |
+
- Bien (4-3 puntos): Presenta la idea principal del ensayo y desarrolla cuatro argumentos sustentándolos con citas, notas o referencias bibliográficas.
|
58 |
+
- Regular (2 puntos): Presenta la idea principal del ensayo y desarrolla tres argumentos sustentándolos con citas, notas o referencias bibliográficas.
|
59 |
+
- Deficiente (1 punto): Presenta menos del 50% de los elementos sugeridos en el tema asignado. Hay por lo menos un párrafo que es copiado o igual al de un compañero.
|
60 |
+
- Malo (0 puntos): No presenta los puntos sugeridos sobre el tema o bien repite textualmente lo de otros o su sustento no tiene una base teórica.
|
61 |
+
|
62 |
+
### Conclusiones (Máximo: 5 puntos)
|
63 |
+
|
64 |
+
- Excelente (5-4 puntos): Incluye opiniones personales combinadas con argumentos bibliográficos.
|
65 |
+
- Bien (3 puntos): Solo incluye opiniones personales.
|
66 |
+
- Regular (2 puntos): Solo incluye un resumen del resto del ensayo.
|
67 |
+
- Deficiente (1 punto): Es demasiado corta (menor a 3 líneas).
|
68 |
+
- Malo (0 puntos): No presenta o desarrolla conclusiones.
|
69 |
+
|
70 |
+
Para tener mayor contexto, estos son ejemplos de argumentos y conclusiones con argumentos bibliográficos.
|
71 |
+
|
72 |
+
Durante las últimas décadas el concepto de mercado ha tomado protagonismo en la economía mundial por ello “algunos mercados son lugares físicos donde se reúnen compradores y vendedores, y donde un subastador o un corredor ayudan a determinar los precios” (Parkin, 2018, p. 56).
|
73 |
+
|
74 |
+
En estudios recientes, se ha evidenciado la importancia de la transformación digital en los negocios, ya que “la adopción de nuevas tecnologías ha permitido un crecimiento exponencial en múltiples sectores” (García & López, 2021, p. 78).
|
75 |
+
|
76 |
+
Según la Organización Mundial de la Salud (2021), “la pandemia ha generado cambios sustanciales en la forma en que las organizaciones de salud responden a las crisis” (p. 34).
|
77 |
+
|
78 |
+
El cambio climático sigue siendo un tema prioritario en las agendas internacionales, lo cual se refleja en la afirmación de Sánchez (2022): “la sostenibilidad se ha convertido en un pilar clave para el desarrollo empresarial” (p. 22).
|
79 |
+
|
80 |
+
### Referencias Bibliográficas (Máximo: 4 puntos)
|
81 |
+
|
82 |
+
- Excelente (4 puntos): Incluye una sección de referencias bibliográficas al finalizar el documento e incluye cuatro referencias bibliográficas en formato APA.
|
83 |
+
- Bien (3 puntos): Incluye una sección de referencias bibliográficas al finalizar el documento e incluye tres referencias bibliográficas en formato APA.
|
84 |
+
- Regular (2 puntos): Incluye una sección de referencias bibliográficas al finalizar el documento e incluye dos referencias bibliográficas en formato APA.
|
85 |
+
- Deficiente (1 punto): Incluye una sección de referencias bibliográficas al finalizar el documento e incluye una referencia bibliográfica o más, pero sin formato APA.
|
86 |
+
- Malo (0 puntos): No incluye referencias bibliográficas.
|
87 |
+
|
88 |
+
Para tener mayor contexto, estos son ejemplos de referencias bibliográficas en formato APA:
|
89 |
+
1. Smith, J. (2020). Innovación y negocios (2ª ed.). Editorial Alfa.
|
90 |
+
|
91 |
+
2. Brown, L. (2019). Estrategias empresariales. En P. Rodríguez (Ed.), Estrategias de mercado (pp. 45-60). Editorial Beta.
|
92 |
+
|
93 |
+
3. García, M. & López, P. (2021). Transformación digital en las empresas. Revista de Innovación, 15(3), 45-60. https://doi.org/10.1234/rdi.2021.0056
|
94 |
+
|
95 |
+
4. Sánchez, D. (2022, marzo 15). Las nuevas tendencias de la inteligencia artificial. Tecnología Hoy. https://www.tecnologiahoy.com/tendencias2022
|
96 |
+
|
97 |
+
5. Organización Mundial de la Salud. (2021). Informe sobre salud mundial (Informe No. 123). https://www.who.int/informe2021
|
98 |
+
|
99 |
+
### A continuación, te presento un ejemplo de cómo debes estructurar la evaluación. Sé muy cuidados al sumar los puntos y otorgar la nota final.
|
100 |
+
|
101 |
+
**Introducción**
|
102 |
+
Feedback: El alumno explica de manera clara el propósito del ensayo y menciona brevemente las partes que lo componen, pero no profundiza en cómo serán abordadas esas partes en el desarrollo del trabajo.
|
103 |
+
**Áreas de mejora**: Desarrollar más en profundidad la introducción, explicando claramente el 'cómo' se abordará el análisis.
|
104 |
+
**Puntuación: 3 puntos (Bien)**.
|
105 |
+
|
106 |
+
**Contenido y Análisis**
|
107 |
+
Feedback: El alumno desarrolla cuatro argumentos sólidos y los sustenta adecuadamente con citas y referencias. Sin embargo, dos de los argumentos no están completamente alineados con el tema central del ensayo, lo que limita el análisis en profundidad.
|
108 |
+
**Áreas de mejora**: Profundizar en el análisis crítico de los argumentos y asegurar que todos los argumentos estén alineados con la idea central del ensayo.
|
109 |
+
**Puntuación: 4 puntos (Bien)**.
|
110 |
|
111 |
+
**Conclusiones**
|
112 |
+
Feedback: Las conclusiones presentadas resumen adecuadamente el contenido del ensayo, pero carecen de opiniones personales o una reflexión crítica. El análisis se limita a repetir puntos ya tratados en el cuerpo del ensayo.
|
113 |
+
**Áreas de mejora**: Incorporar más opiniones personales y conectar las conclusiones con argumentos o citas bibliográficas para fortalecer la reflexión final.
|
114 |
+
**Puntuación: 2 puntos (Regular)**.
|
115 |
|
116 |
+
**Referencias Bibliográficas**
|
117 |
+
Feedback: El alumno incluyó tres referencias bibliográficas en formato APA correctamente. Sin embargo, para alcanzar el nivel máximo se requiere una referencia adicional.
|
118 |
+
**Áreas de mejora**: Añadir al menos una referencia más para cumplir con el criterio de cuatro referencias.
|
119 |
+
**Puntuación: 3 puntos (Bien)**.
|
120 |
|
121 |
+
**Nota final: 12 puntos**
|
122 |
+
|
123 |
+
**Feedback final:**
|
124 |
+
El alumno ha demostrado un buen nivel de comprensión del tema y ha presentado argumentos sólidos sustentados en citas bibliográficas. Sin embargo, se necesita profundizar en el análisis crítico y mejorar la integración de las conclusiones. En general, el trabajo está bien estructurado y organizado, pero se recomienda reforzar la parte de conclusiones y añadir una referencia adicional para cumplir con los criterios de la rúbrica.
|
125 |
+
"""
|
126 |
|
127 |
+
|
128 |
+
# Generate feedback
|
129 |
+
feedback = classify_text_chat(template, student_work, EXAM_QUESTIONS)
|
130 |
+
|
131 |
+
return feedback
|
132 |
+
finally:
|
133 |
+
# Clean up the temporary file
|
134 |
+
os.remove(temp_path)
|
135 |
|
136 |
+
# Define the Gradio interface
|
137 |
+
iface = gr.Interface(
|
138 |
+
fn=process_student_work,
|
139 |
+
inputs=[
|
140 |
+
gr.File(label="Subir archivo .docx del alumno (DOCX)", type="binary")
|
141 |
+
],
|
142 |
+
outputs=gr.Textbox(label="Feedback", lines=10),
|
143 |
+
title="Evaluación - Examen Final Desarrollo Humano y Social",
|
144 |
+
description="Cargar archivo .docx del alumno (DOCX) para generar feedback automático."
|
145 |
+
)
|
146 |
|
147 |
if __name__ == "__main__":
|
148 |
+
ifca.launch()
|