Si tuviera que escoger la tarea más insignificante, dura y aburrida en la escuela, elegiría la revisión del boletín de vida escolar.
En secundaria el boletín de vida escolar no es tan importante, pero en bachillerato es extremadamente importante porque está relacionado con el ingreso a la universidad.
El problema es que, en este tipo de revisión del boletín, lo que se busca no es más que simples erratas, términos cuya consignación está prohibida, ortografía, etc..
Este texto parte de la siguiente pregunta.
¿No será ya momento de dejar las revisiones simples en manos de la IA?
1. Limitaciones de la generación del boletín con IA

Quienes sean docentes de bachillerato lo sabrán bien: un boletín escrito a mano y uno redactado por una IA se distinguen desde el estilo.
En particular, últimamente, siguiendo la tendencia de admisión universitaria, está de moda escribir enlazando observaciones concretas y evaluaciones del docente, de modo que, si se lo dejamos a la IA, aparecen estilos como los siguientes.
En el proceso de resolución de problemas comprobó las condiciones y estableció las expresiones correspondientes con diligencia, observándose una actitud de verificación de los resultados de cálculo.
En la transformación de expresiones o en la interpretación de gráficos se observó una actitud de explicar aportando fundamentos, y mostró de forma relativamente clara el flujo de pensamiento hasta llegar al resultado. Demostró una capacidad de resolución de problemas centrada en la inferencia.
Se apreció el esfuerzo por distinguir entre errores de cálculo y diferencias en la aplicación de conceptos, y mejoró la precisión en la resolución de problemas similares mediante el aprendizaje repetido.
Se fijó en las expresiones del texto para inferir significados y amplió su pensamiento conectándolo con sus propias experiencias.
La característica de los textos escritos por IA es que hacen difícil saber qué aprendió y qué obtuvo el estudiante de forma concreta.
Por ejemplo, descripciones como flujo del pensamiento, capacidad de resolución de problemas centrada en la inferencia, amplió su pensamiento no permiten entender con facilidad qué es exactamente lo que el docente quiere decir.
Además, giros como se observó una actitud de ~ suenan muy artificiales.
Estos aspectos son los que obligan a los docentes a rellenar el boletín de vida escolar a mano.
Por ello, el profesorado suele centrarse en buscar erratas, dobles espacios y términos de uso prohibido.
2. ¿Es imposible con chatGPT, NotebookLM, etc.?

Por supuesto, con los LLM generales disponibles en la web también es posible revisar el boletín de vida escolar.
El problema es que hay una limitación en la longitud del contenido que se puede introducir y que, a medida que avanza la conversación, el modelo va olvidando el prompt inicial.
Por eso aparece el problema de que hay que volver a introducir de vez en cuando el prompt inicial.
Entonces, ¿no bastaría con introducir el prompt en cada conversación como si fuera la primera vez y hacer la revisión así?
3. Limpieza de datos

Si queremos automatizar el análisis del boletín, el mayor obstáculo es el portal de trabajo.
La imagen superior reproduce de forma ficticia la estructura de los datos cuando se descarga el boletín de vida escolar desde NEIS.
Dejo un enlace de ejemplo a continuación.
El formato de los datos es realmente de lo peor de lo peor.
Ahora hay que poner etiquetas a cada fila (asignatura, semestre, número, etc.) y unir las partes partidas como agosto y la columna 12.
Luego eliminamos las páginas y los índices repetidos.
He añadido comentarios explicando el código.
import pandas as pd
from pathlib import Path
# 먼저 폴더 생성해 줌
cwd = Path.cwd()
resultFolter = cwd / "result"
resultFolter.mkdir(exist_ok=True)
targetFolder = cwd / "target"
# 타겟 폴더안의 .xlsx 파일을 for문으로 돈다.
for file in targetFolder.glob("*.xlsx"):
# 일단 4줄 뛰어넘고, 쓸데없는 null행과 열들은 잘라낸다.
df = pd.read_excel(file, skiprows=4)
df = df.iloc[:, :6]
stNumCol = [i for i in df.columns if "번" in i][0]
subjectNmae = [i for i in df.columns if "과" in i][0]
df.drop(df[df[subjectNmae] == subjectNmae].index, inplace=True)
df.dropna(subset=stNumCol, inplace=True)
df.reset_index(drop=True, inplace=True)
# 열을 돌면서 비어있는 행들을 모두 채워준다.
dropRowIndex = []
for i in range(len(df)):
rowSubNmae = df.iloc[i, 0]
rowGrade = df.iloc[i, 1]
rowClass = df.iloc[i, 2]
rowStNum = df.iloc[i, 3]
rowStName = df.iloc[i, 4]
rowInnerText = df.iloc[i, 5]
if i == 0 :
continue
if pd.isna(rowSubNmae):
df.iloc[i, 0] = df.iloc[i - 1, 0]
if pd.isna(rowGrade):
df.iloc[i, 1] = df.iloc[i - 1, 1]
if pd.isna(rowClass):
df.iloc[i, 2] = df.iloc[i - 1, 2]
if pd.isna(rowStNum):
df.iloc[i, 3] = df.iloc[i - 1, 3]
# 만약 글이 쪼개져 있으면 두 행의 내용을 합쳐주고 하나는 지운다.
# 굳이 dropRowIndex를 만들어 추가한 다음에 지우는 이유는
# for문이 실행되는 동안 df의 길이변화가 일어나지 않도록 하기 위함이다.
if df.iloc[i, 3] == df.iloc[i-1, 3]:
dropRowIndex.append(i)
df.iloc[i-1, 5] = df.iloc[i-1, 5] + df.iloc[i, 5]
df.drop(dropRowIndex, inplace=True)
df.reset_index(drop=True, inplace=True)
df.to_excel(cwd / "교과세특 학년별 과목별_정제.xlsx", index=False)Tras pasar por esta primera depuración, los datos quedan tan limpios como se ve abajo.
Ahora, con esto, solo hay que enviar a la IA la solicitud de revisión.

