意思決定の評価
品質とコストを測定します。
「意思決定の評価」はCoddyKit上の無料AI Prompt Engineeringレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Prompt Engineering学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Prompt Engineeringコースには全4レッスンが含まれています。
測定できないものは判断できない
プロンプト、チューニング、ハイブリッドのどれを選ぶかは、その背後にある評価次第です。固定された評価セットとコストモデルがなければ、比較はすべて逸話にすぎません。
- 品質とコストは2つの軸です。早い段階で1つの数値にまとめてはいけません
- 比較するすべての手法で、評価セットをホールドアウトし、同じものを使う必要があります
- 制約条件において品質とコストのフロンティア上で最適な点にある手法が勝者です
まず固定された評価セットを作る
何かを比較する前に、どの手法も学習に使わないホールドアウト評価セットを作成します。実際の分布をカバーする必要があるため、一般的なケース、既知のエッジケース、敵対的な入力を、おおむね本番環境と同じ割合で含めます。
このセットを固定してください。プロンプトのみ、チューニング済み、ハイブリッドのすべての手法を、同一のセットで評価します。比較のたびに評価セットが変わると、数値を比較できず、判断も無効になります。
def split_eval(labeled, holdout_ratio=0.2, seed=42):
import random
rng = random.Random(seed) # fixed seed = reproducible split
data = labeled[:]
rng.shuffle(data)
cut = int(len(data) * (1 - holdout_ratio))
train, frozen_eval = data[:cut], data[cut:]
return train, frozen_eval # eval never enters any training runタスクに合った指標を選ぶ
一般的な正解率では、タスク固有の失敗が見えなくなります。実際に重要な点を捉える指標を選んでください。
- 構造化された出力には完全一致/スキーマ一致
- 自由記述の品質にはルーブリックで採点するLLM-as-judgeと、人間が監査したサンプル
- テール指標:平均だけでなく、最悪値とp95
- 安全性/拒否率:品質とは別に採点するハードゲート
壊滅的なテールの失敗を隠す平均スコアは、誤った判断につながります。
すべての候補を同じ条件で評価する
プロンプトのみ、チューニング済み、ハイブリッドの各手法を、同じ固定評価セットに対して同じ評価器で評価します。それぞれについて、品質とコストの全ベクトルを記録し、同じ条件で比較できるようにします。
def evaluate(candidate, frozen_eval, scorer):
results = []
for ex in frozen_eval:
out = candidate.run(ex['input'])
results.append(scorer(out, ex['label']))
mean = sum(results) / len(results)
p95 = sorted(results)[int(0.95 * len(results)) - 1]
return {'mean': mean, 'p95_worst': p95}
# Identical frozen_eval + scorer for prompt / tuned / hybridコストの全ベクトルをモデル化する
コストは1つの数値ではありません。実際の利用量における比較になるよう、すべての構成要素を記録してください。
- 呼び出しごとの推論コスト:入力と出力のトークン数に価格を掛けたもの(長いプロンプトほど呼び出しごとのコストが高くなります)
- 償却した学習コスト:チューニングのコストを予想リクエスト数に配分したもの
- 保守コスト:データパイプライン、評価の実行、ベースモデルの入れ替えに伴う再チューニング
- レイテンシ:コンバージョンやUXに影響する場合は、別のコストとして評価するもの
def monthly_cost(calls, in_tok, out_tok, price_in, price_out,
train_cost=0.0, months_amortized=12):
inference = calls * ((in_tok/1000)*price_in + (out_tok/1000)*price_out)
amortized_train = train_cost / months_amortized
return inference + amortized_train
# Long prompt-only: high in_tok, train_cost=0
# Tuned: low in_tok, train_cost>0 amortized over volume品質とコストのフロンティアを描く
候補ごとの品質と月間コストが分かったら、フロンティア上に配置します。別の候補のほうが品質が高くコストも低い場合、その候補は支配されています。支配された候補は除外してください。
支配されていない候補の中から、適切な選択は制約条件によって決まります。品質の基準を満たす中で最も安いものを選ぶか、コスト上限以内で最も品質の高いものを選びます。これで判断は好みではなく、明確で説明可能なものになります。
def non_dominated(candidates):
# candidate: {'name','quality','cost'} -- higher quality, lower cost better
keep = []
for c in candidates:
dominated = any(o['quality'] >= c['quality'] and o['cost'] <= c['cost']
and o != c for o in candidates)
if not dominated:
keep.append(c)
return keepノイズではなく統計的有意性を見る
200例の評価で2ポイント向上しても、ノイズである可能性があります。勝者を決める前に、評価の規模を踏まえて品質差が統計的に意味のあるものかを確認してください。
対応のある比較(同じ例を両方の候補に通す)を使い、差に対する信頼区間を求めます。区間がゼロをまたぐ場合、実際の改善は確認できず、チューニングによる追加コストを正当化できません。
def paired_diff_ci(scores_a, scores_b):
import statistics
diffs = [a - b for a, b in zip(scores_a, scores_b)]
mean = statistics.mean(diffs)
sd = statistics.pstdev(diffs)
se = sd / (len(diffs) ** 0.5)
return (mean - 1.96*se, mean + 1.96*se) # if it spans 0 -> not significant評価データの漏洩を防ぐ
学習データと評価データの境界で重複を除去し、ほぼ同一のデータがないか確認してください。また、チューニング済みモデルが見ていないように、日付で分離してホールドアウトした時間的に分離された評価セットを優先します。漏洩は、チューニングの判断が本番環境で失敗する最も一般的な原因です。
提供後も監視する
判断はリリース時点で終わりではありません。本番環境の分布は変化し、入力が学習分布から離れるにつれて、チューニング済みモデルの品質が気づかないうちに低下する可能性があります。
- 実際のトラフィックをサンプリングし、同じルーブリックで採点する
- 品質の低下と呼び出しあたりのコスト増加に対してアラートを設定する
- ベースモデルのバージョンが変わるたびに、固定評価を再実行する
選択した手法は確定した判断ではなく、継続的に検証する仮説として扱ってください。
判断記録
比較結果を、書面による判断記録として残します。固定評価、各候補の品質とコストの全ベクトル、有意性の結果、想定利用量、フロンティア上で選んだ点とその理由を記録してください。
これにより、選択を監査し、再評価できるようになります。利用量やベースモデルが変わったときは、記憶を頼りに議論をやり直すのではなく、記録を開き直して再実行します。
エンドツーエンドの判断関数
すべてをつなげると、固定評価で各候補を採点し、コストを付加し、支配される選択肢を除外し、最も安いベースラインに対して有意差があることを求めたうえで、制約条件に基づいて選択します。
def decide(candidates, quality_bar, cost_ceiling):
frontier = non_dominated(candidates)
feasible = [c for c in frontier
if c['quality'] >= quality_bar and c['cost'] <= cost_ceiling]
if not feasible:
return 'NO_CANDIDATE_MEETS_CONSTRAINTS'
# cheapest option that clears the quality bar
return min(feasible, key=lambda c: c['cost'])['name']
# Prefer prompt-only on ties: lower maintenance TCO理解度チェック
チューニング済みモデルが、150例の評価でプロンプトのみの場合より2ポイント高いスコアを出しました。しかし、差に対する対応のある信頼区間はゼロをまたいでいます。さらに、月間コストも高くなります。適切な判断は何でしょうか。
まとめ
直感ではなく、固定評価と正直なコストの全ベクトルに基づいて判断します。品質とコストは2つの軸です。答えは、制約条件に基づいて選んだ品質とコストのフロンティア上の点です。
- 1つの評価セットを固定し、すべての候補を同じ条件で評価する
- タスクに合った指標を選び、平均だけでなくテールにも注目する
- コストの全ベクトルをモデル化し、実際の利用量に対して学習コストを償却する
- 統計的有意性を求め、信頼区間がゼロをまたぐ場合は改善とみなさない
- 評価データの漏洩を防ぐ。これはチューニングが誤って勝つ主な原因です
- リリース後も監視し、再実行できるよう判断を記録する
よくある質問
「意思決定の評価」レッスンは無料ですか?
はい。「意思決定の評価」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Prompt Engineeringコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Prompt Engineeringコースには全4レッスンが含まれています。
「意思決定の評価」で何を学びますか?
品質とコストを測定します。 ブラウザで直接実行するハンズオンコードでAI Prompt Engineeringを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
AI Prompt Engineeringを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAI Prompt Engineeringは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「意思決定の評価」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAI Prompt Engineeringレッスンでコードを書いて実行できますか?
はい。すべてのAI Prompt Engineeringレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。