「練習問題」はどこまで自動で作れるか — 評価データ生成のツールと論文から、普通のエンジニアにできる範囲を見極める

「練習問題」はどこまで自動で作れるか — 評価データ生成のツールと論文から、普通のエンジニアにできる範囲を見極める

前回の記事 では、GEPA などがプロンプトをどう直すかを見ました。そこで繰り返し出てきたのが、ツールが自動でやるのは「添削係」だけで、練習問題と採点は人が用意するという点です。

では、その練習問題を AI に作らせることはできないのか。本稿はこの問いに答えます。

このブログでは以前にも、評価用テストペアを生成する手法のサーベイ と コード付きの実装ガイド を書きました。今回はそれらと視点を変えて、次の 3 点に絞ります。

先に結論を書きます。

1. 練習問題は何でできているか

練習問題 1 問は、次の 4 つでできています。

要素 EC の問い合わせ対応の例 自動で作れるか
入力 「注文 A-1029 がまだ届きません。明日までに必要です」 作れる
文脈 注文データ(発送日、配送状況、返金の可否)、FAQ 作れる(ただし現実の分布に合わせるのは手間)
正解か採点基準 「注文番号を引用する」「配送状況を伝える」「返金を約束しない」 案までは作れる。人の確認が要る
付帯情報 問い合わせの種類、お客様の感情、難しさ 指定して作らせられる

プロンプトの最適化に使うなら、さらに 2 つの条件が加わります。

2. 自動化の 5 段階

練習問題の自動生成は、難しさの順に 5 段階に分けると見通しが良くなります。

段階 作るもの 自動化のしやすさ 主なツール
1 入力を増やす 簡単 promptfoo、DeepEval、NeMo Data Designer、Opik、LangSmith
2 文書から、問題と参照回答を作る 簡単〜中 Ragas、DeepEval、Giskard
3 採点基準を作る 中(人の確認が必須) promptfoo、LangSmith、EvalGen・SPADE(研究)
4 会話や、道具を使う作業を模擬する 中〜難 DeepEval、Opik、IntellAgent、tau2-bench
5 正解を機械で確かめられる課題を作る 難(コードでは実用段階) SWE-smith、gskill、TaskCraft

以下、段階ごとにツールの使い方と、論文から分かる注意点を見ていきます。

3. 段階 1:入力を増やす

一番簡単で、効果も分かりやすい段階です。

promptfoo:設定ファイルから人物像ごとに増やす

promptfoo は、プロンプトの変数({{inquiry}} など)を埋める入力を自動で作れます(この機能は文書でベータ版と明記されています)。

promptfoo generate dataset --config promptfooconfig.yaml --output tests.yaml \
  --numPersonas 5 --numTestCasesPerPersona 3 \
  --instructions "配送遅延、返品、支払いの問い合わせを含め、怒っている客も混ぜる"

まず人物像を作り、人物像ごとに入力を作ります。生成に使うモデル(--provider)は、評価されるモデルとは別に指定できます。なお promptfoo は 2026 年 3 月に OpenAI による買収が発表されましたが、README には「オープンソースで MIT ライセンスのまま」と書かれ、開発も続いています。

NeMo Data Designer:分布を設計して作る

NVIDIA の NeMo Data Designer(オープンソース、Apache-2.0)は、列ごとに作り方を指定する方式です。「問い合わせの種類」は決まった割合で抽選し、「問い合わせ文」は LLM に書かせる、といった組み合わせができます。

import data_designer.config as dd
from data_designer.interface import DataDesigner

data_designer = DataDesigner()
config_builder = dd.DataDesignerConfigBuilder()
config_builder.add_column(dd.SamplerColumnConfig(
    name="category", sampler_type=dd.SamplerType.CATEGORY,
    params=dd.CategorySamplerParams(values=["配送遅延", "返品", "支払い", "在庫"])))
