Intelligent Beans with Spring AI
このセッションではVMwareのMark Pollack氏がSpring AIについて紹介していました。
Spring AIは、AIを組み込んだアプリケーション開発を効率化することを目的として、Spring開発者向けに公開されたプロジェクトです。本プロジェクトはPythonプロジェクトであるLangChainやLlamaIndexから着想を得て2023年6月から開始され、OpenAIとAzure OpenAIをバックエンドに採用しています。
本セッションの冒頭では、ChatGPTの登場による現状のAIとの関わり方について、AIがデータサイエンス領域特有のものから、開発ツールの一つとして使用可能になりつつあると説明されました。その理由として、ChatGPTは事前トレーニングされた学習モデルを使用するため、データサイエンティストがデータを収集してモデルをトレーニングする手順が不要となることを挙げていました。
現状Spring AIで使用可能なAIモデルは、下の表の言語入力に対して言語出力を返すものに限定され、尚且つOpenAIまたはAzure OpenAIがサポートするものに限られると説明がありました。

Spring AIでのAIモデルの出力解析機能についても言及がありました。AIモデルの出力は一般的にString形式で返却されますが、アプリケーション内で使用するため、JSONなどの構造化形式の出力に変換する必要があります。出力解析機能を利用することで、AIモデルの出力をJSON形式などに変換、限定することを可能としています。
AIモデルの限界に関する話題では、トークン数制限と意図するデータがモデルに内包されない場合の対処方法をテーマとして挙げ、これに関して紹介されました。
-
Spring AIがサポートするOpenAIのモデルにはトークン数の制限が存在
- ChatGPT3の場合4Kが上限
- ChatGPT4の場合8Kから16Kが上限
-
データがモデルに内包されてない場合への対処方法は2種類存在
- 現実的ではないがAIモデルの重みを変更する方法
- モデルが持つプロンプト内に意図したデータを埋め込む方法
モデルが持つプロンプト内に意図したデータを埋め込むために、Spring AIではベクターデータベースを採用しています。テキスト形式のデータをベクターデータベースに格納するために前処理としてデータを分割し、ベクトル形式へ変換します(embedding)。ここでEmbeddings APIを利用し、モデルに内包されないデータを外部から埋め込むことを可能としています。

最後にSpring AIの今後の展望について、現状プロジェクトへ多額の投資が行われており、間もなく実際の現場で使用に値するレベルに到達するだろうと述べ、本セッションの説明は締めくくられました。
Spring Modulith – Spring for the Architecturally Curious Developer
本セッションでは、10数年Springの開発に携わっているOliver Drotbohm氏が、2023年8月に1.0GAがリリースされたSpring Modulithについて紹介されました。
Spring Modulithのモチベーションは、より構造化され、保守が容易な、modularizeされたアプリケーションアーキテクチャの提供です。セッション内で、modularizeの良し悪しをコードベース視点で可視化しています(下図)。図内でABCが機能単位のモジュール、数字が振られた丸はクラスなどのコード単位の要素を表現しています。図右側のアーキテクチャの方が、モジュール間の依存関係が少なく保守しやすいと評価できます。

従来のSpringでは、Spring Frameworkが提供するステレオタイプアノテーション(@Controller、@Service、@Repository等)などによってレイヤ単位のモジュール化へ誘導してきました。Spring ModulithではSpring Bootアプリケーションのドメイン単位でのモジュール化にフォーカスしています。Spring Modulithはディレクトリ構造を含むコードベースにより表現する方法と、自動テスト・自動ドキュメント生成といったアプリケーション構築のサポートを提供します。
セッションでは上記Spring Modulithが提供するコードベース構造、サポート機能についてデモを通して解説されました。
まず解説されたのはSpring Modulithが提供するモジュール間の依存関係です。下図はSpring Modulithのモジュール間の依存関係定義の一例です。
MyProject └─ src/main/java ├─acme.myproject (1) Main Application | └─ Application.java ├─acme.myproject.inventory (2) Module 1 ├─acme.myproject.customer (3) Module 2 ├─acme.myproject.order (4) Module 3 └─acme.myproject.order.internal (5) sub-module of order
@org.springframework.modulith.ApplicationModule( allowedDependencies = "acme.order" ) package acme.inventory;
上例では、inventoryからorderを参照するという明示的な依存関係が設定されています。さらに、サブモジュールorder.internalは上位モジュールorderからしか参照できないという暗黙的な依存関係が定義されています。
Spring Modulithは上記のようなコードベースに対して、さまざまなサポート機能を提供しています。例えば、以下のような機能がデモでは示されました。
- モジュール間の依存関係のルールに違反があるか否かをSpring Modulithが提供するAPIで自動検証
- モジュール単位でのテストの実行サポート
- アプリケーションイベント導入によるモジュール間の疎結合化
- モジュール間の依存関係図などを出力してくれるAPIを用いたドキュメント作成支援
セッション終盤のまとめにおいて、Spring Modulith 1.0GAがセッション当日にリリースされたこと、Spring Modulith 1.1がSpring Boot 3.2に合わせてリリースされることが告知されました。
以上が Spring Modulith のセッションの解説となります。Oliver Drotbohm 氏のGithubリポジトリにセッションで利用されたサンプルデモコードもあるので、興味を持った方は見てみてはいかがでしょう。
おわりに
以上、SpringOne at VMware Exploreのハイライトでした。Spring節目の年での久々のオフライン開催であり、さらに VMware Explorerとの同時開催ということもあってか、今までの歴史を振り返ったり、業界内の課題に対する取り組みのセッションがあったり、幅広いトピックに触れられていたのが印象的でした。
各セッションの動画は、VMware Explore Video Libraryにて公開されています。なお、視聴にはアカウント登録が必要です。本稿で興味を持ったセッションがあれば動画もチェックしてみてください。
