diff --git a/extraccion/__init__.py b/extraccion/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/extraccion/agentes_entidades.py b/extraccion/agentes_entidades.py index 3c7c177..8da222d 100644 --- a/extraccion/agentes_entidades.py +++ b/extraccion/agentes_entidades.py @@ -2,6 +2,8 @@ from llm.context import LLMContext from llm.config import LLMConfig from extraccion.schemas_entidades import ( Acciones, + Expectativa, + Opinion, Temas, Estrategias, Factores, @@ -9,6 +11,8 @@ from extraccion.schemas_entidades import ( Competencias, Herramientas, Mecanismos, + Opiniones, + Expectativas, ) import yaml @@ -38,7 +42,7 @@ def extractor_pre_1(respuesta: str) -> Acciones: llm_so = llm.with_structured_output(Acciones) - acciones: list = llm_so.invoke(prompt) + acciones = llm_so.invoke(prompt) lista_acciones = acciones.acciones @@ -62,7 +66,7 @@ def extractor_pre_2(respuesta: str) -> Acciones: llm_so = llm.with_structured_output(Acciones) - acciones: list = llm_so.invoke(prompt) + acciones = llm_so.invoke(prompt) lista_acciones = acciones.acciones @@ -86,7 +90,7 @@ def extractor_pre_3(respuesta: str) -> Temas: llm_so = llm.with_structured_output(Temas) - temas: list = llm_so.invoke(prompt) + temas = llm_so.invoke(prompt) lista_temas = temas.temas @@ -110,7 +114,7 @@ def extractor_pre_4(respuesta: str) -> Temas: llm_so = llm.with_structured_output(Temas) - temas: list = llm_so.invoke(prompt) + temas = llm_so.invoke(prompt) lista_temas = temas.temas @@ -134,7 +138,7 @@ def extractor_pre_5(respuesta: str) -> Estrategias: llm_so = llm.with_structured_output(Estrategias) - estrategias: list = llm_so.invoke(prompt) + estrategias = llm_so.invoke(prompt) lista_estrategias = estrategias.estrategias @@ -158,7 +162,7 @@ def extractor_pre_6(respuesta: str) -> Mecanismos: llm_so = llm.with_structured_output(Mecanismos) - mecanismos: list = llm_so.invoke(prompt) + mecanismos = llm_so.invoke(prompt) lista_mecanismos = mecanismos.mecanismos @@ -182,7 +186,7 @@ def extractor_pre_7(respuesta: str) -> Estrategias: llm_so = llm.with_structured_output(Estrategias) - estrategias: list = llm_so.invoke(prompt) + estrategias = llm_so.invoke(prompt) lista_estrategias = estrategias.estrategias @@ -206,7 +210,7 @@ def extractor_pre_8(respuesta: str) -> Factores: llm_so = llm.with_structured_output(Factores) - factores: list = llm_so.invoke(prompt) + factores = llm_so.invoke(prompt) lista_factores = factores.factores @@ -230,7 +234,7 @@ def extractor_pre_9(respuesta: str) -> Entidades: llm_so = llm.with_structured_output(Entidades) - entidades: list = llm_so.invoke(prompt) + entidades = llm_so.invoke(prompt) lista_entidades = entidades.entidades @@ -276,7 +280,7 @@ def extractor_pre_11(respuesta: str) -> Herramientas: llm_so = llm.with_structured_output(Herramientas) - herramientas: list = llm_so.invoke(prompt) + herramientas = llm_so.invoke(prompt) lista_herramientas = herramientas.herramientas @@ -288,11 +292,108 @@ def extractor_pre_11(respuesta: str) -> Herramientas: return herramientas +def extractor_pre_12(respuesta: str) -> Opiniones: + prompt = prompts_config["prompts"]["pregunta_12"]["prompt"].format( + respuesta=respuesta + ) + + config = LLMConfig(provider="anthropic", model_name="claude-haiku-4-5") + + context.set_strategy(config) + llm = context.get_llm() + + llm_so = llm.with_structured_output(Opiniones) + + opiniones = llm_so.invoke(prompt) + + lista_opiniones = opiniones.opiniones + + for opinion in lista_opiniones: + print("-" * 100) + print(opinion.opinion) + print("-" * 100) + + return opiniones + + +def extractor_pre_13(respuesta: str) -> Expectativas: + prompt = prompts_config["prompts"]["pregunta_13"]["prompt"].format( + respuesta=respuesta + ) + + config = LLMConfig(provider="anthropic", model_name="claude-haiku-4-5") + + context.set_strategy(config) + llm = context.get_llm() + + llm_so = llm.with_structured_output(Expectativas) + + expectativas = llm_so.invoke(prompt) + + lista_expectativas = expectativas.expectativas + + for expectativa in lista_expectativas: + print("-" * 100) + print(expectativa.expectativa) + print("-" * 100) + + return expectativas + + +def extractor_pre_14(respuesta: str) -> Opiniones: + prompt = prompts_config["prompts"]["pregunta_14"]["prompt"].format( + respuesta=respuesta + ) + + config = LLMConfig(provider="anthropic", model_name="claude-haiku-4-5") + + context.set_strategy(config) + llm = context.get_llm() + + llm_so = llm.with_structured_output(Opiniones) + + opiniones = llm_so.invoke(prompt) + + lista_opiniones = opiniones.opiniones + + for opinion in lista_opiniones: + print("-" * 100) + print(opinion.opinion) + print("-" * 100) + + return opiniones + + +def extractor_pre_15(respuesta: str) -> Opiniones: + prompt = prompts_config["prompts"]["pregunta_14"]["prompt"].format( + respuesta=respuesta + ) + + config = LLMConfig(provider="anthropic", model_name="claude-haiku-4-5") + + context.set_strategy(config) + llm = context.get_llm() + + llm_so = llm.with_structured_output(Opiniones) + + opiniones = llm_so.invoke(prompt) + + lista_opiniones = opiniones.opiniones + + for opinion in lista_opiniones: + print("-" * 100) + print(opinion.opinion) + print("-" * 100) + + return opiniones + + respuesta = """ -Cada semestre en nuestra programación están estipuladas dos capacitaciones según -las necesidades que los profesores expresen. Cuando algunos profesores participan -en fotos o seminarios deben de comprometerse a compartir lo aprendido sacando para -ello un espacio en la reunión de profesores, también deben de enviar un correo con -el certificado +A la fecha no conocemos si se ha realizado o no, ya que no +hemos tenido conocimiento si el rector las conoce o está gestionando. +Desde el núcleo de ciencias naturales en el año 2022 se realizó una +alianza con cornare y la UMATA, dicha invitación a participar se hizo +por la página de la secretaria departamental, donde a partir de un +infograma explicaba paso a paso como participar y además contaba con linea telefónica. """ -extractor_pre_6(respuesta) +# extractor_pre_15(respuesta) diff --git a/extraccion/prompts.yaml b/extraccion/prompts.yaml index db5796c..7b92350 100644 --- a/extraccion/prompts.yaml +++ b/extraccion/prompts.yaml @@ -661,34 +661,98 @@ prompts: Tu tarea es: - 1. Leer cuidadosamente la explicación e identificar las **razones, justificaciones o ejemplos** clave que la persona da. - 2. Extraer cada razón, fortaleza, debilidad o ejemplo clave como un elemento separado. + 1. Leer cuidadosamente la explicación e identificar las **razones, justificaciones, procesos o ejemplos** clave que la persona da. + 2. Extraer cada razón, proceso o ejemplo clave como un elemento separado. 3. Reescribir cada ítem para que sea claro, conciso y capture la esencia del punto de la explicación. 4. Asegurarte de que cada ítem responda directamente a la instrucción ("Explique..."). Por ejemplo, si la instrucción fuera: "Explique brevemente su respuesta anterior [sobre la pertinencia del currículo], señale ejemplos." y la respuesta (explicación) fuera: - "Responde bien a las aspiraciones de los estudiantes porque incluimos una media técnica en software que es lo que ellos piden. Pero falla en responder al contexto regional, ya que nuestra región es agrícola y no tenemos proyectos en ese frente.", + "Nuestras actividades están planeadas desde principio de año de acuerdo a las experiencias vividas en el año anterior, siempre basadas en el proyectos educativos que tienen como eje central las necesidades del entorno, para que los estudiante de educación media desarrollen su pensamiento crítico y análitico. + Son ellos quienes van dando las ideas de qué contenidos deben de irse proponiendo en cada proyecto. Otra forma de responder a sus necesidades es la participación que tienen en el proceso de evaluación, ya que desde el inicio de los proyectos se socializa la rubrica de evaluación para que ellos determinen que criterios evaluar y sean ellos quienes contribuyan a una adecuada evaluación formativa. + Todo lo anterior promueve la reflexión conjunta entre profesorado, estudiantes y padres de familia, estos últimos participan activamente en los procesos de fuentes humanas de información dependiendo de los temas trabajados.", deberías extraer y estructurar la información así: - 1. El currículo responde a las aspiraciones de los estudiantes al incluir una media técnica en software. - 2. El currículo falla en responder al contexto regional (agrícola) al no tener proyectos en ese frente. + 1. La planeación de actividades se basa en experiencias anteriores y en proyectos educativos centrados en las necesidades del entorno. + 2. Los proyectos buscan desarrollar el pensamiento crítico y analítico de los estudiantes. + 3. Los estudiantes participan en la propuesta de contenidos para cada proyecto. + 4. Los estudiantes participan en el proceso de evaluación, ayudando a determinar los criterios mediante rúbricas socializadas. + 5. Se promueve la reflexión conjunta entre profesorado, estudiantes y padres de familia. + 6. Los padres de familia participan activamente como fuentes humanas de información en los proyectos. Pautas para estructurar los ítems: - * Cada ítem debe ser una afirmación clara que resuma una razón, un ejemplo, una fortaleza o una debilidad mencionada en la explicación. - * Céntrate en el "por qué" (la explicación y los ejemplos). - * Separa las ideas distintas (p.ej., una fortaleza y una debilidad) en ítems diferentes. + * Cada ítem debe ser una afirmación clara que resuma una razón, un ejemplo, una fortaleza o un proceso mencionado en la explicación. + * Céntrate en el "por qué" (la explicación, los procesos y los ejemplos). + * Separa las ideas distintas (p.ej., la planeación, la participación estudiantil, la evaluación) en ítems diferentes. Escribe tu lista estructurada de acciones dentro de las etiquetas , numerando cada acción en una línea separada. # ESTRUCTURA DE SALIDA {{ - "percepcioones": [ + "opiniones": [ {{ - "accion": "string", // texto del punto clave, razón o ejemplo extraído de la explicación. + "opinion": "string", // texto del punto clave, razón o ejemplo extraído de la explicación. + }} + ] + }} + + # RESTRICCIONES + - Entregar únicamente el JSON con las opiniones + - No incluir texto explicativo adicional + + pregunta_13: + prompt: | + Ayudarás a estructurar y extraer las expectativas (metas o resultados deseados) de respuestas abiertas de encuestas. + Se te proporcionará una pregunta y una respuesta correspondiente, y tu tarea será identificar + las expectativas específicas mencionadas en la respuesta. + + Aquí está el enunciado (pregunta): + + ¿Qué expectativas tiene su institución sobre el fortalecimiento de la educación media? + + + Aquí está la respuesta a analizar: + + {respuesta} + + + Tu tarea es: + + 1. Leer cuidadosamente la respuesta e identificar todas las **expectativas, metas o resultados deseados** que la institución tiene sobre el fortalecimiento. + 2. Extraer cada expectativa como un elemento separado. + 3. Reescribir cada expectativa para que sea clara, completa y estructurada como una meta. + 4. Asegurarte de que cada ítem responda directamente a la pregunta. + + Por ejemplo, si la pregunta fuera: + "¿Qué expectativas tiene su institución sobre el fortalecimiento de la educación media?" + y la respuesta fuera: + "Desde que nos propusieron participar en esta estrategia nuestras expectativas subieron a altas ya que vemos que es factible desarrollar varias ideas que por asuntos de logística interna no habíamos podido desarrollar. + Nuestro mayor interés y respondiendo nuestra misión y visión institucional es trabajar en actividades pedagógicas que permitan que nuestros estudiantes tengan un tránsito exitoso hacia la educación superior y un apoyo para aquellos que desean dedicarse a aspectos laborales. Teniendo en cuenta las situaciones violentas que se han vivido en el territorio y donde muchos de nuestros estudiantes están vinculados de manera directa (víctimas), y que además han manifestado su deseo de migrar a otras zonas, es importante que como institución recibamos información y formación de oportunidades que existen para los jóvenes a nivel regional", + deberías extraer y estructurar la información así: + + 1. Desarrollar ideas pedagógicas que no se habían podido implementar por asuntos de logística interna. + 2. Trabajar en actividades pedagógicas que permitan el tránsito exitoso de los estudiantes a la educación superior. + 3. Brindar apoyo a los estudiantes que desean dedicarse a aspectos laborales. + 4. Recibir información y formación sobre oportunidades regionales para jóvenes (en respuesta al contexto de violencia y migración). + + Pautas para estructurar las expectativas: + + * Cada expectativa debe ser una afirmación clara que describa una meta o resultado deseado. + * Escribe cada expectativa comenzando con un verbo en infinitivo (p.g., "Desarrollar", "Trabajar", "Brindar", "Recibir"). + * Céntrate en la meta. Si la respuesta menciona un problema o contexto (ej. "situaciones violentas", "asuntos de logística"), extrae la expectativa de solución (ej. "Recibir información...", "Desarrollar ideas..."). + * Ignora el preámbulo o comentarios sobre la expectativa en sí (p.ej., "nuestras expectativas subieron a altas"). + + Escribe tu lista estructurada de acciones dentro de las etiquetas , numerando cada acción en una línea separada. + + + # ESTRUCTURA DE SALIDA + {{ + "expectativas": [ + {{ + "expectativa": "string", // texto de la expectativa extraída (en infinitivo). }} ] }} @@ -696,3 +760,115 @@ prompts: # RESTRICCIONES - Entregar únicamente el JSON con las acciones - No incluir texto explicativo adicional + + pregunta_14: + prompt: | + Ayudarás a estructurar y extraer los puntos clave, razones o ejemplos de una respuesta abierta de explicación. + Se te proporcionará una instrucción (la pregunta a la que responde el texto) y una respuesta + correspondiente (la explicación), y tu tarea será identificar los puntos clave de esa explicación. + + Aquí está la instrucción (pregunta) a la que responde el texto: + + Explique brevemente su respuesta anterior [sobre la coherencia de la formación y apoyo + de la Secretaría de Educación], indicando ejemplos o situaciones específicas. + + + Aquí está la respuesta (la explicación) a analizar: + + {respuesta} + + + Tu tarea es: + + 1. Leer cuidadosamente la explicación e identificar las **razones, justificaciones, ejemplos o situaciones** clave que la persona da. + 2. Extraer cada razón, fortaleza, debilidad o ejemplo clave como un elemento separado. + 3. Reescribir cada ítem para que sea claro, conciso y capture la esencia del punto de la explicación. + 4. Asegurarte de que cada ítem responda directamente a la instrucción ("Explique..."). + + Por ejemplo, si la instrucción fuera: + "Explique brevemente su respuesta anterior [sobre la coherencia de la formación y apoyo de la Secretaría de Educación], indicando ejemplos o situaciones específicas." + y la respuesta (explicación) fuera: + "Si bien algunos maestros han logrado vincularse a algunos de los procesos formativos que ha ofrecido secretaría, estos siguen siendo focalizados en los docentes que están en el casco urbano, quedando relegados los maestros de zonas rurales ya que es complejo dejar a los estudiantes sin clase y conseguir reemplazo los días de capacitación es prácticamente imposible. Otro aspecto que se ha convertido en debilidad está relacionado con las solicitudes que ha realizado el rector con respecto a formación y capacitación en emprendimiento, donde se nos comparte material pero este no es pertinente a las necesidades de nuestro contexto. Se ha insistido que nos colaboren con un profesional que asista a la IE para que nos forme pero a la fecha no ha sido posible.", + deberías extraer y estructurar la información así: + + 1. Los procesos formativos de la Secretaría se focalizan en docentes del casco urbano, relegando a los maestros rurales. + 2. La participación de docentes rurales se dificulta por la complejidad de conseguir reemplazos para los días de capacitación. + 3. El material de formación en emprendimiento proporcionado por la Secretaría no es pertinente a las necesidades del contexto de la institución. + 4. Las solicitudes de un formador profesional presencial (in-situ) no han sido atendidas por la Secretaría. + + Pautas para estructurar los ítems: + + * Cada ítem debe ser una afirmación clara que resuma una razón, un ejemplo, una fortaleza o una debilidad mencionada en la explicación. + * Céntrate en el "por qué" (la explicación, las situaciones y los ejemplos). + * Separa las ideas distintas (p.ej., la focalización urbana, la pertinencia del material) en ítems diferentes. + + Escribe tu lista estructurada de acciones dentro de las etiquetas , numerando cada acción en una línea separada. + + + # ESTRUCTURA DE SALIDA + {{ + "opiniones": [ + {{ + "opinion": "string", // texto del punto clave, razón o ejemplo extraído de la explicación. + }} + ] + }} + + # RESTRICCIONES + - Entregar únicamente el JSON con las opiniones + - No incluir texto explicativo adicional + + pregunta_15: + prompt: | + Ayudarás a estructurar y extraer los puntos clave, razones o ejemplos de una respuesta abierta de explicación. + Se te proporcionará una instrucción (la pregunta a la que responde el texto) y una respuesta + correspondiente (la explicación), y tu tarea será identificar los puntos clave de esa explicación. + + Aquí está la instrucción (pregunta) a la que responde el texto: + + Explique brevemente cómo se ha dado éste acompañamiento [orientación en alianzas + estratégicas] o qué aspectos deberían fortalecerse. + + + Aquí está la respuesta (la explicación) a analizar: + + {respuesta} + + + Tu tarea es: + + 1. Leer cuidadosamente la explicación e identificar las **razones, justificaciones, ejemplos o situaciones** clave que la persona da (ya sea sobre cómo se dio el acompañamiento o qué falta por fortalecer). + 2. Extraer cada razón, fortaleza, debilidad o ejemplo clave como un elemento separado. + 3. Reescribir cada ítem para que sea claro, conciso y capture la esencia del punto de la explicación. + 4. Asegurarte de que cada ítem responda directamente a la instrucción ("Explique..."). + + Por ejemplo, si la instrucción fuera: + "Explique brevemente cómo se ha dado éste acompañamiento [orientación en alianzas estratégicas] o qué aspectos deberían fortalecerse." + y la respuesta (explicación) fuera: + "A la fecha no conocemos si se ha realizado o no, ya que no hemos tenido conocimiento si el rector las conoce o está gestionando. Desde el núcleo de ciencias naturales en el año 2022 se realizó una alianza con cornare y la UMATA, dicha invitación a participar se hizo por la página de la secretaria departamental, donde a partir de un infograma explicaba paso a paso como participar y además contaba con linea telefónica.", + deberías extraer y estructurar la información así: + + 1. (Aspecto a fortalecer) Desconocimiento a la fecha sobre si se ha realizado la orientación o si el rector la gestiona. + 2. (Ejemplo de acompañamiento) La Secretaría Departamental publicó una invitación en su página web (con infograma y línea telefónica) para una alianza (con Cornare y UMATA en 2022). + + Pautas para estructurar los ítems: + + * Cada ítem debe ser una afirmación clara que resuma una razón, un ejemplo, una fortaleza o una debilidad (aspecto a fortalecer) mencionada en la explicación. + * Céntrate en el "por qué" o el "cómo" (la explicación, las situaciones y los ejemplos). + * Separa las ideas distintas (p.ej., el desconocimiento general y el ejemplo específico) en ítems diferentes. + + Escribe tu lista estructurada de acciones dentro de las etiquetas , numerando cada acción en una línea separada. + + + # ESTRUCTURA DE SALIDA + {{ + "opiniones": [ + {{ + "opinion": "string", // texto del punto clave, razón o ejemplo extraído de la explicación. + }} + ] + }} + + # RESTRICCIONES + - Entregar únicamente el JSON con las opiniones + - No incluir texto explicativo adicional diff --git a/extraccion/schemas_entidades.py b/extraccion/schemas_entidades.py index 061395e..5ce67fa 100644 --- a/extraccion/schemas_entidades.py +++ b/extraccion/schemas_entidades.py @@ -99,3 +99,31 @@ class Mecanismos(BaseModel): ..., description="Lista de mecanismos extraidas de la respuesta.", ) + + +class Opinion(BaseModel): + opinion: str = Field( + ..., + description="Texto de la opinión extraida de la respuesta.", + ) + + +class Opiniones(BaseModel): + opiniones: list[Opinion] = Field( + ..., + description="Lista de opiniones extraidas de la respuesta.", + ) + + +class Expectativa(BaseModel): + expectativa: str = Field( + ..., + description="Texto de la expectativa extraida de la respuesta.", + ) + + +class Expectativas(BaseModel): + expectativas: list[Expectativa] = Field( + ..., + description="Lista de expectativas extraidas de la respuesta.", + )