config_builder.add_column(dd.SamplerColumnConfig(
    name="mood", sampler_type=dd.SamplerType.CATEGORY,
    params=dd.CategorySamplerParams(values=["落ち着いている", "急いでいる", "怒っている"])))
config_builder.add_column(dd.LLMTextColumnConfig(
    name="inquiry", model_alias="nvidia-text",
    prompt="{{ mood }} お客様が、{{ category }} について EC サイトに送る問い合わせを 1 通書いて"))
preview = data_designer.preview(config_builder=config_builder)

(README の例を、EC の問い合わせ向けに書き換えたものです。model_alias は使うモデルの設定に合わせます)

ほかに、LLM に判定させる列、Python で検証する列、既存のデータを種にする列などがあります。「本番の問い合わせの種類の割合に合わせて作る」ことができるのが強みです。

DeepEval:何もないところからも作れる

DeepEval の Synthesizer は、文書・文脈・既存の例のどれからでも、何もないところからでも(generate_goldens_from_scratch)入力を作れます。次の章で使う文書からの生成と同じ道具でそろえられるのが利点です。

画面で増やす:Opik と LangSmith

なお、Anthropic Console にあった「テストケースを生成する」機能の専用ページは、現在の文書からは消えていました。代わりに、「基準になる例を数件用意し、Claude に増やさせる」という助言が載っています。

段階 1 の注意:多様性は、指定しないと出ない

DataMorgana(2025 年 1 月)は、文書から 1 問ずつ作る従来の方法では、1 問ずつは良くても全体として現実の利用者の多様さを覆えないと指摘しています。そこで「利用者の種類」と「質問の種類」とその割合を設定で指定して生成し、既存のツールより語彙・構文・意味のすべてで多様な問題集を作れたと報告しています(DataMorgana 自体は、研究コンペの参加チーム向けの限定公開でした)。

実務では、promptfoo の人物像、Data Designer の抽選列、後述する Ragas の人物像と質問の割合の指定が、同じ役割を果たします。「何を何割」を自分で決めて指定するのが、段階 1 の一番大事な作業です。

4. 段階 2:文書から、問題と参照回答を作る

社内規程や FAQ のような文書がある業務では、問題と一緒に参照回答(模範解答)と根拠の箇所まで自動で作れます。

DeepEval

from deepeval.synthesizer import Synthesizer

synthesizer = Synthesizer()
goldens = synthesizer.generate_goldens_from_docs(
    document_paths=["就業規則.pdf", "経費精算規程.docx"])

出力は「入力・期待する出力・文脈」の組です。難しくする仕掛けとして、推論を要する問いにする、複数の箇所を組み合わせる、条件を付ける、比較させる、仮定の状況にする、といった「進化」の種類を割合で指定できます。文書によると、このうち複数箇所の組み合わせ・具体化・条件付け・比較の 4 つは、問いが元の文書から離れにくいものです。質の低い問いを別のモデルに判定させて落とす設定もあります。

Ragas

from ragas.testset import TestsetGenerator

generator = TestsetGenerator(llm=generator_llm, embedding_model=generator_embeddings)
dataset = generator.generate_with_langchain_docs(docs, testset_size=10)

文書から知識のつながり(知識グラフ)を作り、そこから問題を作ります。既定では、1 か所で答えられる具体的な問いが半分、複数の箇所をまたぐ問いが残り半分です。人物像を指定することもできます。ただし、リポジトリは別の組織に移り、最後のリリースは 2026 年 1 月で、開発のペースは落ちています。

Giskard

Giskard は 2026 年に v3 として作り直されました。以前の RAGET(generate_testset で 6 種類の質問を作る機能)は v2 側に残り、README には「v2 は使えるが、積極的には保守していない」とあります。v3 では quality_scan という名前になり、知識ベースを渡して点検する形に変わりました。古いブログ記事のコードは v2 向けのことが多いので注意が必要です。

段階 2 の注意:作った問題は易しくなる

