塾の講師がテストや教材を作るときに、過去の問題から単元・難度・出題形式の近い類題を探し、同じクラスへの重複出題を配る前に知らせる
講師がテストや宿題プリントを作るときに、塾で作りためた問題から単元・難度・出題形式の近い類題を探して候補を並べます。あわせて、そのクラスにすでに出した問題と、数値だけを変えた近すぎる問題に、配る前に印を付けます。
- 生成AI
- ChatGPT/Claude
- AIサービス
- Azure AI/Google Vertex AI/OpenSearch
- 対象業界
- 教育
- 対象部門
- 研究開発
- 対象業務
- 内容確認・チェック/情報検索
- 主な課題
- 属人化している/情報が見つからない/確認ミスが多い
- AIで行う処理
- 検索(RAG)
- 主な効果
- 品質標準化/工数削減/検索時間短縮
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- RAG・個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 授業の進み具合を見て、作るテストの範囲(単元)と問題数、難度の配分を決める
- 問題の一覧の表計算を開き、教科・学年・単元で絞り込む
- 絞り込んだ問題のファイルを1問ずつ開いて読み、難度と出題形式が合うものを選ぶ
- クラスの出題の記録を開き、選んだ問題をそのクラスに出していないかを確かめる
- 出していた場合は、別の問題を探し直すか、数値を変えて作り直す
- テストに並べて難度の配分を見直し、解答を作る
- 出題の記録に、使った問題の番号を書く
- 人講師が画面で、クラス・教科・単元・難度・出題形式・問題数を選ぶ。入れたい問題の例を1問書いてもよい
- 自動単元・難度・出題形式で絞り込んだうえで、内容の近い問題を検索基盤から探す
- 自動候補ごとに、そのクラスの出題の記録と照合し、同じ問題を出していれば印を付ける
- 自動そのクラスに出した問題と内容が近すぎる候補を探し、「数値替えの疑い」の印を付ける
- 自動候補と照合の結果を生成AIに渡し、候補ごとの違い(数値・設定・問い方)と印の理由を短く書かせる
- 人講師が候補を読み、印の付いた問題を外して、テストに入れる問題を選ぶ
- 人選んだ問題を並べ、難度の配分と解答を確かめる
- 自動配ったテストの問題の番号を、出題の記録に書き込む
各工程の詳しい説明を読む
- 授業の進み具合を見て、作るテストの範囲(単元)と問題数、難度の配分を決める
- 問題の一覧の表計算を開き、教科・学年・単元で絞り込む
- 絞り込んだ問題のファイルを1問ずつ開いて読み、難度と出題形式が合うものを選ぶ
- クラスの出題の記録を開き、選んだ問題をそのクラスに出していないかを確かめる
- 出していた場合は、別の問題を探し直すか、数値を変えて作り直す
- テストに並べて難度の配分を見直し、解答を作る
- 出題の記録に、使った問題の番号を書く
(a)一覧の単元だけでは絞り切れない。 「一次関数」で絞ると数百問が残ります。難度の列はありますが、作った講師ごとに付け方が違い、同じ「難度3」でも重さがそろっていません。 結局、1問ずつ開いて読むことになります。
(b)出したかどうかが番号でしか分からない。 出題の記録には問題の番号が書かれていますが、同じ問題の数値を変えた版は、別の番号になっています。 番号で照合すると「出していない」となり、生徒は先月とほぼ同じ問題を解くことになります。生徒からは「この問題、前にやった」と言われます。
(c)記録が抜けていると確かめようがない。 番号を書いていない行、教室を移った前の担当が書かなかった行は、照合の手がかりがありません。 そのときは、確かめずに出すか、念のため自分で新しく作ります。新しく作る問題は、たいてい塾のどこかにすでにあります。
(d)探しやすい問題ばかりが使われる。 探すのに時間がかかるので、講師は自分が作った問題か、よく使われる問題を選びます。 3万問のうち、実際に使われているのは一部に偏り、良い問題が一覧の中に埋もれたままになります。
- 【人】 講師が画面で、クラス・教科・単元・難度・出題形式・問題数を選ぶ。入れたい問題の例を1問書いてもよい
- 【自動】 単元・難度・出題形式で絞り込んだうえで、内容の近い問題を検索基盤から探す
- 【自動】 候補ごとに、そのクラスの出題の記録と照合し、同じ問題を出していれば印を付ける
- 【自動】 そのクラスに出した問題と内容が近すぎる候補を探し、「数値替えの疑い」の印を付ける
- 【自動】 候補と照合の結果を生成AIに渡し、候補ごとの違い(数値・設定・問い方)と印の理由を短く書かせる
- 【人】 講師が候補を読み、印の付いた問題を外して、テストに入れる問題を選ぶ
- 【人】 選んだ問題を並べ、難度の配分と解答を確かめる
- 【自動】 配ったテストの問題の番号を、出題の記録に書き込む
6番目が、この設計の分かれ目です。 画面に出るのは候補と印で、テストに入れる問題を決めるのは講師です。 印の付いた問題も、復習のためにあえて同じ問題を出すことがあるので、外すかどうかは講師が決めます。
8番目を自動にしているのも、意図してのことです。 第3章の(c)のように、重複を見つけられないいちばんの理由は、記録が抜けていることでした。この画面から作ったテストは、配った時点で記録が残るようにし、記録を書く手間そのものを無くします。
02今回想定するシステム構成
講師の画面(クラス・教科・単元・難度・出題形式・問題数・例の問題) ▼【トリガー】講師が「候補を探す」を押す AWS Lambda ── 例の問題の文章を埋め込みに変える ▼ Amazon OpenSearch Service(問題の索引) ├─ k-NN:内容の近さで探す(単元・難度・出題形式は filter) └─ 出題の記録の索引:そのクラスに出した問題の番号 ▼ AWS Lambda ── 候補ごとに出題の記録と照合する │ そのクラスに出した問題との近さを radial search で確かめる ▼ Claude API(構造化出力)── 候補ごとの違いと印の理由を短く書く ▼ 講師の画面(候補の一覧と印 → 講師が選ぶ → 出題の記録へ)
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 検索基盤 | Amazon OpenSearch Service(k-NN の絞り込み付き検索、radial search) | Azure AI Search、Vertex AI Search(Agent Search) |
| 埋め込み | Amazon Titan Text Embeddings V2(Amazon Bedrock) | Cohere Embed(Amazon Bedrock) |
| 生成AI | Claude API(構造化出力で候補ごとの違いを書く) | OpenAI API |
| 連携 | AWS Lambda(埋め込みの作成、出題の記録との照合) | AWS Step Functions |
| 保管 | Amazon S3(問題ファイルと、検索と選択の記録) | ― |
生徒の管理の仕組みは使いません。 この構成が扱うのはクラスの単位までで、生徒の名前も成績も索引に入れません。 重複を見るのは「このクラスに出したか」で、生徒一人ひとりの解いた記録ではありません。
内容の近さは、k-NN の絞り込み付き検索で探します。 公式のドキュメントでは、k-NN の検索に絞り込みの条件を付けると、絞り込んだ後の件数などに応じて、絞り込んでから正確に探すか、近似の検索のあとで絞り込むかをエンジンが選びます。 単元・難度・出題形式を条件にすれば、別の単元の問題が近いという理由で混ざることがありません。
重複の確認は、radial search で行います。 公式のドキュメントでは、radial search は上位の何件かではなく、指定した距離の内側、または指定したスコア以上のものをすべて返す検索で、k・max_distance・min_score のどれか1つを指定します。絞り込みと組み合わせた例も示されています。「そのクラスに出した問題のうち、近さが基準以上のものを全部」という問いに、そのまま当てはまります。
03どうやって実装するのか
処理の起点を決める
講師が画面で「候補を探す」を押したことを起点にします。 テストを作るのは授業の準備の時間で、講師ごとにばらばらです。決まった時刻にまとめて動かす必要はありません。 押したときに、そのクラスの出題の記録をその場で引いて照合します。
索引の更新は別に動かします。 新しく作った問題がフォルダに保存されたとき、一覧の難度や単元が直されたとき、その問題だけを埋め込みに変えて索引に入れ直します。 出題の記録は、テストを配ったときに書き込み、次に誰かが同じクラスのテストを作るときには反映されているようにします。
テストを配った時点を「出題した」とします。 作りかけのテストに入れただけでは記録しません。作ったが配らなかったテストの問題まで記録すると、出していない問題に重複の印が付きます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 講師の指定 | クラス、教科、学年、単元、難度、出題形式、問題数、例の問題(任意) | 講師の画面 |
| 問題 | 問題の番号、問題文、解き方の要点、教科・学年・単元・難度・出題形式、元にした問題の番号 | 問題の一覧と問題ファイル |
| 出題の記録 | クラス、日付、テストの種類、使った問題の番号 | 出題の記録 |
| 単元の表 | 教科ごとの単元の名前と、その別名 | 教務部で用意する表 |
| 難度の基準 | 難度1〜5の目安と、代表の問題 | 教務部で用意する表 |
質を決めるのは、元にした問題の番号です。 数値を変えて作り直した問題に、元の問題の番号を書いておけば、番号のつながりだけで「同じ問題の別の版」と分かります。 内容の近さで探すのは、この番号が無い問題を拾うためで、番号で分かるものを、近さの推定で済ませないようにします。
難度の基準は、探す前にそろえる必要があります。 第3章の(a)のとおり、作った講師ごとに難度の付け方が違います。代表の問題を難度ごとに数問ずつ決め、それに照らして付け直します。 ここをそろえないまま絞り込むと、難度3で絞った候補に、実質は難度4の問題が混ざります。
データの取得方法を決める
問題1問を、索引の1件にします。 問題文と解き方の要点をつなげた文章を埋め込みに変え、単元・難度・出題形式・作った年度・元にした問題の番号を項目として持たせます。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 内容の近い問題 | k-NN(問題文と解き方の埋め込み)+ filter(単元・難度・出題形式) | 類題の候補 |
| そのクラスに出した問題の番号 | 出題の記録の索引をクラスで引く | 同じ問題の照合 |
| 元にした問題の番号のつながり | 問題の索引の項目 | 同じ問題の別の版の照合 |
| そのクラスに出した問題に近すぎる候補 | radial search(min_score)+ filter(出した問題の番号) | 数値替えの疑い |
埋め込みは Amazon Titan Text Embeddings V2 で作ります。 公式のドキュメントでは、入力は最大8,192トークンまたは50,000文字、出力の次元は1,024(既定)・512・256から選べます。ただし、英語に最適化されたモデルで、日本語を含む100以上の言語はプレビューの扱いです。 日本語の問題でどこまで近さが取れるかは、第8章の試しで必ず確かめます。
類題の検索は、おおよそ次の形になります。
{
"size": 10,
"query": {
"knn": {
"question_vector": {
"vector": [0.012, -0.034, "…"],
"k": 10,
"filter": {
"bool": {
"must": [
{ "term": { "unit_id": "MATH-J2-LINEAR-FUNC" } },
{ "terms": { "difficulty": [2, 3] } },
{ "term": { "format": "word_problem" } }
]
}
}
}
}
}
}
難度は幅で指定します。 講師が難度3を選んでも、2と3の候補を出します。付け直した難度にもぶれが残るためで、最後の判断は講師が問題を読んで行います。
重複の確認は、候補が出たあとに別の検索で行います。 そのクラスに出した問題の番号を絞り込みの条件にし、候補の埋め込みとの近さが基準以上のものを radial search で全部返します。 返ってきたものがあれば、その候補に「数値替えの疑い」の印を付けます。基準の値は、第8章の試しで、元にした問題の番号でつながっている組の近さを測って決めます。
AIへ渡す前に整形する
- 数式を文章にそろえる … 問題ファイルの数式は、書き方を一つにそろえて文章に起こします。分数や累乗の書き方が講師ごとに違うと、同じ問題が遠く見えます
- 図の問題に説明を付ける … 図形やグラフの問題は、図の中身を1〜2文の説明にして問題文に足します。埋め込みは文章だけを見るので、図だけで条件を示す問題は近さが取れません
- 単元の名前をそろえる … 単元の表の別名で、一覧の単元の書き方を正規の名前に置き換えます
- 難度を付け直す … 難度の基準に照らして、代表的な単元から付け直します
- 元にした問題の番号を補う … 数値を変えて作った問題で、元の番号が書かれていないものは、作った講師に確かめて補います
- 出題の記録の書き方をそろえる … 「教科書p.48の類題」のような行は、分かる範囲で問題の番号に置き換え、分からないものは「番号なし」の印を付けます
- 他社の著作物を分ける … 市販の教材や入試問題から写した問題には印を付け、本文を索引に入れるかを別に決めます
2番目を軽く見ないでください。 算数・数学と理科は、図で条件を示す問題が多くあります。説明の無い図の問題は、内容の近さの検索では、問題文の短い別の問題と区別がつきません。
7番目は、第13章で詳しく書きます。 塾が自作した問題と、他社の著作物から写した問題は、扱いを分けます。
AIに処理させる
探すのは検索基盤で、照合は Lambda の規則で行います。生成AIには、候補を講師が選びやすい形に書かせるだけです。
| させること | 中身 |
|---|---|
| 候補ごとの違い | 例の問題と比べた、数値・設定・問い方・必要な手順の数の違い |
| 印の理由 | 出した問題と同じ、または近すぎると判断された理由(どの問題と近いか) |
| 難度のずれの注意 | 付けられた難度と、問題文から見た手順の多さが食い違うときの注意 |
| 候補の並べ方の提案 | 易しいものから並べたときの順番(決めるのは講師) |
| させないこと | 理由 |
|---|---|
| 重複かどうかの判定 | 照合は番号のつながりと近さの基準で規則として行う |
| 印を外すこと | 印は規則で付く。外すかは講師が決める |
| 問題の作成・書き換え | 候補を探す構成で、問題は講師が作る |
| 難度の付け直し | 難度は基準に照らして教務部が付ける |
| 正解の作成 | 解答は問題ファイルにあるものを使う |
1行目の線引きがいちばん大事です。 生成AIに「この候補は出した問題と同じか」を判断させると、数値が違うから別の問題、と答えることがあります。 それはまさに見つけたかった数値替えです。同じかどうかは番号と近さの基準で決め、生成AIには、決まった印の理由を読みやすく書かせるだけにします。
3行目は、難度の付け間違いを見つけるためです。 難度2なのに手順が4つある問題は、付け直しの候補として教務部へ回します。難度を直すのは生成AIではなく教務部です。
指示内容を固定する
あなたは学習塾の教務部で、講師がテストに入れる問題を選ぶのを助ける立場です。
渡した候補と照合の結果だけを根拠にしてください。
【講師の指定】クラス {class_id}、教科 {subject}、単元 {unit}、
難度 {difficulty}、出題形式 {format}、問題数 {count}
【例の問題】{example}(無いときは空)
【候補】問題の番号、問題文、解き方の要点、難度、出題形式、
元にした問題の番号
【照合の結果】候補ごとに
flag: none(印なし)/same_question(このクラスに出した問題と同じ)
/variant_of_given(出した問題の別の版)
/too_close(出した問題と近すぎる)
matched_with: 近いと判断された、出した問題の番号と出した日
【やること】
1. 候補ごとに、例の問題と比べた違いを1〜2文で書く
(例の問題が無いときは、候補どうしの違いを書く)
2. flag が none でない候補は、matched_with の問題とどこが同じで
どこが違うかを1〜2文で書く
3. 付けられた難度と、解くのに要る手順の数が食い違うと見えたら、
difficulty_note に書く
4. 易しいものから並べたときの順番を suggested_order に書く
【厳守事項】
- flag を変えないでください。数値が違っても、flag が too_close なら
too_close のまま理由を書いてください。
- 「出しても問題ない」「外すべき」とは書かないでください。
出すかどうかは講師が決めます。
- 問題文を書き換えたり、新しい問題を作ったりしないでください。
- 難度を付け直さないでください。食い違いの指摘だけにしてください。
- 候補に無い問題に触れないでください。
- 1候補あたりの説明は3文以内にしてください。
「flag を変えない」を明記しないと、親切に直してきます。 照合の結果を渡すと、生成AIは問題文を読み比べ、「数値が違うので別の問題です」と書き添えます。 それを講師が読めば、印は意味を失います。印は規則で付いたもので、生成AIは理由を書く係だと、役割を分けて伝えます。
「出しても問題ない」と書かせないのも同じ理由です。 復習のためにあえて同じ問題を出すかどうかは、クラスの様子を知っている講師にしか決められません。
出力形式を固定する
Claude API の構造化出力で、次の形のJSONを受け取ります。 公式のドキュメントでは、output_config.format に type: "json_schema" とスキーマを渡すと、スキーマに合った妥当なJSONが返ります。
{
"request": { "class_id": "K07-M2A", "unit": "一次関数", "difficulty": [2, 3] },
"candidates": [
{
"question_id": "Q-MATH-J2-04812",
"flag": "none | same_question | variant_of_given | too_close",
"matched_with": [{ "question_id": "Q-MATH-J2-03307", "given_on": "2026-09-12" }],
"difference": "",
"flag_reason": "",
"difficulty_note": ""
}
],
"suggested_order": ["Q-MATH-J2-04812"],
"notes": ""
}
1つ目の理由は、flag を画面の表示に直接使えることです。 same_question と variant_of_given は赤、too_close は黄色、と色で分けて表示できます。 講師は、印の付いた候補を一目で外せます。
2つ目は、matched_with で近いと判断された問題を開けることです。 画面から出した問題を開き、並べて読み比べてから外すかどうかを決められます。 理由の文章だけで判断させないためです。
3つ目は、difficulty_note を教務部へ回せることです。 難度の食い違いの指摘を集めると、付け直しが必要な問題の一覧になります。
なお、構造化出力は Claude API で使います。 公式のドキュメントでは、Amazon Bedrock では従来の連携で一部のモデルに限って使えるとされているため、Bedrock で動かす場合は、使うモデルで構造化出力が使えるかを先に確かめます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 講師の画面 | 社内の画面 | 指定を受け取り、候補と印を表示し、選んだ問題を受け取る |
| Amazon Bedrock | API呼び出し | 例の問題と候補の文章を埋め込みに変える |
| Amazon OpenSearch Service | 検索の API | 類題の検索と、出した問題との近さの確認 |
| 出題の記録 | 読み取りと書き込み | クラスに出した問題を引き、配ったテストの番号を書く |
| Claude API | API呼び出し | 候補ごとの違いと印の理由を書く |
書き込むのは出題の記録だけです。 問題の一覧と問題ファイルは読むだけで、難度の付け直しも、元にした問題の番号の補いも、教務部が一覧の側で行います。 画面から一覧を書き換えられる作りにすると、講師ごとの難度の付け方がまた戻ってきます。
出題の記録への書き込みは、配った時点の1回だけです。 下書きのテストを何度作り直しても記録は増えず、配ったテストの問題だけが残ります。
人が確認する
講師が候補を読み、印を見て、テストに入れる問題を選びます。
- 印の付いた候補を先に見る …
same_questionとvariant_of_givenは、原則として外します。復習のために出す場合だけ、理由を一言残します too_closeを読み比べる … 出した問題を開いて並べ、生徒が「前にやった」と感じるかどうかで決めます- 印の無い候補から選ぶ … 問題文を読み、難度と出題形式がクラスに合うかを確かめます
- 並べて配分を確かめる … 易しい問題から並べ、時間内に解ける量かを見ます
- 難度の食い違いを教務部へ回す …
difficulty_noteがあったものを送ります
2番目を省かないでください。 近さの基準は、試しで決めた目安にすぎません。基準を少し超えただけの問題が、生徒にとってはまったく別の問題に見えることもあれば、その逆もあります。
目標は、1件12分です。 候補を読み、印を確かめ、問題を選んで並べるまでの時間です。問題を探して開く時間と、出題の記録を見て照合する時間が、ほぼ無くなります。
例外に対処する
| 起きること | 対応 |
|---|---|
| 指定した単元・難度の候補が少ない | 難度の幅を1つ広げて探し直し、「難度を広げた」と表示する |
| 候補が0件 | 「該当する問題なし」と表示し、新しく作る問題の一覧として教務部に知らせる |
| 図だけで条件を示す問題で、説明が付いていない | 候補には出すが「図の説明なし。近さは参考」と表示する |
| 出題の記録に番号の無い行がある | 照合できなかった行の数を表示し、重複の確認が完全でないことを講師に知らせる |
| 候補のすべてに印が付いた | 印の付いた候補も表示したまま、「新しい問題が要る」と表示する |
| 他社の著作物の印がある問題 | 本文を索引に入れていないので、候補には番号と出典だけを出す |
| 埋め込みの作成が失敗する | 単元・難度・出題形式の絞り込みだけで一覧を出し、「内容の近さは未反映」と表示する |
| 検索基盤が応答しない | 「候補を表示できない」と出し、これまでどおり一覧の表計算で探す手順に戻す |
4行目を必ず表示してください。 照合できなかった行があるのに印が出ないと、講師は「重複は無い」と受け取ります。 確認が届いていない範囲を見せることが、印の信頼を保つ条件です。
2行目は、新しい問題を作る順番を決める材料になります。 候補が0件だった単元と難度の組が、塾の問題の足りないところです。
記録を残す
- 講師の指定(クラス・単元・難度・出題形式・例の問題)と、検索の条件
- 返した候補の番号と、
flag・matched_with - 生成AIに渡した候補と、返ってきたJSONの全文
- 講師が選んだ問題と、印の付いた問題をあえて選んだときの理由
- 配ったテストの問題の番号と日付(出題の記録)
- 候補が0件だった単元と難度の組
4行目で理由を残すのは、近さの基準を見直すためです。 too_close が付いたのに講師が「別の問題」として選んだ組が多ければ、基準が厳しすぎます。 逆に、印が無いのに生徒から「前にやった」と言われた組は、基準が緩すぎます。
最後の行は、問題作りの計画になります。 毎月、候補が0件だった組を数え、教務部が新しく作る問題の優先順位を決めます。
04実装レベルの3段階
半自動化で、①の15分が5分ほどになります。 探す時間は減りますが、出題の記録との照合は講師が自分で行う作業として残ります。 本格構成で、照合と記録を画面の中で済ませ、1件12分にします。この段階が本記事の想定です。 段階を飛ばさないでください。 半自動化を使うと、難度の付け方のばらつきと、図の説明が無い問題の多さが見えてきます。それを直し、元にした問題の番号を補ってから照合に進むほうが、印の空振りと見落としが減ります。
05工数削減シミュレーション
導入後 240件 × 12分 ÷ 60 = 48 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 教室が複数あり、講師が自分で確認テストや宿題プリントを作っている学習塾・スクール。塾で作りためた問題が数千問以上あり、表計算の一覧とフォルダで管理していて、単元と難度で探すのに時間がかかっている場合。講師の入れ替わりで、どのクラスに何を出したかを知っているのが前の担当だけになっている場合。AWS を使っているか、使える場合。
- 市販の問題集やテキストをそのまま使い、塾の自作の問題がほとんど無い場合。教室が1つで、講師が数名しかおらず、出した問題を全員が覚えている場合。出題の記録(どのクラスにいつ何を出したか)を残していない場合(先に記録の残し方を決めるのが先です)。なお、どの問題を出すか、難度をどう組むかは講師が決めることで、この構成はそれを代わりに行いません。
07最小構成で試す方法
- 中学2年の数学など、テストの多い教科と学年を1つ選ぶ
- その単元の問題を100問ほど書き出し、問題文と解き方の要点を文章にそろえる
- 元にした問題の番号でつながっている組(数値替えの組)を、分かる範囲で10組ほど選んでおく
- 手元のAIサービスに100問を渡し、「この例の問題に内容が近い問題を5つ選び、違いを書いてください。また、数値だけを変えた同じ問題の組があれば挙げてください」と指示する
- 出てきた候補と組を、その単元をよく教える講師に見てもらう
100問は必ずやってください。 索引を作る前に、「内容の近さで類題が探せるか」「数値替えの組を拾えるか」を確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 講師が見て妥当な類題が出て、数値替えの組も拾えた | 索引と画面の仕組みに進む |
| 類題は出るが、図の問題が見当違いの候補になる | 図の説明を足すのが先。構成は有効 |
| 数値替えの組を拾えない | 近さだけに頼れない。元にした問題の番号を補う作業を先に進める |
3行目が出ることは珍しくありません。 失敗ではなく、番号のつながりを残すことの大事さが分かったということです。 近さで拾うのは、番号を補いきれなかった問題のためと割り切り、番号の補いを先に進めてください。
埋め込みの検索に進む前に、選んだ埋め込みのモデルで同じ100問の近さを測ります。 数値替えの組の近さと、別の問題どうしの近さがはっきり分かれるかを見て、radial search の基準の値をここで決めます。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 数値替えの問題が「出していない」になる | 元にした問題の番号でつなぎ、近さでも確かめる |
| 生成AIが印を外す書き方をする | 指示で禁じ、印は規則で付いたものとして理由だけを書かせる |
| 難度で絞った候補の重さがそろわない | 代表の問題で基準を決め、付け直す |
| 図の問題の近さが取れない | 図の中身を1〜2文の説明にして問題文に足す |
| 日本語の問題で近さがうまく取れない | 埋め込みのモデルの日本語の扱いを試しで確かめ、合わなければ替える |
| 別の単元の問題が候補に混ざる | 単元を k-NN の絞り込みの条件にする |
| 照合できない記録があるのに印が出ない | 照合できなかった行の数を必ず表示する |
| 作っただけで配らなかったテストまで記録される | 配った時点だけを記録する |
| 他社の教材の問題が索引に入っている | 印を付けて分け、本文を入れるかを別に決める |
上の2行が、この構成の失敗のほとんどです。 どちらも「数値が違えば別の問題」という見方から起きます。番号のつながりという事実を先に置き、近さと生成AIの説明はその後に置く順番を崩さないでください。
照合できない記録の表示も、同じくらい早く効いてきます。 印が出ないことを「重複が無い」と読まれると、記録の抜けたクラスで同じ問題が出ます。確認できた範囲を見せることが、仕組みが信頼される条件です。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 塾が自作した問題と解き方、クラスごとの出題の記録です。生徒の名前・成績・答案は扱いません。 問題は、塾が時間をかけて作った教材そのもので、他の塾に知られたくない情報です。
- 生徒の情報を索引に入れない … 重複はクラスの単位で見ます。生徒の成績や答案と結び付けると、扱う情報の重さが変わります。 結び付ける場合は、別の設計として検討してください
- 他社の著作物を分けて扱う … 著作権法第35条で授業の過程での複製が認められている教育機関からは、営利を目的として設置されているものが除かれています。 また第36条は、試験問題としての複製を認めつつ、営利を目的とする場合は通常の使用料に相当する補償金の支払いを求めています。 市販の教材や入試問題から写した問題の扱いは、権利者との契約と自社の法務で確かめてください
- 問題を外のサービスに渡す範囲を決める … 埋め込みと生成AIの呼び出しで、問題文は外のサービスに渡ります。データの扱いの条件を契約で確かめます
- 生成AIに問題を作らせない … この構成は探す仕組みです。生成AIが作った問題が問題の一覧に混ざると、作った講師も元にした問題も分からない問題が増えます
- 講師の評価に使わない … 誰の作った問題がよく使われるかは記録から分かりますが、それを評価に使うと、講師は問題を一覧に登録しなくなります
誤りが起きた場合のリスクは、同じ問題を同じクラスに出すことと、使える問題を重複と誤って外すことの2つです。 前者は番号のつながりと照合できなかった範囲の表示で、後者は講師が読み比べる手順で防ぎます。どちらも、最後に講師が読むことで守ります。
10まず何から始めるか
1週目:難度の基準を決める
教科ごとに、難度1〜5の代表の問題を数問ずつ決めます。テストの多い中学2年の数学から始めます。 あわせて、単元の表に別名を書き足します。
2週目:100問で試す
1単元の問題を100問書き出し、手元のAIサービスで類題と数値替えの組を挙げさせます。講師に見てもらい、図の問題で見当違いが出ないかを最優先で確かめます。
3週目:記録の残し方を決める
数値を変えて問題を作ったときに、元にした問題の番号を書く運用を決めます。出題の記録に、問題の番号で書く運用もこのときにそろえます。 過去の分は後回しにし、今日からの分をそろえます。
4週目:索引を作る
中学2年の数学の問題を埋め込みに変えて Amazon OpenSearch Service に入れ、講師が絞り込みと近さで探せる画面を作ります。この時点では照合をせず、半自動化として使ってもらいます。
2か月目: 出題の記録と照合して印を付け、候補ごとの違いを書かせます。3か月目以降: 他の教科と学年に広げ、候補が0件だった組と、印の付いた候補をあえて選んだ理由を毎月数えます。1件30分が何分になったかを実測した時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| k-NN の検索に絞り込みの条件を付けると、絞り込んだ後の件数などに応じて、絞り込んでからの正確な検索か、近似の検索のあとの絞り込みかをエンジンが選ぶこと。lucene・faiss のエンジンで使えること | OpenSearch Documentation: Efficient k-NN filtering | 2026-10-08 |
radial search が、指定した距離の内側または指定したスコア以上のものを返すこと。k・max_distance・min_score のどれか1つを指定すること。絞り込みと組み合わせた例があること | OpenSearch Documentation: Radial search | 2026-10-08 |
| Titan Text Embeddings V2 の入力が最大8,192トークンまたは50,000文字、出力の次元が1,024(既定)・512・256であること。英語に最適化され、100以上の言語はプレビューの扱いで、日本語がその一覧に含まれること | Amazon Bedrock: Amazon Titan Text Embeddings models | 2026-10-08 |
構造化出力で output_config.format に type: "json_schema" とスキーマを渡すと、スキーマに合ったJSONが返ること。Amazon Bedrock では従来の連携の一部のモデルで使えること | Claude Docs: Structured outputs | 2026-10-08 |
| 著作権法第35条の教育機関から営利を目的として設置されているものが除かれていること。第36条が試験問題としての複製を認め、営利を目的とする場合に通常の使用料の額に相当する補償金の支払いを求めていること | e-Gov 法令API: 著作権法 | 2026-10-08 |
他社の教材や入試問題の扱いは、権利者との契約と自社の法務で確かめてください。 本記事は公開仕様と法令の条文で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0954)についてのご相談はこちらから。
