Qast の AI アシスト学習設定は、単に LLM に「いい感じに設定して」と頼んでいるわけではありません。データセットのスキーマ情報、利用可能なアルゴリズムカタログ、評価指標の一覧を構造化して LLM に渡し、返却された JSON をバリデーション・サニタイズする多段パイプラインで実現しています。この記事では、その仕組みを詳しく解説します。
全体の処理フロー
AI アシスト学習設定は、以下の 7 ステップで動作します。
- 1
データセット情報の取得
データセット ID からデータセットのメタ情報(名前・行数・列数・ステータス)を取得します。ステータスが ready でない場合はエラーを返します。
- 2
スキーマ情報の取得
データセットに紐づくスキーマ(各カラムの名前・推論されたデータ型・ターゲットフラグ・ID フラグ・除外フラグ)を取得します。
- 3
カタログ情報の取得
利用可能な学習器(learner)、評価関数(metric)、損失関数(loss)のカタログを並列で取得します。各エントリにはキー名、表示名、対応タスクタイプが含まれます。
- 4
プロンプトの組み立て
システムプロンプト(AI の役割定義・出力フォーマット指定)とユーザープロンプト(データセット情報 + カラム一覧 + カタログ一覧 + ユーザーの自然言語プロンプト)を構造化して組み立てます。
- 5
LLM の呼び出し
組み立てたプロンプトを LLM(OpenAI GPT や Anthropic Claude)に送信します。temperature は 0.2 に設定し、安定した出力を得ます。
- 6
レスポンスのパースとバリデーション
LLM の返答から JSON を抽出し、Zod スキーマでバリデーションします。マークダウンのコードフェンスが含まれていても正しく処理できます。
- 7
サニタイズ(照合チェック)
提案された学習器キー・評価関数キー・カラム名が実際に存在するかを照合し、不正なキーを除外します。これにより LLM のハルシネーション(存在しないアルゴリズム名を生成してしまうケース)を防ぎます。
プロンプト設計のポイント
AI アシスト学習設定のプロンプトは、システムプロンプトとユーザープロンプトの 2 層構造になっています。システムプロンプトでは AI の役割(AutoML エキスパート)を定義し、出力フォーマット(JSON スキーマ)を厳密に指定します。ユーザープロンプトには、データセットのメタ情報・カラム一覧・利用可能な学習器/評価関数/損失関数のリストを構造化して含めます。
カラム一覧は最大 50 列までに制限しています。これは LLM のコンテキスト長を節約しつつ、十分な情報を提供するためのバランスです。各カラムにはデータ型の推論結果(numeric, categorical, datetime, text など)も含まれるため、AI はカラム名だけでなくデータの特性も考慮して提案を行います。
{
"taskType": "classification",
"targetColumn": "churn",
"learners": ["xgboost", "lightgbm", "random_forest"],
"evalFn": "f1",
"lossFn": "log_loss",
"cvFolds": 5,
"hpo": true,
"hpoNTrials": 30,
"searchMode": "ai_stepwise",
"dateColumn": null,
"excludeColumns": ["customer_id", "phone_number"],
"reasoning": "データにchurnカラム(離脱フラグ)があり...",
"columnNotes": [
{"name": "customer_id", "note": "顧客IDのため学習から除外推奨"},
{"name": "tenure", "note": "契約期間。離脱予測に有効な特徴量"}
]
}バリデーションとサニタイズ
LLM の出力は必ずしも正確ではありません。存在しないアルゴリズム名を生成したり、データセットにないカラム名を参照したりする可能性があります。そこで Qast では、LLM の返答を 2 段階でチェックしています。
第 1 段階は Zod スキーマによる構造バリデーションです。taskType が定義済みの値であること、learners が文字列配列であること、cvFolds が 2〜20 の範囲であることなど、型と範囲をチェックします。第 2 段階はカタログ・スキーマとの照合(サニタイズ)です。提案された学習器キーが実際のカタログに存在するか、目的変数や除外列がデータセットのカラムに存在するかを検証し、不正なエントリを除外します。
LLM が生成した学習器キーがすべて無効だった場合は、フォールバックとして LLM が提案した上位 3 つをそのまま採用します。これにより、カタログの更新とプロンプトの同期がずれた場合でも、完全にエラーになることを防いでいます。
LLM クライアントの抽象化
Qast の AI 機能は特定の LLM プロバイダーに依存しない設計になっています。LLMClient インターフェースを定義し、OpenAI と Anthropic の両方を同じインターフェースで利用できます。環境変数で切り替え可能なため、コスト・精度・レイテンシの要件に応じてプロバイダーを選択できます。
また、テスト時にはモックの LLM クライアントを注入できる設計になっています。これにより、実際の API を呼ばずに AI アシスト機能の単体テストが可能です。
プロンプトのバージョニング
AI アシスト学習設定のプロンプトにはバージョン番号が付与されています。API のレスポンスにはプロンプトバージョンが含まれるため、どのバージョンのプロンプトで生成された提案かを追跡できます。プロンプトの改善や A/B テストを行う際に、この情報が役立ちます。