What Has Been Lost with Synthetic Evaluation?(EMNLP 2025 Findings)は、人が丁寧に作った読解の問題集 2 つを LLM に作り直させ、比べました。生成した問題は、作成の指針に照らして妥当なものが多く、費用も元の何分の一かで済みました。しかし、LLM にとって、人が作った元の問題より易しかったのです。

STELLAR-E(2026 年 4 月)も、自動生成した問題集は既存の問題集とおおむね同等の質だったものの、本物の問題集のほうが少し難しく、特に小さいモデルで差が出たと報告しています。

対策は 2 つです。

5. 段階 3:採点基準を作る

ここから、人の関与が欠かせなくなります。

ツールでできること

論文:採点基準は、出力を見ないと決まらない

Who Validates the Validators?(UIST 2024)は、LLM が採点項目と採点用の関数やプロンプトを提案し、人が一部の出力に判定を付けて、人の判定に合うものを選ぶ道具(EvalGen)を作りました。この研究の一番の発見は、利用者の側で起きたことです。

つまり、採点基準を最初に全部決めてから問題を作る、という順序は成り立ちません。基準の案を自動で作り、出力を見て直し、また作る、を回すしかありません。

同じグループの SPADE は、別の角度から基準を作ります。開発者はプロンプトを直すたびに「〜しないこと」といった指示を足していく。その変更履歴こそが採点項目の宝庫だ、という発想で、履歴から確認用の関数の候補を作り、最小限の組を選びます。実在の 9 つの処理で、単純な方法より項目数を 14% 減らし、誤った不合格を 21% 減らしました。LangSmith に組み込まれ、2000 を超える処理で使われたと報告されています。

採点項目(ルーブリック)の自動生成は 2026 年に研究が急増しました(サーベイ)。ただし、ルーブリックの仕組みを整理した Autorubric(COLM 2026)は、ルーブリックを使っても採点役の偏り(位置の偏り、毎回のぶれ、基準の混同など)は消えないこと、どの環境でも効く対策の組み合わせは無いことを示しています。採点の偏りについては 以前の記事 でも扱いました。

6. 段階 4:会話や、道具を使う作業を模擬する

問い合わせ対応のように何往復も続く会話は、1 問 1 答の問題集では測れません。そこで、利用者役の AI に会話させます。

ツールでできること

from opik.simulation import SimulatedUser, run_simulation

user_simulator = SimulatedUser(
    persona="注文した商品が届かず、返金してほしいと怒っている客", model="openai/gpt-4.1")
simulation = run_simulation(app=run_agent, user_simulator=user_simulator, max_turns=5)

(run_agent は、利用者の発言を受け取って返事を返す自分のアプリの関数です)

論文:模擬の利用者は、本物より素直

Synthetic Users, Real Differences(2026 年 5 月)は、実際の利用者と AI のチャット 1000 件と模擬の会話を比べました。模擬の利用者は、本物の利用者が持ち込む話の行き違いや手間を再現できず、評価が楽観的になること、その程度は業務の分野によって違うことを報告しています。

一方で、使い道を絞れば役に立つという報告もあります。ブラジルの銀行 Nubank の事例(Screen Before You Serve、2026 年 9 月)では、模擬の顧客と模擬の道具を使って、本番に出す前に候補のエージェントを選別しました。リリースした 4 つの版で、模擬での版ごとの評価は本番での評価と強く相関し、模擬を使った改善は実際の比較実験で顧客満足度を大きく上げました。

合成データでの評価の偏りを調べた Towards Understanding Bias in Synthetic Data for Evaluation(CIKM 2025)も、同じ方向の結論です。合成データでの評価は、点数の絶対値は偏り得るが、システム同士の相対的な比較への影響は比較的小さいとしています。

ここから言えるのは、模擬や合成データは**「どちらの版が良いか」の比較には使えるが、「この版は本番で通用するか」の判定には甘い**ということです。

7. 段階 5:正解を機械で確かめられる課題を作る

