生成AIを外部データソースとして扱う設計:プロンプト管理をModel層で行うメリット
作成日:2025.11.13
生成AIを「外部データソース」と見なし、プロンプトの設計・管理をMVCのModel層に集約する設計手法を考えます。責務分離、テスト容易性、プロンプトインジェクション対策、そして将来的なAPI切替や複数モデル対応を見据えた実装上の注意点を示します。
はじめに
Webアプリケーション内部で生成AIを呼び出すようなシステムを構築する際に、生成AIに送信するプロンプトは、MVC(Model-View-Controller)アーキテクチャの、どの層で管理すべきか、という問題があります。
しばしば、プロンプトを Controler層に書いているケースを見かけますが、個人的には Model層で管理するのが適切だと考えています。
この記事では、何故 Model層でプロンプトを管理すべきか、その理由を説明していこうと思います。
Model層の役割を考える
MVCアーキテクチャにおける Model層は、アプリケーションのデータ構造やビジネスロジックを担当します。
最も基本的な役割は、データの保存、取得、操作を行なうことです。具体的には、データベースとのやり取りや、データの整形、検証などが含まれます。
データベースへのインプットと、データベースからのアウトプットが処理の中心となるアプリケーションにおいては、「Model層はデータベースとやり取りを行なう部分である」という理解はほぼ正しいと思います。
では、外部サービスに対して API を利用してデータのインプット/アウトプットを行なう場合はどうでしょうか?
データのやり取りの対象が、自前のデータベースであろうと、外部サービスであろうと、基本的な役割は同じです。データの保存、取得、操作を行なうことに変わりはありません。
したがって、外部サービスとのデータのやり取りを行なう処理も、Model層で管理するのが適切だと言えます。
Controllerはユーザー入力を受け取り、必要なModelを呼び出す。ViewはModelから受け取ったデータを表示する。これがMVCの基本的な流れであり、Modelが扱うデータソースがどこに由来するかは、本質ではありません。
生成AIを外部データソースとして扱う
生成AIは、外部のデータソースとして機能します。生成AIに対してプロンプトを送信し、生成されたコンテンツを受け取ることは、外部サービスとのデータのやり取りに他なりません。
生成AIを外部データソースと捉える場合、生成AIに渡すプロンプトとは、データベースとのやり取りにおける「SQLクエリ」に相当します。SQLクエリがデータベースに対してデータの取得や操作を指示するのと同様に、プロンプトは生成AIに対してコンテンツの生成を指示するもの、というわけです。
この対比は、「SQLクエリに悪意のあるコードを含める攻撃」のことをSQLインジェクションと呼ぶのに対し、「生成AIに渡すプロンプトに悪意のあるテキストを含める攻撃」のことをプロンプトインジェクションと呼ぶことを考えれば、ピンとくるのではないでしょうか。
プロンプトとSQLクエリが同列であると理解すれば、プロンプトをModel層で管理することには何の違和感もないでしょう。
生成AIを扱うアプリケーションでは、Modelの役割として、以下のような処理が考えられます。
- プロンプトインジェクション対策
- ユーザーからの入力を適切にサニタイズし、プロンプトインジェクション攻撃を防止する。
- プロンプト生成
- ユーザーからの入力やアプリケーションの状態に基づいて、適切なプロンプトを生成する。
- APIリクエストの送信
- 生成したプロンプトを用いて、生成AIのAPIにリクエストを送信する。
- レスポンスの処理
- 受け取った生成AIからのレスポンスを解析し、必要に応じてデータを整形・保存する。
- エラーハンドリング
- APIリクエストが失敗した場合のエラーハンドリングを行う。
このアプローチの利点
生成AIに関するロジックをModel層に集中させることで、以下のような利点があります。
- Controller のシンプル化
- Controllerはユーザー入力の受け取りとModelの呼び出しに専念でき、コードの可読性と保守性が向上する。
- 責務の一貫性
- Model層がデータのやり取りを一手に引き受けることで、責務が明確になり、コードの理解が容易になる。
- テストの容易さ
- 生成AIに関するロジックがModelに集約されるため、ユニットテストが容易になる。
- 拡張性の向上
- 将来的に生成AIのAPIが変更された場合や、複数の生成AIサービスを利用する場合でも、Model層のみを修正すればよく、他の層への影響を最小限に抑えられる。
まとめ
MVCアーキテクチャの本質は「責務の分離」であり、Model層の役割は「データベースとのやり取り」だけに限定されるものではありません。
生成AIを外部データソースとして捉え、そのプロンプト管理をModel層で行うことは、アーキテクチャの原則に沿った合理的なアプローチだと考えます。
プロンプトは、「生成AIに対するSQLクエリ」である、という視点を持つことで、より適切な設計が可能になるでしょう。
データベースも生成AIも、アプリケーションにとって重要なデータソースであり、そのやり取りを担うModel層で同列に一元管理することが、拡張性の高いシステム構築の鍵となると思います。
奈良市を拠点に、26年以上の経験を持つフリーランスWebエンジニア、阿部辰也です。
これまで、ECサイトのバックエンド開発や業務効率化システム、公共施設の予約システムなど、多彩なプロジェクトを手がけ、企業様や制作会社様のパートナーとして信頼を築いてまいりました。
【制作会社・企業様向けサポート】
Webシステムの開発やサイト改善でお困りの際は、どうぞお気軽にご相談ください。小さな疑問から大規模プロジェクトまで、最適なご提案を心を込めてさせていただきます。
ぜひ、プロフィールやWeb制作会社様向け業務案内、一般企業様向け業務案内もご覧くださいね。