1. なぜ今まさにマネタイズを考えるのか
これまでのモジュールの主な問いは「そもそも動くのか?」でした。ここからは次のレベル、「それは採算に合うのか?」を加えます。
LLM アプリではこれが特につらいポイントです。変動費(LLM トークン、リランキングモデル、埋め込みなど)が、よくある「$20 のサーバー+$15 の Postgres」という感覚を簡単に吹き飛ばします。これを無視すると、月末に OpenAI から住宅ローン並みの請求書が届くことになります。
そこで今日は大きく3つのテーマです。
- ChatGPT App、そして私たちの GiftGenius におけるマネタイズモデル。
- pricing ↔ cost_per_task をどう結び付けるか。1 回あたり $0.15 かかるのに「100 回のギフト提案を $1 で」などと売らないために。
- A/B 実験「コスト ↔ 品質」の立て方:モデル・プロンプト・UX を変えつつ、数週間後に勘ではなくデータで意思決定できるよう、正しくログを設計する。
あわせて次のモジュール(LLM-evals と quality_score)への布石を打ちますが、ここではコードには踏み込みません。
2. ChatGPT App のマネタイズモデル: B2C、B2B、フリーミアム、アップセル
LLM の魔法を脇に置けば、ここでのマネタイズモデルは一般的な SaaS やモバイルアプリとよく似ています。ただし会話型インターフェースには癖があり、ユーザーは「どこからが無料で、どこからが有料か」を体感しにくい。そのため UX で丁寧に設計する必要があります。
GiftGenius を例に主な選択肢を見ていきます。
B2C: 一般ユーザーとギフト
顧客は ChatGPT にやって来る一般の人です。たとえば「宇宙ファンに 50 ドルで贈り物を選んで」と頼みます。自社商品を売らずに、ユーザー向けに選定だけを提供することもできます。
典型的な B2C モデル:
- 都度課金。
ユーザーは特定のシナリオに対して支払います。例: 無料で 3 件のアイデア、以降は同一の受取人向けに 10 件の追加アイデアを含む有料パック。 - サブスクリプション。
月額課金でのアクセス。GiftGenius なら「月 100 回までの選定」や「頻繁に贈る人向けの無制限選定」など。 - フリーミアム(無料/有料ティア)。
基本シナリオは無料(1 か月あたり N 回まで、機能制限あり)。有料は上限拡大・高性能モデル・追加の選定フォーマット・履歴など。ChatGPT App では最も一般的なモデルで、「ChatGPT 内は基本無料、プレミアム機能は有料」です。 - アプリ内アップセル。
ユーザーは無料の基本選定を実行し、十分な結果を見た後に、やわらかく提案します。「$X でウィッシュリストや SNS 等も加味した深掘り選定をしますか?」や「そのままギフト券を発行しますか?」など。
B2B: チーム、企業、法人向けギフト
ここでは HR、マーケ部門、「社員/顧客への贈り物を担当する人たち」の出番です。
典型的な構成:
- ユーザー単位のライセンス(per seat)。
例: 「HR‑Team」プランを 10 名で契約。各自が GiftGenius にアクセスし、ギフトと予算のレポートを確認。 - 企業単位のライセンス(per company)。
「最大 500 名まで、月額固定。社内では選定回数無制限」。 - 追加のエンタープライズ機能。
専用の管理画面、HRIS/CRM 連携、カスタムレポート、SLA など。
いずれの場合も「1 回の選定がいくらか」ではなく、cost_per_user_per_month または cost_per_tenant_per_month を算出し、ライセンス価格と比較します。
GiftGenius のモデルをどう選ぶか
理屈に埋没しないために、まずはシンプルに始められる案を採用します。
- B2C: フリーミアム。
月 3 回まで無料。その後は $5/月 のサブスクで無制限選定+プレミアムモデル。 - B2B: 企業単位。
「HR チーム」$99/月。最大 500 件の選定、HR システム連携、レポーティング込み。
その後、cost_per_task とコンバージョンの実データが出そろったら、数値を回していきます。現時点の数字は「ざっくり仮置き」で、もっともらしくは見えるものの、完了シナリオ 1 件あたりの実コストはまだ検証していません。次章では、こうした料金を実際の原価cost_per_taskに結び付けます。
3. 価格と原価の関係: cost_per_task とは
ここからが本題です。いわば「GPT‑5 慈善事業」にならないために。
直感: 価格 ≥ cost_per_task × マージン
前回のテーマで出てきた cost_per_task は、1 つの成功したシナリオ(「ユーザーが選定を開始」から「結果を得る」(必要なら決済まで))に対する合計コストです。
内訳には以下が含まれます。
- LLM の費用(トークン数 × 入出力の price_per_token。必要に応じてリランキングモデル、埋め込み等も含む)
- 1 タスクあたりのインフラ費用の按分(サーバー、DB、キュー、MCP ゲートウェイなど)— 多くは集計値から見積もります
- 任意でトランザクション費(Stripe 手数料や不正対策等)。「手取り」までを cost_per_task に含めたい場合
考え方は単純で、シナリオやサブスクの価格は、平均的な 1 シナリオの原価に「マージンの安全域」を掛けたものを上回る必要があります。
ごく単純化すると次のようになります。
price_per_task >= cost_per_task * ( 1 + margin )
細かな数字やマージン%で講義を埋めるつもりはありません。大切なのはこの直感的なルールです。
GiftGenius の例
前回講義のコストログを実装済みで、集計レポートがあるとします。
- 平均の cost_per_task(ギフト選定 1 件完了あたり) = 0.15 USD
- この中には LLM トークン(suggest_gifts の複数呼び出し、リランキング、最終サマリー)とインフラの按分が含まれます。
続いてシナリオを見てみます。
- 無料ユーザーが選定を行い、ときどき $50 のギフト券を購入する
- 完了した選定のうち決済に至るコンバージョンは仮に 5%
フルのユニットエコノミクスまでは踏み込みませんが、概算は可能です。仮に 100 件の選定があった場合:
- コストは 100 × $0.15 = $15
- そのうち 5 件が $50 のチェックアウトに至る
- 売上は 5 × $50 = $250
一見よさそうです。ざっくり($250 – $15)で、ここから Stripe 手数料や税金などが乗ってきます。ただし、たとえば「$1 で 100 回選定」のように気前のよすぎるサブスクにすると、簡単に赤字になります。
ミニコード例: TypeScript で cost_per_task を保存
選定ワークフローの完了を行い、合計コストを把握している MCP ツールがあるとします。
// シナリオ最終メトリクスの型
type TaskMetrics = {
taskId: string;
userId: string;
costPerTaskUsd: number;
modelName: string;
completedAt: string;
};
// メトリクスをログに出す仮の関数
async function logTaskMetrics(metrics: TaskMetrics) {
console.log(JSON.stringify({
level: "info",
event: "workflow_completed",
...metrics,
}));
}
// 選定完了ハンドラ内のどこかで:
await logTaskMetrics({
taskId: context.taskId,
userId: context.userId,
costPerTaskUsd: context.costEstimateUsd, // トークンから算出
modelName: context.modelName,
completedAt: new Date().toISOString(),
});
この種のログはダッシュボードで容易に集計でき、モデル・ユーザー・シナリオ別の cost_per_task 分布を可視化できます。
4. プライシング: cost_per_task を実価格に落とす
cost_per_task が出たら、何に対していくら課金するかを決めます。
B2C の単純ルール
B2C では次のような経験則を採用できます。
「LLM+インフラに売上の X% を超えて使わない」。
たとえば、売上の 20% を LLM コストに使いたくないと決めるなら:
- cost_per_task = $0.15 のとき、1 回の有料シナリオの最低価格は ≈ $0.75($0.15 が $0.75 の約 20%)。
- サブスク販売なら、1 か月に 1 人の加入者あたり平均何シナリオ発生するかを見積もって掛け合わせる。
まずは「目分量」で始め、実データが出たら調整するのはまったく普通です(スパイラー: すぐには出ません)。
B2B の単純ルール
B2B では通常、次を見ます。
- cost_per_user_per_month または cost_per_tenant_per_month
- 顧客企業の支払意思(あなたが解決する課題の大きさ)
たとえば HR チームが GiftGenius 経由で年間数万ドル規模のギフトを手配しているなら、月 $99 のサブスクは控えめに見えるかもしれません。たとえそのチームに対する LLM コストが月 $10 でもです。重要なのは、やってはいけない状況、すなわち cost_per_tenant = $80 なのにサブスクが $50、という事態を避けることです。
「AI だし、しばらく無料で様子見」という発想だと、わりと簡単にこうなります。
サーバー側の小さな「ガード」関数
価格の検討時に、コストが妥当な範囲を外れていないかを教えてくれる簡単な「ガード」をコードに入れておけます。
function checkPricingSafety(params: {
avgCostPerTaskUsd: number;
plannedPricePerTaskUsd: number;
maxCostShare: number; // 例: 0.3 = 30%
}): boolean {
const share = params.avgCostPerTaskUsd / params.plannedPricePerTaskUsd;
return share <= params.maxCostShare;
}
// 例:
checkPricingSafety({
avgCostPerTaskUsd: 0.15,
plannedPricePerTaskUsd: 0.75,
maxCostShare: 0.3,
}); // true — OK、20% <= 30%
これは財務モデルの代替ではありませんが、特に価格を実験しているときの簡易サニティチェックとして有効です。
5. 「モデル / エージェント vs コストとコンバージョン」の実験
ここからは一番おもしろいA/B 実験です。
直感はこうです。
- バリアント A — 高価なモデル / 複雑なワークフロー
- バリアント B — 安価なモデル / 単純化したワークフロー
- それが同時にどう効くのかをまとめて知りたい:
- cost_per_task
- 結果の品質(ユーザーの体感+将来の LLM 評価)
- ビジネス指標(コンバージョン、売上)
何で実験するか
主に 3 つの軸があります。
- モデル。
例: GPT‑5 vs GPT‑5‑mini、あるいは別系統。一般に高価なモデルは品質が良く cost_per_task も高く、安価なモデルはその逆。 - エージェントロジック / プロンプト。
詳細な手順・長いプロンプト・凝った reasoning は高品質だが高コスト。最小限のロジックは安価で、ときに品質差が小さいことも。 - UX フォーマット。
入力項目の多い長いウィザード vs すばやいインライン。モデルは同じでも、トークン量とステップ数が大きく変わることがある。
これらのバリエーションはすでに実装可能ですが、実験としてラップし、ログを取ることが重要です。
実験でログすべきフィールド
コスト用にログしている(tokens、model、cost_estimate、user_id、request_id 等)の上に、実験用フィールドを加えます。
- experiment_id — 実験のユニーク ID(例: "gift_model_ab_2025_11")。
- variant — そのユーザーの枝("A"、"B"、"control"、"treatment" など)。
- model_name または agent_version — 後から構成を思い出すため。
- シナリオの結果:
- workflow_completed があったか
- checkout_success があったか
- 最終的な cost_per_task
- 任意 — quality_score(詳細は後述、LLM-evals へのブリッジ)。
実験イベントの JSON ログ例
典型的なイベントは次のようになります。
{
"level": "info",
"timestamp": "2025-11-21T20:15:03.123Z",
"event": "experiment_task_result",
"experiment_id": "gift_model_ab_2025_11",
"variant": "A",
"user_id": "user_123",
"task_id": "task_456",
"model_name": "gpt-5.2",
"workflow_completed": true,
"checkout_success": false,
"cost_per_task_usd": 0.18,
"quality_score": null,
"request_id": "req_abc",
"trace_id": "trace_xyz"
}
この種のレコードはどんな分析基盤でも集計しやすく、「variant A vs B のコスト/コンバージョン/収益」表を作れます。
コード例: MCP ツールで実験をログする
MCP サーバーがシナリオのコスト(cost_per_task)を算出済みで、ユーザーがどの実験枝にいるかも分かっているとします。
type ExperimentContext = {
experimentId: string;
variant: "A" | "B";
};
async function logExperimentResult(params: {
ctx: ExperimentContext;
userId: string;
taskId: string;
modelName: string;
costPerTaskUsd: number;
workflowCompleted: boolean;
checkoutSuccess: boolean;
}) {
const event = {
level: "info" as const,
event: "experiment_task_result",
timestamp: new Date().toISOString(),
experiment_id: params.ctx.experimentId,
variant: params.ctx.variant,
user_id: params.userId,
task_id: params.taskId,
model_name: params.modelName,
cost_per_task_usd: params.costPerTaskUsd,
workflow_completed: params.workflowCompleted,
checkout_success: params.checkoutSuccess,
};
console.log(JSON.stringify(event));
}
その上位で(user_id、tenant_id、またはランダムにより)ユーザーをどのバリアントに割り当てるかを決め、ExperimentContext をワークフローのハンドラに渡します。ここまでで、実験に必要なフィールドとその書き込み場所という、ログ設計の基本を固めました。続いて、こうした実験を単なるログの集合ではなく、分かりやすいプロダクト仮説とプライシング判断に変える方法を扱います。
6. quality_score と LLM-evals のさわり
詳細は第 20 モジュールで扱いますが、ここではアイデアの共有だけ。quality_score は、回答/解の品質を 0〜10 などのスケールで評価するもの(しばしば別の LLM モデル=「審査員」)です。LLM-as-judge については第 20 モジュールで詳説します。
実装の細部は今は不要(次モジュールの範囲)ですが、概念は押さえておきましょう。
- お金に加え、品質も測りたい。
- 人間、または第 2 のモデルに「GiftGenius の選定は 10 点満点でどれくらい良いか?」を評価してもらえる。
- そのうえで、quality_score が次とどう相関するかを見られる:
- 購入へのコンバージョン
- ユーザーのリテンション
- willingness-to-pay(支払意思)
ログの観点では、これは単なる追加フィールドです。
type ExperimentResultEvent = {
experiment_id: string;
variant: string;
user_id: string;
task_id: string;
cost_per_task_usd: number;
quality_score?: number; // 0-10, may be undefined
};
本講義ではここまで。LLM-evals、ゴールデンケース、そして「LLM-as-judge」の詳細はこの先の講座で扱います。現時点では、このスコアを実験のどこに挿すかを理解できれば十分です。まさに quality_score が、「コストだけ最適化」という典型的な誤りから救ってくれます。どこでコストを下げすぎて品質を落とし、同時にコンバージョンや売上を落としているのかを数値で把握できます。
7. 実験をプライシングとマネタイズに活かす
単に実験をログするだけでなく、成功メトリクスとマネタイズへの影響を明確にしたビジネス仮説として扱いましょう。experiment_id を記録するだけでは不十分で、プロダクトの変更は明示的な成功指標を持つ仮説として設計することが大切です。
仮説例: 高価なモデル vs 安価なモデル
GiftGenius の実験を想定します。
- バリアント A — 高価なモデル(GPT‑5)、豊富な reasoning、長いウィザード
- バリアント B — 安価なモデル(GPT‑5‑mini)、やや単純なプロンプト、短めの会話
仮説: 安価なモデルに置き換えると、cost_per_task が少なくとも 50% 減る。一方、ユーザー体感と LLM 評価(quality_score)の品質低下は 5–10% 以内で、購入コンバージョンは落ちない。
技術的には、各タスクで第 5.2 節と同じフィールドをログします。
- experiment_id = "gift_model_ab_2025_11"
- variant = "A" または "B"
- model_name
- cost_per_task_usd
- workflow_completed
- checkout_success
- quality_score(LLM-evals が入ったら)
1〜2 週間後に次の比較を行えます。
- バリアント A/B の平均 cost_per_task
- チェックアウト率(成功決済の割合)
- 平均 quality_score(あれば)
もし B が品質でほぼ負けず、コストが半分なら、次のいずれかを選べます。
- B に切り替えてマージンを引き上げる
- 価格は据え置きつつ、ユーザー向けサブスク料金を引き下げて成長を加速する
仮説例: 質の高いアップセル
別の仮説です。無料の 3 アイデア提示の後に「ギフトの完全レポート+メッセージ文面の提案」を $4.99 のプレミアムアップセルで提示すると、購入コンバージョンが少なくとも 2 パーセントポイント(2pp)上がる。一方で cost_per_task の増加は $0.05 以内。
ここではモデルというよりもUX とプロダクトロジックの実験ですが、技術的には同じです。
- variant ごとに異なる UX
- シナリオごとのコストと収益をログ
- アップリフト分析(新ロジックでどれだけ売上が伸び、コストが暴発しなかったか)
コード例: タスクごとのシンプルな売上を記録
ときにはコストの横にシナリオの売上も記録すると便利です。
type RevenueEvent = {
taskId: string;
userId: string;
experimentId?: string;
variant?: string;
revenueUsd: number;
checkoutSuccess: boolean;
};
async function logRevenue(event: RevenueEvent) {
console.log(JSON.stringify({
level: "info",
event: "task_revenue",
timestamp: new Date().toISOString(),
...event,
}));
}
後で task_revenue と experiment_task_result を taskId で紐付ければ、各バリアントで次を算出できます。
- 平均 revenue_per_task
- 平均 cost_per_task
- そして簡単な ROI
8. 実践演習: GiftGenius の A/B 実験
理論を実務に結び付けるために、GiftGenius の「高価 vs 安価モデル」実験が実際にどうなるかを、ステップごとに演習形式で確認します。
何を変えるか
- バリアント A:
- モデル gpt-5
- より詳細な system プロンプトとエージェントの手順
- より多くの中間 reasoning 呼び出しの可能性
- バリアント B:
- モデル gpt-5-mini
- ややコンパクトなプロンプト
- 補助的な tool 呼び出しを減らし、簡素なフロー
ユーザーを枝にどう割り当てるか
最も簡単なのは user_id のハッシュによる方法です。
function assignVariant(userId: string): "A" | "B" {
const hash = Array.from(userId).reduce((acc, ch) => acc + ch.charCodeAt(0), 0);
return hash % 2 === 0 ? "A" : "B";
}
これで概ね均等に分配され、同じユーザーは常に同じ枝に入ります。
何をログするか
選定ワークフローの完了時に、前章(5.2 と 7.1)と同じフィールドをログし、売上も加えます。
- experiment_id = "gift_model_ab_2025_11"
- 上の関数で決まる variant
- 実際に使われた model_name
- トークンとインフラの合計コストである cost_per_task_usd
- workflow_completed(true/false)
- checkout_success(true/false)
- revenue_usd(0 または購入金額)
任意で(講座の後半で)quality_score が加わります。
そしてこれらのデータはログ/分析に流れ、次のようなテーブルに展開できます。
| experiment_id | variant | avg_cost_per_task | checkout_rate | avg_revenue_per_task |
|---|---|---|---|---|
| gift_model_ab_2025_11 | A | $0.22 | 6.0% | $3.50 |
| gift_model_ab_2025_11 | B | $0.09 | 5.8% | $3.40 |
この表から、B はほぼ同等の収益でコストが半分という強い示唆が得られます。
9. ビジュアル図解: 「コスト ↔ 品質 ↔ マネタイズ」ループ
全体像をまとめるため、データフローの小さな図を描きます。
flowchart TD
U[ChatGPTのユーザー] --> A["ChatGPT App (GiftGenius)"]
A --> E[実験モジュール
variant A/B を割り当て]
E --> AG[エージェント / MCP tools
異なるモデル構成]
AG -->|LLM 呼び出し| L[usage & cost ログ]
AG -->|選定結果| UI[ウィジェット / チャット応答]
UI -->|行動: クリック、購入| BE[Commerce backend]
L --> M[メトリクス: cost_per_task,
cost_per_user]
BE --> M
M --> D[pricing & 実験ダッシュボード]
subgraph "今後のモジュール20"
J[LLM-judge
quality_score]
J --> M
end
今のあなたはちょうどこの図の中央にいます。コストと売上をログできるようになり、その上に実験とプライシングを乗せます。次のモジュールでは「ジャッジ・ドレッド」(LLM-judge)の話題がやって来ます。
10. マネタイズと実験でやりがちなミス
全体像があると、どこで壊れやすいかも見えやすくなります。以下は、マネタイズとコスト実験を進める際に手元に置いておきたいチェックリストです。
ミス1: コストだけ最適化して、品質を忘れる。
よくあるのは、より安価なモデルに切り替え、OpenAI の請求が軽くなって勝利宣言するパターン。その後 1 か月で、ギフト券の購入が減り、リテンションが悪化し、「変な提案が来た」というサポートが増えます。quality_score も、最低限の代替指標(アイデアのクリック、保存、コンバージョン)もログしていないと、「安いけど役立たない」状態に陥りがちです。
ミス2: cost_per_task を LLM だけで計算し、インフラや決済を無視する。
開発者はトークンは几帳面に数えるのに、Redis、キュー、外部 API、Stripe 手数料などを見落としがちです。その結果 cost_per_task は過小に見積もられ、価格が実際よりも快適に思えてしまいます。インフラは集計ベースで按分するのが一般的ですが、シナリオの原価にその分を必ず含めるべきです。
ミス3: 明示的な experiment_id/variant なしにモデルや UX を変更する。
「ちょっとプロンプトを書き換えたら良くなった気がする」— 1 か月後、いつ変えたのか、何のデータに基づくのか、どんな影響があったのか誰も覚えていません。ログに experiment_id と variant を明記し、特定のリリースと紐付けないと、振り返りと因果の説明が難しくなります。
ミス4: データが少なすぎる段階、早すぎる段階で意思決定する。
実験を 2 日動かして、10 件の決済だけで「モデル B ははるかに有利」と結論づけるのは、統計的ノイズに飲まれた典型です。最低でも 1 週間、できればもっと長い観測期間と、平均やコンバージョンを比較できる十分な件数が必要です。統計の講義ではありませんが、「5 件で結論を出さない」は覚えておきましょう。
ミス5: シンプルな思考ルールなしに複雑な価格設計を行う。
3 階層の料金プラン、多通貨、紹介コード割引など複雑な設計にしても、「LLM コストは売上の X% を超えない」「シナリオ価格は平均 cost_per_task の 3 倍未満にしない」といった単純な原則がなければ、マージンを失い、月末まで気づかないことになります。
ミス6: マネタイズをマーケや成長と切り離して考える。
マネタイズとプライシングは真空中に存在しません。サブスクが高ければ離脱が増えコンバージョンが下がる。価格が低ければコスト最適化の要求が高まる。今の収益だけを見るのではなく、獲得/活性化/維持(次のテーマで扱います)とのつながりで捉えるべきです。プライシングの実験も品質やコストの実験と同様のログ設計にして、全体像を一望できるようにしましょう。
GO TO FULL VERSION