採点の悩みがなくなる理想の形は、正解かどうかを機械で確かめられる課題です。これを自動で大量に作る研究が一番進んでいるのが、コードの領域です。

コード以外の業務でも、この発想は使えます。次の章の法務チェックの例がそれです。

8. 業務ごとの現実的な線引き

業務 自動で作れるもの 人がやること 使う道具
EC の問い合わせ対応 種類・感情・注文状態を組み合わせた問い合わせ文、架空の注文データ、利用者役との会話 問い合わせの種類の割合を本番から決める。返金などの方針の採点項目を確認する。本番の記録から難しい事例を拾う Data Designer か promptfoo、Opik か DeepEval の会話模擬
社内の法務チェック 問題のある条項を埋め込んだ契約書(どの条項を埋め込んだかが分かっているので、見落としを機械で確かめられる) 雛形と、埋め込む「問題条項」の一覧を作る。指摘の理由や修正案が妥当かは人が見る LLM で条項を書き換える小さなスクリプト
社内規程の問い合わせ 規程から問題・参照回答・根拠箇所 規程に答えが無い質問と、改定で答えが変わった質問を足す。参照回答が本当に正しいかを抜き取りで確かめる DeepEval、Ragas
自社の Claude Code スキル コードのリポジトリなら、バグ修正の課題 コード以外のスキルは、合否の確かめ方を自分で設計する SWE-smith、gskill

法務チェックの「埋め込み」は、SWE-smith がバグを仕込むのと同じ考え方です。正解(どこに問題があるか)を先に決めてから問題を作れば、採点は機械でできます。 自動生成で一番効くのは、この形に持ち込めるかどうかです。

なお、どの業務でも、問題を作る AI が答えを作る場合は、その AI に解けない難しさの問題には正解を付けられません。この「作り手の天井」については 以前の記事 で論文をもとに詳しく扱いました。

9. 普通のエンジニアの 1 週間

以上を踏まえて、EC の問い合わせ対応を例に、エンジニア 1 人で回せる手順をまとめます。

日 やること 道具 根拠
1 日目 本番の記録から、種類ごとに偏りなく数十件を拾う。人が難しい事例を 10 件ほど書く 自前のスクリプト 生成した問題は易しくなる(4 章)
2 日目 種類・感情・注文状態の割合を本番に合わせて指定し、入力を増やす Data Designer か promptfoo 多様性は指定しないと出ない(3 章)
3 日目 採点項目の案を自動で作り、出力を 20〜30 件読んで直す。プロンプトの変更履歴の「〜しないこと」も項目にする promptfoo の generate assertions 基準のずれ(EvalGen)、変更履歴の活用(SPADE)
4 日目 LLM の採点と人の判定の一致度を測り、採点用のプロンプトを直す LangSmith の Align Evaluator か自前 ルーブリックでも偏りは消えない(Autorubric)
5 日目 利用者役との会話を数十本回し、版同士を比べる Opik か DeepEval 模擬は比較には使えるが、合否には甘い(6 章)
その後 プロンプトの良し悪しで点に差が出る問題を選び、3 つに分けて GEPA に渡す gepa 差が出る問題を選ぶ(p1)

ここまでは、特別な機械学習の知識がなくても、Python と各ツールの文書を読める人なら進められます。逆に、自動化しても残る人の仕事は 3 つです。

  1. 何を何割作るかを決める(本番の分布を知っているのは人だけ)
  2. 出力を読んで採点基準を直す(基準は出力を見ないと決まらない)
  3. 生成した問題と参照回答を抜き取りで確かめる(生成した問題は易しく、参照回答は間違い得る)

まとめ

参考資料

ツールの公式文書(2026 年 11 月 6 日に確認)

論文

関連記事


Singularity Society はテクノロジー集団として MulmoClaude / MulmoTerminal / MulmoCast を開発しています。エンジニア・起業家向けの実践プログラム BootCamp も運営しています。

この記事をシェア

関連記事

記事一覧に戻る