Java×Spring AIで始めるAIプログラミングの入門連載。初回である今回は、Spring AIの概要とOpenAIを使って簡単なプログラムを実行するまでを紹介します。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
本連載のサンプルコードをGitHubで公開しています。こちらからダウンロードしてみてください。
生成AI(人工知能)は、社会のあらゆる場面で活用が見込まれる将来有望な分野です。これまで十分に活用されていなかった専門知識やノウハウを、生成AIを用いて既存のサービスやシステムに組み込もうとする動きが急速に進んでいます。今後、基幹システムや業務システムなど既存のシステムに生成AIの機能を組み込んだり、生成AIの存在を前提としたシステム開発を推進したりすることは、不可欠になるでしょう。
そこで本連載では、多くの開発現場で用いられるJavaとSpring Frameworkを対象に、「Spring AI」を活用してAI機能を実装する「生成AIプログラミング」に焦点を当て、ニーズが高まるAI機能をシステムに組み込んでいくための基本的な手法を紹介します。
Javaを使ってシステム開発をしている人であれば、Springという名前を聞いたことがあるでしょう。Javaで人気のフレームワークで、主に企業向けアプリケーションの開発に利用されます。
Spring AIは、そのSpringプロジェクトにおけるサブプロジェクトの一つであり、2025年5月20日に正式リリースされました。Spring AIは、以下のような機能を備えています(図1)。
似たような仕組みは他の言語などにも存在し、PythonであればLangChainなどがよく知られています。Spring AIはそれらを参考にしている側面もあり、機能的にも類似する点があります。よって、LangChainなどでAIアプリケーションを開発した経験があれば、その知識を活用できるでしょう。
Spring AIを導入するには、Spring Bootを利用するのが最も簡単です。Spring Bootの自動構成機能により、必要な設定が自動的に準備されるため、導入のハードルが大幅に下がります(もちろん、これらの初期設定は後から変更できます)。
Spring Boot Initializrを使ってSpringプロジェクトのひな型を作成する方法はいろいろありますが、今回はSpringのWebサイトを使った方法を紹介します。サイトにアクセスすると、図2のような画面が表示されます。
ここで、(1)はプロジェクトの管理形式を指定します。本連載では、最近利用が増えている「Gradle - Kotlin」形式で説明しますが、読者が慣れているプロジェクト形式があれば、そちらを指定してください。
続いて(2)で、プロジェクトのメタデータである、プロジェクト名やパッケージ名などを指定します。そして、(3)で依存関係(Dependencies)を追加します。
[ADD...]ボタンを押すと、依存関係の一覧が表示されます。上のボックスから「AI」というキーワードを入力すると、図3のようにさまざまなAI関連プロジェクトが見つかります。
Spring AIのプロジェクトは、利用するAIベンダーと利用する機能の組み合わせです。そのため、実際に利用するAIベンダーや機能に応じて適切なプロジェクトを選択します。今回はOpenAIを利用するので、図4のような設定でプロジェクトを作成します。
ここで指定している依存プロジェクトは以下の通りです。
作成されたプロジェクトは、zipファイルで提供されます。ダウンロードしたzipファイルを解凍すると、図5のようにフォルダ、ファイルが確認できます。
リスト1は、作成されたbuildファイルの内容です。
plugins { java // (1) Spring Bootのバージョン id("org.springframework.boot") version "3.4.5" id("io.spring.dependency-management") version "1.1.7" } // (省略) repositories { mavenCentral() } // (2) Spring AIのバージョン extra["springAiVersion"] = "1.0.0" dependencies { // (3) Webフレームワーク implementation("org.springframework.boot:spring-boot-starter-webflux") // (3) OpenAIを使う場合 implementation("org.springframework.ai:spring-ai-starter-model-openai") // (4) implementation("org.springframework.shell:spring-shell-starter") // (省略) } dependencyManagement { imports { // (5) Spring AI共通の設定 mavenBom("org.springframework.ai:spring-ai-bom:${property("springAiVersion")}") } }
(1)は、SpringBootのバージョンです。Spring Bootは、本稿執筆時点で3.5系のリリースが準備されていますが、Spring AIも3.5系で利用可能です。
(2)は、Spring AIのバージョンの指定です。
(3)は、Webフレームワークの指定です。Spring AIは、以下のいずれかが必要となります。
AIアプリケーションは時間がかかる処理が多くなりがちで、処理が終わるまで他の作業ができないなど、ユーザーを長時間待たせたり、多くのアクセスに対応できなくなったりすることがあります。そこで、ノンブロッキング/非同期処理に対応しており、処理状態の通知も実装しやすいSpring WebFluxを選択しています。もちろん、既存のJavaシステムがSpring Webを使っている場合には、そちらでも問題ありません。また、これはSpring AIをWebアプリケーション上で動かさなければいけないという意味ではありません。
(4)は、Spring Shellを利用する指定です。実際の利用シーンではWebアプリケーションとして作成することが多いと思いますが、コマンドの方がSpring AIの機能を簡単に確認、紹介できるため、Spring AIの各機能を紹介する本連載前半ではこのSpring Shellを使って機能を紹介します。
最後に(5)は、Spring AIの共通部分についての指定です。
ここで紹介したAIベンダー以外を使用する場合の設定方法は、Spring AIのドキュメントを参照してください。例えばMicrosoftの「Azure OpenAI Service」を利用する場合には、AI Models > Chat ModelsからAzure OpenAIを参照すれば、図6のようにプロジェクト名が分かります。
そして、以下のように依存するプロジェクトを書き換えます。
implementation("org.springframework.ai:spring-ai-starter-model-openai") ↓ implementation("org.springframework.ai:spring-ai-starter-model-azure-openai")
Spring Shellを使って、AI機能を確認するためのコマンドを作成していきましょう。
初期設定のままでは、Webアプリケーションとして起動してしまうため、リスト2のように設定ファイルを変更します。
spring.main.web-application-type=none (1) spring.shell.interactive.enabled=true (2)
(1)は、WebFluxがWebサーバとして起動しないようにするための設定です。そして(2)が、Spring Shellをインタラクティブモードとして起動させるための設定です。
Spring Shellでの簡単な動作の仕組みを確認する目的もかねて、簡単なコマンドクラスを作成してみましょう(リスト3)。
package jp.enbind.spring_ai.part1.command; import org.springframework.shell.standard.ShellComponent; import org.springframework.shell.standard.ShellMethod; @ShellComponent // (1) public class SampleCommand { @ShellMethod(key = "hello") // (2) String hello(){ return "hello world"; } }
(1)は、このクラスをSpring Shellでのコマンドとして認識するためのアノテーションです。また、(2)のようにコマンド名をkey属性で定義しておきます(ここではhello)。
これらを、リスト4のようにビルドして実行します。
$ ./gradlew build $ java -jar build/libs/part1-0.0.1-SNAPSHOT.jar
シェルモードでは「shell:>」と表示され、コマンドを受け付けるモードになります。ここで、先ほど作成したhelloコマンドを実行するために「hello」と入力します。
shell:>hello hello world shell:>exit
リスト5のような結果が得られれば、Spring Shellは正しく動作しています。
ここからが、本題であるSpring AIを使うコマンドの例です。今回作成するコマンドは、指定した質問(入力テキスト)に対して、生成AIからの回答を表示するという簡単なものです。
@ShellComponent public class ChatCommand { private ApplicationContext context; // (1) Spring Contextの設定 public ChatCommand(ApplicationContext context) { this.context = context; } @ShellMethod( key = "chat-prompt") // (2) コマンドの作成 public String prompt(String message){ // (3) チャットモデルの取得 ChatModel model = this.context.getBean(ChatModel.class); // (4) チャットクライアントの作成 ChatClient client = ChatClient.create(model); // (5) プロンプトの実行結果の取得 String response = client.prompt(message).call().content(); return response; } }
(1)で、Spring Contextを取得します。Spring AIで利用する各インスタンスは、このSpring Contextを通じて取得できるので、あらかじめプライベートフィールドとして準備しておきましょう。
続いて、(2)で文字列を引数に設定するコマンドを作成し、(3)(4)でAIチャットのためのインスタンスを取得します。これらのコードはOpenAIに依存していません。そのため、OpenAIからAmazon Web Services(AWS)の「Amazon Bedrock」やGoogle Geminiに変更しても、そのまま実行が可能です。詳しくは次回に説明します。
そして、(5)でAIにリクエストを投げ、その結果を取得します。
OpenAIのAPIキーを発行するには、OpenAI Platformからログインし、任意のプロジェクトを作成します。あとは、API Keysから[+Create new secret key]ボタンをクリックすることで、APIキーを作成できます(図7)。
作成したAPIキーは、リスト7のようにSpring Bootの設定ファイルに記述します。これで、実行に必要な最低限の設定は完了です。
spring.ai.openai.api-key = sk-....(省略)...SMA
OpenAIは設定も非常に簡単であり、素早く簡単に始められます。なお、OpenAIではデフォルトのLLM(大規模言語モデル)として、gpt-4o-miniを利用します。これを変更するには、リスト8のようにspring.ai.openai.chat.options.modelの設定を追加してください。
spring.ai.openai.chat.options.model = gpt-3.5-turbo
このような設定は、AIベンダーごとに異なります。詳しくは利用するAIベンダーのドキュメントを参照してください。
3. と同じ手順で実行すると、コマンドラインモードになります。作成したchat-promptコマンドを実行すると、リスト9のような結果になります。
shell:>chat-prompt 2025年に行われる大阪万博の前の万博はいつ、どこで行われましたか 2025年の大阪万博の前に行われた万博は、2020年に開催予定だった「ドバイ万博」です。ドバイ万博は2020年10月1日から2021年3月31日までの期間に開催されました。…(省略)
APIキーが設定されていないか、間違っている場合にはエラーが出力されます。例えば、OpenAIにおいてAPIキーを設定せず実行すると、リスト10のようなエラーが発生します。
Use the connection property: spring.ai.openai.api-key or spring.ai.openai.speech.api-key property.
このエラーを見ると、spring.ai.openai.api-keyという設定がない、もしくは正しくないということが分かります。これは比較的分かりやすいエラーですが、ベンダーによってはエラーメッセージが分かりにくいこともあります。そもそも発生したエラーの原因がプログラム側の設定だけでなく、ベンダー側との契約や設定による場合もあるので、注意してください。
前述したOpenAIも同様ですが、それぞれの導入はレファレンスを参照しながら進めることになります。例えばGoogle Geminiを利用するのであれば、VertexAI Gemini Chatのレファレンスを参照してください。
今回は、Spring AIの導入について紹介しました。実際に試してみると、ごく簡単にAIプログラミングを始められることが分かるでしょう。Spring AIを利用すれば、プログラムをほとんど変更することなく、さまざまなAIベンダーやLLMモデルの結果を比較できます。開発初期にありがちなベンダーやLLMの最適解が分からない、といった疑問の解決に役立つはずです。
次回からは、実際にSpring AIを使ったプログラミングの詳細を紹介していきます。
WINGSプロジェクト
有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティー(代表山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手掛ける。2021年10月時点での登録メンバーは55人で、現在も執筆メンバーを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。
・サーバーサイド技術の学び舎 - WINGS(https://wings.msn.to/)
・RSS(https://wings.msn.to/contents/rss.php)
・X: @WingsPro_info(https://x.com/WingsPro_info)
・Facebook(https://www.facebook.com/WINGSProject)
Copyright © ITmedia, Inc. All Rights Reserved.