学校で最も意味がなく、きつくて退屈な業務を一つ挙げろと言われたら、自分は生活記録簿(生徒指導要録)チェックを選ぶだろう。
中学校では生活記録簿がそれほど重要ではないが、高等学校では入試と関係しているため非常に重要である。
問題は、このような生活記録簿の点検で探すものが、せいぜい単純な誤字脱字、記載禁止用語、表記・文法ミスなどだという点だ。
この記事は、次のような問いから始まる。
そろそろ単純なチェック業務はAIに任せてもいいのではないだろうか?
1. AIを利用した生活記録簿作成の限界点

高等学校の教員であれば皆知っているように、手書きで作成した生活記録簿とAIに任せて作成した生活記録簿とでは、文体からして違う。
特に最近は、入試の流れに合わせて、具体的な観察内容と教員の評価がつながるように記述するのが主流になっているため、AIに任せると次のような文体が出てくる。
問題解決の過程で条件を確認し式を立てる過程を忠実に行い、計算結果を点検する姿勢が観察される。
式の変形やグラフの解釈過程で根拠を挙げて説明しようとする姿勢が観察され、結果に至るまでの思考の流れを比較的明確に示す。推論中心の問題解決能力を示す。
計算ミスと概念適用の違いを区別しようとする努力が見られ、反復学習を通して類似問題解決時の正確度が向上する。
テキスト中の表現に注目して意味を推論し、自身の経験と結びつけて思考を広げる。
AIが書いた文章の特徴は、生徒が具体的に何を学び、何を得たのかが分かりにくい書き方になっているということだ。
例えば、思考の流れ、推論中心の問題解決能力、思考を広げるといった記述は、教員が何を言いたいのかを簡単には把握しづらい。
また、〜しようとする姿勢が観察されといった文体も非常に不自然だ。
こうした部分が、教員が生活記録簿を手書きせざるを得なくしている原因となる。
そのため教員は主に誤字脱字、二重スペース、使用禁止用語などを中心に探すことになる。
2. chatGPT や NotebookLM では無理なのか?

当然、ウェブで提供されている一般的なLLMを使っても生活記録簿の点検は可能だ。
問題は、入力できる内容の長さに制限があり、会話が進むほど最初に与えたプロンプトを忘れてしまうという点である。
そのため、途中で最初に入力したプロンプトを再度入力しなければならない問題が生じる。
では、毎回の対話を最初から行うつもりでプロンプトを入れてチェックすればよいのではないか?
3. データクリーニング

このように生活記録簿の分析を自動化したいのだが、最大の障害となるのは業務ポータルである。
上の図は、NEIS から生活記録簿をダウンロードしたときのデータの形をダミーで再現したものである。
下にサンプルファイルのリンクを載せておく。
データの形が本当に最悪中の最悪である。
ここから、各行に教科、学期、番号などのラベルをすべて付け直し、8行目・12列のように途中で切れている部分をつなぎ合わせる。
そしてページ情報や繰り返される目次は削除する。
コードについての説明はコメントで付けておいた。
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)このように一度整形処理を行うと、データが下のようにすっきりする。
あとは、これを使ってAIに点検依頼を送ればよい。

4. プロンプト(prompt)の抽出

すべての点検の基準はプロンプトなので、設計全体の中で最も気を配るべき部分である。
インターネット上にPDF形式で公開されている生活記録簿記載要領をダウンロードしてプロンプトを作成するのが最も確実だ。
上記サイトからファイルをダウンロードし、AIに自分が点検してほしい部分をプロンプトとして作ってもらう。
そのプロンプトを使ってAPIリクエストを投げてみる。
プロンプトの一部を載せておく。
prompt = """
너는 학생부 세부능력 및 특기사항 검수 전문가다.
입력 JSON 데이터 중 “세부능력 및 특기사항(세특)” 항목만 점검하시오.
[기재 유의어 → 대체 표현 치환 규칙]
다음에 해당하는 경우, 표준 대체 표현으로 반드시 수정한다.
- Google(구글), NAVER(네이버), Daum(다음) 등 → 포털사이트
- Google Classroom(구글 클래스룸), EBS 온라인클래스 등 → 학습 플랫폼 / 원격 학습플랫폼
...중략...
[예외적 허용 항목 — 아래는 수정하지 않음]
- 단순 지명, 국가명, 산업명(학교 특정·진학 연계가 불가능한 경우)
- 교육부/교육청 등 공교육기관 명시
- 교내 수행평가·지필평가의 “정량 미제시” 성취 표현
- 수업 중 개념/원리 학습(예: Z점수 개념 이해, 반도체 공정 원리)
- 일상생활 경험(아르바이트 등)이 학습 연결 맥락일 때
- 일반 공간(아파트 등) 언급
- 미래형 포부/계획(‘가고 싶다’, ‘탐색 중’, ‘꿈꾸고 있다’)
- 독서 제목 및 저자 / 인용문 (‘ ’ 사용 가능)
- 단순 정보 제공이나 개념 학습의 수치(예: 최저임금 1만원, GDP 성장률 2%)는 금지 항목이 아님.
[판정 기준]
- “과거형 실적”이면 수정
- “미래 포부/계획/탐색”이면 유지
- 반드시 앞, 뒤 문맥 기반으로 판단할 것
"""5. コード
OpenAI の公式サイトに行けば、簡単なサンプルを確認できる。
下記のコードをベースにするか、AIを使ってバイブコーディングのようにAPIリクエストを作成すればよい。
AIからの回答を自然文ではなくテーブル形式で受け取るのが、最もすっきりしていると思われた。
生活記録簿を点検したあと、同僚教員にその内容を伝えるときのメッセージ形式は、たいてい次のような形になる。
科目 | 学籍番号 | 氏名 | 修正前 | 修正後 | 修正理由 |
|---|---|---|---|---|---|
地球科学1 | 10100 | サゴン・ヒムセン | 〜을 함으로써 | 〜을 함으로서 | 助詞修正 |
生命科学2 | 10300 | ナムグン・カンガルー | 학생 으로 수업 중 | 학생으로 수업 중 | スペース修正 |
このような形式で回答を強制すればよい。
問題は、全教科を一度に点検してしまうとトークン数が長くなり過ぎることだ。
これを防ぐために、教科別に内容を分割し、回答をPandasで整理して一括保存すればよい。
# 먼저 파일을 과목별로 묶어 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"]このように一度リクエストを投げ、応答を整理すると、下のような内容を見ることができる。

6. プロンプトの反復修正
これで基本的な骨組みはできたので、プロンプトを継続的に修正していけばよい。
自分はより詳細な出力のために、出力ルール・判定ルールを補完し、記載上の注意語をすべて入力した。
7. 使ってみた感想

何よりも、精度が群を抜いている。
このように点検を行うことで、誤字脱字やスペースの問題はほとんど解決された。
ある教科では、海外ボランティア経験に関する内容が記載されているのを発見し、修正したこともある。
生活記録簿の指針は毎回変わるため、そのすべてを教員が記憶しておくこと自体、簡単なことではない。
そもそも、このような生活記録簿記載業務が教育の質と一体どんな関係があるのかも、あまりよく理解できない。
こうして教員の雑務を少しずつ減らしていき、もう少し教育そのものに力を注げる日が来ることを心から願っている。






댓글을 불러오는 중...