はじめに
最近、個人開発でもAI機能を入れる機会がかなり増えてきました。
最初は「とりあえずOpenAI APIをつないでおけば十分かな」と思っていたのですが、実際にプロトタイプを作ってみると、思ったよりも早い段階で「複数モデルをどう扱うか」という問題にぶつかりました。
たとえば、文章生成、コード生成、要約、翻訳、画像生成、動画生成など、同じ「AI機能」と言っても、用途によって向いているモデルがかなり違います。
この記事では、個人開発や小さなチームでAI機能を入れるときに、複数モデル対応をどう考えるとよさそうか、自分なりに整理してみます。
あくまで現時点でのメモなので、ベストプラクティスというよりは「こういう観点で考えるとよさそう」という内容です。
1つのモデルだけでは少しつらくなる場面
AI機能を作るとき、最初は1つのモデルだけでも十分に見えます。
たとえば、以下のような機能であれば、まずは1つのLLMを呼び出すだけでも動きます。
- 文章生成
- 要約
- 翻訳
- チャット
- 簡単なコード生成
- アイデア出し
ただ、実際に使ってみると、タスクによって重視したいポイントが違ってきます。
| 用途 | 重視したいこと |
|---|---|
| 文章生成 | 自然な表現、構成、トーン |
| コード生成 | 推論力、既存コードの理解、修正能力 |
| 長文要約 | 長いコンテキスト、情報整理 |
| 翻訳・ローカライズ | 文脈理解、自然な言い回し |
| 画像生成 | プロンプト理解、画面品質、スタイル制御 |
| 動画生成 | 一貫性、表現力、コスト |
| バッチ処理 | 速度、価格、安定性 |
| プロトタイプ検証 | 切り替えやすさ、試しやすさ |
高性能なモデルは複雑なタスクには強いですが、すべての処理に使うとコストが気になります。
一方で、軽量なモデルは大量処理には向いていますが、クリエイティブな文章生成や複雑なコード生成では物足りないことがあります。
なので、ある程度AI機能をちゃんと使おうとすると、
すべてを1つのモデルに寄せるより、用途ごとにモデルを使い分けたくなる
という状況になりやすいです。
複数のAI APIを直接扱うと地味に大変
複数モデルを使いたいだけなら、それぞれの公式APIを直接つなげばよさそうに見えます。
ただ、実際には細かい運用コストが増えていきます。
API Keyが増える
まず、シンプルにAPI Keyが増えます。
OPENAI_API_KEY=xxx
ANTHROPIC_API_KEY=xxx
GOOGLE_API_KEY=xxx
IMAGE_MODEL_API_KEY=xxx
VIDEO_MODEL_API_KEY=xxx
個人開発ならまだ管理できますが、開発環境、検証環境、本番環境が分かれていたり、チームで共有したりすると、だんだん面倒になってきます。
API Keyの権限管理や漏洩リスクも気になります。
APIの形式がそれぞれ違う
各プロバイダーで、リクエストやレスポンスの形式も微妙に違います。
モデル名の指定方法、エラーの返し方、使用量の取得方法、ストリーミングの扱いなどが少しずつ違うため、何も考えずに実装すると、アプリケーション側のコードにプロバイダーごとの分岐が増えていきます。
if (provider === "openai") {
// OpenAI向けの処理
}
if (provider === "anthropic") {
// Anthropic向けの処理
}
if (provider === "google") {
// Google向けの処理
}
if (provider === "image") {
// 画像生成モデル向けの処理
}
最初はこれでも問題ないのですが、モデルが増えるほど保守しづらくなります。
コスト管理が難しくなる
AI機能で意外と難しいのがコスト管理です。
テキスト生成であれば入力・出力トークン、画像生成であれば生成枚数やサイズ、動画生成であれば秒数や品質など、モデルによって課金の考え方が違います。
もし自分のサービス内でユーザーごとの利用量を管理するなら、以下のような情報も必要になります。
- どのユーザーが
- どのモデルを
- どの用途で
- どのくらい使って
- どれくらいコストが発生したか
- 失敗したリクエストをどう扱うか
これは単なるAPI接続というより、小さな課金・利用量管理システムに近いです。
モデル比較に時間がかかる
プロトタイプ段階では、そもそも「どのモデルがこの機能に向いているのか」が分からないことが多いです。
同じプロンプトでも、モデルによって出力の雰囲気、安定性、速度、コストがかなり違います。
そのため、本当は複数モデルで比較したいのですが、毎回API Keyを用意して、ドキュメントを読んで、SDKを入れて、パラメータを調整するのは地味に手間です。
個人開発だと、この検証コストはけっこう大きいです。
自分ならAI Gatewayを1枚挟みたい
複数モデルを前提にするなら、アプリケーションから各プロバイダーを直接呼ぶより、間にAI Gatewayのような層を置きたくなります。
ざっくり書くと、こんなイメージです。
Product / App
↓
AI Gateway
↓
Model Router
↓
Provider Adapter
↓
OpenAI / Claude / Gemini / Image Models / Video Models
アプリケーション側は、できるだけ「どのプロバイダーを使っているか」を意識しないようにします。
たとえば、業務ロジック側では以下のように呼び出せると理想です。
const result = await ai.generate({
task: "summary",
prompt: userInput,
});
その裏側で、タスクの種類やユーザーのプラン、コスト、モデルの状態に応じて、どのモデルを使うかを決めます。
Model Registry
まず必要になりそうなのが、利用可能なモデルを管理するModel Registryです。
const models = [
{
id: "gpt-example",
provider: "openai",
type: "text",
tags: ["writing", "reasoning", "coding"],
costLevel: "high",
},
{
id: "claude-example",
provider: "anthropic",
type: "text",
tags: ["long-context", "coding"],
costLevel: "high",
},
{
id: "image-example",
provider: "image-provider",
type: "image",
tags: ["image-generation"],
costLevel: "medium",
},
];
モデルをコード内にベタ書きするのではなく、用途、種類、コスト感、利用可能状態などをまとめて管理しておくと、後から切り替えやすくなります。
Provider Adapter
次に、プロバイダーごとの違いを吸収するAdapter層です。
interface AIProvider {
chat(input: ChatInput): Promise<ChatOutput>;
generateImage?(input: ImageInput): Promise<ImageOutput>;
generateVideo?(input: VideoInput): Promise<VideoOutput>;
}
OpenAIでもAnthropicでもGoogleでも、アプリケーション側から見ると同じインターフェースで扱えるようにします。
これをやっておくと、後からモデルを追加したり、特定のモデルを別のものに置き換えたりしやすくなります。
Model Router
Model Routerでは、タスクに応じてモデルを選びます。
たとえば、かなり単純化すると以下のようなイメージです。
function selectModel(taskType: string) {
if (taskType === "code") return "coding-model";
if (taskType === "summary") return "long-context-model";
if (taskType === "cheap-batch") return "low-cost-model";
if (taskType === "image") return "image-model";
return "default-model";
}
実際には、ユーザーのプラン、残りクレジット、リクエストの重要度、現在のモデルの安定性なども考慮したくなるかもしれません。
Fallback
AI APIは外部サービスなので、失敗する前提で考えておいた方がよさそうです。
- タイムアウト
- レート制限
- 一時的な障害
- 残高不足
- レスポンス形式の揺れ
こういったケースに備えて、Fallbackの仕組みを持っておくと安心です。
primary model
↓ failed
secondary model
↓ failed
user-friendly error
ユーザー体験としては、多少モデルが変わるよりも、機能が完全に止まる方がつらいです。
もちろん、品質が大きく変わるタスクでは、勝手にモデルを切り替えるべきではない場合もあります。
このあたりは機能ごとに設計が必要です。
Usage Log / Credit
AI機能をユーザーに提供するなら、利用ログは最初から取っておいた方がよいと思います。
最低限、以下のような情報は残したくなります。
type UsageLog = {
userId: string;
modelId: string;
taskType: string;
inputTokens?: number;
outputTokens?: number;
creditsUsed?: number;
status: "success" | "failed";
errorMessage?: string;
createdAt: Date;
};
後から料金プランや利用制限を作ろうとすると、過去データがない状態では判断が難しくなります。
個人開発でも、AI機能をちゃんと運用するなら、ログ設計は早めに考えた方がよさそうです。
プロトタイプ段階では、集約サービスを使うのもあり
とはいえ、最初から自前でAI Gatewayを全部作るのは少し重いです。
特に個人開発やMVP段階では、まずは「そのAI機能が本当に使われるのか」を検証する方が大事です。
最近、自分も複数モデルをまとめて扱えるサービスをいくつか試しています。
たとえば、Crun のようなAIモデル集約サービスでは、ひとつの入口から複数のモデルを試せるため、プロトタイプ段階でモデルごとの向き・不向きを確認しやすいと感じました。
もちろん、最終的な本番構成として使うかどうかは、安定性、コスト、データの扱い、運用方針を見て判断する必要があります。
ただ、少なくとも初期検証では、
まず複数モデルを気軽に試して、良さそうな方向性を見つける
という使い方はかなり現実的だと思います。
どんなケースで役に立ちそうか
個人的には、以下のようなケースでは集約サービスを使う価値がありそうだと感じました。
個人開発のMVP
AIライティングツール、AI画像生成ツール、AI動画生成ツール、AIチャットボットなどを作る場合、最初からすべての公式APIを直接つなぐのは少し大変です。
まずは複数モデルを比較して、どのモデルが自分のユースケースに合うかを確認するだけでも十分価値があります。
チーム内での検証
エンジニアだけでなく、企画、デザイナー、マーケターもAIモデルを試したい場合、毎回API Keyや開発環境を用意するのは大変です。
共通の入口があると、非エンジニアも含めて検証しやすくなります。
モデル選定
同じプロンプトを複数モデルで試すと、出力の違いがかなり分かります。
- 文章が自然か
- コードが正確か
- 要約が読みやすいか
- 画像生成のスタイルが合うか
- コストに見合っているか
こういった比較は、実際に試してみないと分かりません。
注意したいこと
便利そうに見える一方で、注意点もあります。
本番利用時の安定性
プロトタイプで使いやすくても、本番サービスでそのまま使えるとは限りません。
レート制限、障害時の挙動、レスポンス速度、サポート体制などは確認した方がよさそうです。
コストの見え方
複数モデルを扱う場合、モデルごとの消費量や料金感が分かりやすいことはかなり重要です。
特に自分のサービス内でユーザーに課金する場合、コストが読めないと価格設計が難しくなります。
データの扱い
ユーザーの入力内容に個人情報や業務データが含まれる場合は、データの扱いに注意が必要です。
これは集約サービスに限らず、AI API全般で気をつけるべきポイントだと思います。
ベンダーロックイン
便利なサービスに寄せすぎると、後から移行しづらくなる可能性もあります。
そのため、アプリケーション側ではできるだけ抽象化しておき、必要になったら別のプロバイダーや公式APIに切り替えられるようにしておくのがよさそうです。
自分の中での結論
現時点では、以下のような進め方がバランスよさそうだと感じています。
1. 最初は軽く試す
MVPや検証段階では、集約サービスや既存ツールを使って、まず複数モデルの出力を比較します。
この段階では、完璧なアーキテクチャよりも、早く試すことを優先します。
2. 方向性が見えたら抽象化する
使うモデルや機能がある程度見えてきたら、アプリケーション内にAI GatewayやProvider Adapterのような層を作ります。
ビジネスロジックと特定プロバイダーを密結合にしないようにします。
3. 重要な部分だけ深く作る
高頻度で使う機能、コストが大きい機能、セキュリティが重要な機能は、必要に応じて公式APIを直接使ったり、自前の管理機能を作ったりします。
すべてを最初から作り込むのではなく、重要な部分から順番に深くするのがよさそうです。
まとめ
AI機能を作るとき、最初は「どのモデルを使うか」に目が行きがちです。
ただ、実際にプロダクトとして運用することを考えると、
- 複数モデルをどう管理するか
- 用途ごとにどう使い分けるか
- コストをどう把握するか
- 失敗時にどうFallbackするか
- 将来的にどう切り替えられるようにするか
といった設計の方が重要になってきます。
個人開発では、最初から大きなAI Gatewayを作る必要はないと思います。
一方で、最初から特定モデルにベタ依存しすぎると、後から変更しづらくなります。
なので、まずは集約サービスなどを使って軽く検証し、方向性が見えてきたら、自分のアプリケーション側で少しずつ抽象化していく。
今のところ、自分はこの進め方が一番現実的かなと思っています。
同じように個人開発でAI機能を入れようとしている方の参考になれば幸いです。