技術資料

生成AIを外部データソースとして扱う設計:プロンプト管理をModel層で行うメリット

作成日:2025.11.13

MVC

生成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制作会社様向け業務案内一般企業様向け業務案内もご覧くださいね。

阿部辰也へのお仕事の依頼・お問い合わせ

軽いご相談もお気軽にどうぞ!

個人情報の取り扱いについて *必須 プライバシーポリシーをご確認いただき、同意いただける場合は「同意する」にチェックをしてください。

keyboard_double_arrow_up
TOP