Q&Aのプロンプトと回答評価
プロンプトは、AIへ渡す指示と参照情報です。VideoQでは、利用者の質問だけでなく、アクセスできる講座の情報や字幕を使って回答します。
質問から引用までの具体例は、AIが回答を作るまでを読んでください。このページでは、その入力と制御を詳しく説明します。
回答モデルに何を渡すか
| 段階 | モデルへ渡すもの |
|---|---|
| 通常Q&Aの開始時 | システムの指示と最新の質問。過去の会話の各発言は含めない |
| ツールの定義 | 各ツールの機能、引数の形式、どの場面で使うかという指示 |
| ツール実行後 | 今回の回答内のツール呼び出し履歴と、講座の登録情報または番号付きの字幕 |
| 最終回答 | モデルが今回取得した根拠を使って文章を生成 |
プロンプトは prompts.json から言語に対応する指示を選びます。講座情報には名前・説明・動画数と、1ページ分の動画ID・タイトル・状態などが含まれます。ツールは共有トークン・所有者ID・ファイルURLを明示的に除外します。説明文は講座が2,000文字、動画が500文字で切り詰められる場合があり、切り詰めたことをフラグで示します。未取得のページや省略された文章を、情報が存在しない証拠として扱わないよう指示しています。
画面に過去のチャットが見えていても、通常Q&Aへの入力は変わりません。続けて質問する場合も、最新の質問だけで対象が伝わる文面が必要です。学習モードの採点では、別途、直前のAIの問いを使います。
Q&Aで情報を選ぶ
Q&Aは、必要に応じてツールで情報を取得し、回答を組み立てます。すべての質問で同じ検索を実行するわけではありません。
| 質問の例 | 主に使う情報 |
|---|---|
| 「この講座には動画が何本ある?」 | 登録された講座・動画の情報 |
| 「この授業の内容を要約して」 | 字幕の関連シーン |
| 「この動画の説明文を見せて」 | 登録済みの説明文 |
使えるツールは次の2つです。
get_course_info: 講座名・説明・動画一覧など。1ページ最大20動画、1回答最大5回。search_scenes: 字幕を意味で検索。講座全体または指定した講座内動画を対象にし、1回答最大3回。
ツールを使うモデルターンには最大8回の上限があり、その後はツールを外して最終回答を生成します。モデルが返した要求をそのまま実行せず、API側でも引数とアクセス範囲を検証します。
引用と権限
モデルには、取得した場面で裏付けられる主張に [N] を付けるよう指示します。場面の番号はAPIが割り当て、動画と時刻の情報を画面へ返します。講座名や動画本数などの登録情報には、シーンの引用番号や時刻を付けません。
収集する場面には、最終的な文章で引用された場面だけでなく、検索で取得した場面も含まれます。引用データはモデルへ用意した根拠を示すものであり、文章の各主張を自動で検証した結果ではありません。
検索フィルターは、APIが先にアクセスを確認した講座の範囲を強制します。それとは別に、字幕を参照資料として扱い、含まれる命令文には従わないようプロンプトで指示します。後者はモデルへの指示であり、プロンプトインジェクションや根拠のない回答を完全に防ぐ保証ではありません。
根拠やサービスが利用できないとき
| 状況 | 現在の挙動 |
|---|---|
| シーン検索が0件 | 一致する場面がないとツールが返す。上限内なら別の検索文を試せる |
| シーン検索を3回実行済み | 追加の検索には上限到達を返す。取得済みの根拠で回答するか、不足を説明するよう指示する |
| 講座外の動画IDを指定 | 検索を拒否し、利用可能なIDを使うようモデルへ返す |
| 質問の一部しか根拠がない | 裏付けられる範囲だけ答え、その限界を示すよう指示する |
| DBや埋め込みの実行が失敗 | 「根拠がない」とは扱わず例外を伝える。チャットのエラー処理で回答用に予約した利用枠を戻す |
| 回答プロバイダーの失敗・タイムアウト | エラー処理へ進む。チャットモデルのラッパーによる自動再試行は行わない |
現在は最低類似度による除外がないため、関連が弱い検索結果も返ることがあります。シーン検索を参照してください。字幕に必要な説明がない場合や、索引と検索の埋め込みが一致しない場合は、プロンプトの表現だけを変えても解決しません。
学習モード
学習モードはPLOGの概念・前提関係・問い・ヒントを使います。扱う概念や未理解の前提を選び、学習者の答えを評価して進行状態を更新します。
最初の問いは保存済みの文面を使います。通常の採点や支援文ではLLMを利用し、答えを直接求める発言には保存済みのヒントと定型文を返します。プログラムの規則で STUDY_SESSION の一時状態を更新します。採点とヒントの判断を参照してください。
回答品質は別の処理で評価する
講座のチャットでは、APIが質問・回答・引用・取得した資料を保存します。非同期のworkerジョブが、保存された回答をRAGASで評価します。回答生成の処理が、この評価による承認や書き直しを待つ仕組みではありません。
| 保存する指標 | 調べること |
|---|---|
faithfulness | 回答の主張が取得した資料に裏付けられているか |
answer_relevancy | 質問に沿った回答になっているか |
context_precision | 取得した資料が回答に役立つか |
これらは自動評価の推定値であり、検証済みの成績や正解の確率ではありません。現行実装は参照正解を使わない指標を選んでおり、すべての回答を人が用意した正解と比較する処理ではありません。取得資料がない場合はcontext precisionを省略します。個別指標の計算に失敗すると値が未設定になる場合があり、評価ジョブ全体の失敗は failed として記録します。
この評価は、学習モードを進める mastery / partial / miss の採点とは別です。pipeline/evaluation.pyとtasks/evaluation.pyが実装です。
変更する場所
| 場所 | 役割 |
|---|---|
| prompts/ | 指示文と設定 |
| rag.ts | Q&Aのツール呼び出し・回答生成 |
| rag-course-info.ts | 講座・動画の登録情報 |
| plog-study.ts | 学習モードの回答と評価 |
| plog_build.py | 学習用の概念・問い・ヒントの生成 |
変更後に見ること
日本語・英語で、登録情報だけの質問、授業内容の質問、両方が必要な質問を試します。回答だけでなく、使ったツール、引用先、講座外の情報が混ざらないことを確認します。
LLM_MODEL は回答や生成に使うモデル、EMBEDDING_MODEL は検索用のモデルです。役割を混同せず、埋め込みの変更ではAPI・worker・DBの次元も揃えます。
実モデルのテスト方法と料金が発生する条件はテストと確認コマンドを参照してください。