4. Extracción del prompt

Todo criterio de revisión se basa en el prompt, así que es la parte a la que hay que prestar más atención en todo el diseño.
Lo más seguro es descargar en Internet el manual de consignación del boletín de vida escolar en formato PDF y usarlo para elaborar el prompt.
Descarga el archivo desde el sitio de arriba y encarga a la IA que genere un prompt con los aspectos que deseas que revise.
Luego, con dicho prompt, haz una solicitud de API.
Dejo parte del prompt como ejemplo.
prompt = """
너는 학생부 세부능력 및 특기사항 검수 전문가다.
입력 JSON 데이터 중 “세부능력 및 특기사항(세특)” 항목만 점검하시오.
[기재 유의어 → 대체 표현 치환 규칙]
다음에 해당하는 경우, 표준 대체 표현으로 반드시 수정한다.
- Google(구글), NAVER(네이버), Daum(다음) 등 → 포털사이트
- Google Classroom(구글 클래스룸), EBS 온라인클래스 등 → 학습 플랫폼 / 원격 학습플랫폼
...중략...
[예외적 허용 항목 — 아래는 수정하지 않음]
- 단순 지명, 국가명, 산업명(학교 특정·진학 연계가 불가능한 경우)
- 교육부/교육청 등 공교육기관 명시
- 교내 수행평가·지필평가의 “정량 미제시” 성취 표현
- 수업 중 개념/원리 학습(예: Z점수 개념 이해, 반도체 공정 원리)
- 일상생활 경험(아르바이트 등)이 학습 연결 맥락일 때
- 일반 공간(아파트 등) 언급
- 미래형 포부/계획(‘가고 싶다’, ‘탐색 중’, ‘꿈꾸고 있다’)
- 독서 제목 및 저자 / 인용문 (‘ ’ 사용 가능)
- 단순 정보 제공이나 개념 학습의 수치(예: 최저임금 1만원, GDP 성장률 2%)는 금지 항목이 아님.
[판정 기준]
- “과거형 실적”이면 수정
- “미래 포부/계획/탐색”이면 유지
- 반드시 앞, 뒤 문맥 기반으로 판단할 것
"""5. Código
En la página oficial de OpenAI se pueden ver ejemplos sencillos.
Puedes basarte en el código siguiente o usar la propia IA para hacer “vibe coding” y generar la solicitud a la API.
Me pareció que lo más limpio sería recibir la respuesta de la IA no como lenguaje natural, sino en forma de tabla.
Tras revisar el boletín de vida escolar, el mensaje que se suele enviar al resto de docentes tiene normalmente el siguiente formato.
Asignatura | N.º de matrícula | Nombre | Antes de la corrección | Después de la corrección | Motivo de la corrección |
|---|---|---|---|---|---|
Ciencias de la Tierra 1 | 10100 | Sa Gong Him-sen | ~을 함으로써 | ~을 함으로서 | Corrección de partícula |
Biología 2 | 10300 | Nam Goong Canguro | 학생 으로 수업 중 | 학생으로 수업 중 | Corrección de espacio |
Hay que forzar que la respuesta siga este formato.
El problema es que, si se revisan todas las asignaturas de una vez, la longitud en tokens se vuelve excesiva.
Para evitarlo, se divide el contenido por asignaturas, se organizan las respuestas con pandas y se guardan todas juntas.
# 먼저 파일을 과목별로 묶어 jsonDtat로 만든다.
data = df[df["과 목"] == sub]
jsonData = data.to_json(orient="records", force_ascii=False)
# AI에게 응답을 강제하도록 구조를 설계한다.
response = client.responses.create(
model="gpt-5.2",
input=[{
"role": "user",
"content": [
{"type": "input_text", "text": prompt},
{"type": "input_text", "text": jsonData}
]
},
],
text={
"format":{
"type": "json_schema",
"name": "response_format",
"strict": True,
"schema": {
"type": "object",
"properties": {
"rows": {
"type": "array",
"items": {
"type": "object",
"properties": {
"subjectName": {"type": "string"},
"studentName": {"type": "string"},
"before": {"type": "string"},
"after": {"type": "string"},
"edit": {"type": "string"},
"editReason": {"type": "string"}
},
"required": ["subjectName", "studentName", "before", "after", "edit", "editReason"],
"additionalProperties": False
}
}
},
"required": ["rows"],
"additionalProperties": False
}
}
}
)
responseJson = json.loads(response.output[0].content[0].text)["rows"]Tras enviar una solicitud y organizar la respuesta, se obtiene algo como lo siguiente.

6. Revisión iterativa del prompt
Una vez que se tiene la estructura básica, basta con ir revisando y mejorando el prompt de forma iterativa.
Yo, para obtener una salida más detallada, complementé las reglas de salida y de evaluación e introduje todos los sinónimos y expresiones a tener en cuenta en la consignación.
7. Opinión tras el uso

Por encima de todo, la precisión es excepcional.
Al hacer la revisión de este modo, casi todos los problemas de erratas y espacios se resolvieron.
En cierta asignatura incluso descubrimos y corregimos una descripción sobre experiencias de voluntariado en el extranjero.
Las directrices del boletín de vida escolar cambian constantemente, y no es nada fácil que el docente recuerde todo.
Y, además, cuesta entender qué relación tiene toda esta actividad de consignación en el boletín con la calidad de la educación.
Solo espero que, reduciendo poco a poco este tipo de tareas burocráticas del docente, llegue el día en que podamos concentrarnos un poco más en la educación.






댓글을 불러오는 중...