正式リリースされたSpring AIを導入し、簡単なLLM操作アプリをJavaで作成してみようSpring AIで始める生成AIプログラミング(1)

Java×Spring AIで始めるAIプログラミングの入門連載。初回である今回は、Spring AIの概要とOpenAIを使って簡単なプログラムを実行するまでを紹介します。

» 2025年05月29日 05時00分 公開

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「Spring AIで始める生成AIプログラミング」のインデックス

連載:Spring AIで始める生成AIプログラミング

本連載のサンプルコードをGitHubで公開しています。こちらからダウンロードしてみてください。


本連載の目的

 生成AI(人工知能)は、社会のあらゆる場面で活用が見込まれる将来有望な分野です。これまで十分に活用されていなかった専門知識やノウハウを、生成AIを用いて既存のサービスやシステムに組み込もうとする動きが急速に進んでいます。今後、基幹システムや業務システムなど既存のシステムに生成AIの機能を組み込んだり、生成AIの存在を前提としたシステム開発を推進したりすることは、不可欠になるでしょう。

 そこで本連載では、多くの開発現場で用いられるJavaとSpring Frameworkを対象に、「Spring AI」を活用してAI機能を実装する「生成AIプログラミング」に焦点を当て、ニーズが高まるAI機能をシステムに組み込んでいくための基本的な手法を紹介します。

Spring AIとは

 Javaを使ってシステム開発をしている人であれば、Springという名前を聞いたことがあるでしょう。Javaで人気のフレームワークで、主に企業向けアプリケーションの開発に利用されます。

 Spring AIは、そのSpringプロジェクトにおけるサブプロジェクトの一つであり、2025年5月20日に正式リリースされました。Spring AIは、以下のような機能を備えています(図1)。

  • Spring FrameworkやSpring Bootなどと組み合わせることで、AI機能を容易に導入、あるいは組み込むことが可能
  • プロンプトテンプレートやAIチャットシステムで利用しやすいように、さまざまな機能(テキストだけでなく画像や音声の利用、構造化出力、履歴管理など)を提供
  • OpenAI、Azure、Google Gemini、Amazon BedrockなどのAIプロバイダーに依存しないインタフェースを提供し、特定のベンダーに依存しないシステム開発が可能
  • AIシステムと外部システムやデータと連携させるためのフレームワークとしての機能(RAG〈Retrieval-Augmented Generation〉、MCP〈Model Context Protocol〉など)を提供
図1 AIシステム全体でのSpring AIでカバーする領域 図1 AIシステム全体でのSpring AIでカバーする領域

 似たような仕組みは他の言語などにも存在し、PythonであればLangChainなどがよく知られています。Spring AIはそれらを参考にしている側面もあり、機能的にも類似する点があります。よって、LangChainなどでAIアプリケーションを開発した経験があれば、その知識を活用できるでしょう。

Spring AIを導入する

 Spring AIを導入するには、Spring Bootを利用するのが最も簡単です。Spring Bootの自動構成機能により、必要な設定が自動的に準備されるため、導入のハードルが大幅に下がります(もちろん、これらの初期設定は後から変更できます)。

1. Spring Boot InitializrでSpring AIプロジェクトを始める

 Spring Boot Initializrを使ってSpringプロジェクトのひな型を作成する方法はいろいろありますが、今回はSpringのWebサイトを使った方法を紹介します。サイトにアクセスすると、図2のような画面が表示されます。

図2 Spring Boot Initializrの初期画面 図2 Spring Boot Initializrの初期画面

 ここで、(1)はプロジェクトの管理形式を指定します。本連載では、最近利用が増えている「Gradle - Kotlin」形式で説明しますが、読者が慣れているプロジェクト形式があれば、そちらを指定してください。

 続いて(2)で、プロジェクトのメタデータである、プロジェクト名やパッケージ名などを指定します。そして、(3)で依存関係(Dependencies)を追加します。

 [ADD...]ボタンを押すと、依存関係の一覧が表示されます。上のボックスから「AI」というキーワードを入力すると、図3のようにさまざまなAI関連プロジェクトが見つかります。

図3 さまざまなAIプロジェクト 図3 さまざまなAIプロジェクト

 Spring AIのプロジェクトは、利用するAIベンダーと利用する機能の組み合わせです。そのため、実際に利用するAIベンダーや機能に応じて適切なプロジェクトを選択します。今回はOpenAIを利用するので、図4のような設定でプロジェクトを作成します。

図4 サンプルソース用のプロジェクト作成時の設定 図4 サンプルソース用のプロジェクト作成時の設定

 ここで指定している依存プロジェクトは以下の通りです。

  • OpenAI:Spring AIでのOpenAI連携用プロジェクト
  • Spring Reactive Web:Webシステム開発用プロジェクト
  • Spring Shell:インタラクティブなシェルインタフェース開発用プロジェクト

2. 作成されたプロジェクトファイル内容を確認する

 作成されたプロジェクトは、zipファイルで提供されます。ダウンロードしたzipファイルを解凍すると、図5のようにフォルダ、ファイルが確認できます。

図5 作成されたフォルダ、ファイルツリー構造 図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 Spring AIを利用するためのbuildファイル(build.gradle.ktsの抜粋)

 (1)は、SpringBootのバージョンです。Spring Bootは、本稿執筆時点で3.5系のリリースが準備されていますが、Spring AIも3.5系で利用可能です。

 (2)は、Spring AIのバージョンの指定です。

 (3)は、Webフレームワークの指定です。Spring AIは、以下のいずれかが必要となります。

  • Spring Web:サーブレットなどを利用する従来型のWebシステム
  • Spring Reactive Web:Spring WebFluxを利用するNon-BlockingタイプのWebシステム

 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のようにプロジェクト名が分かります。

図6 レファレンス(Azure OpenAIの設定の記載場所) 図6 レファレンス(Azure OpenAIの設定の記載場所)

 そして、以下のように依存するプロジェクトを書き換えます。

implementation("org.springframework.ai:spring-ai-starter-model-openai")
↓
implementation("org.springframework.ai:spring-ai-starter-model-azure-openai")

簡単なAIアプリケーションを作る

 Spring Shellを使って、AI機能を確認するためのコマンドを作成していきましょう。

1. Spring Shellが起動するように設定する

 初期設定のままでは、Webアプリケーションとして起動してしまうため、リスト2のように設定ファイルを変更します。

spring.main.web-application-type=none	(1)
spring.shell.interactive.enabled=true	(2)
リスト2 Spring AIを利用するためのbuildファイル(src/main/resources/application.propertiesの抜粋)

 (1)は、WebFluxがWebサーバとして起動しないようにするための設定です。そして(2)が、Spring Shellをインタラクティブモードとして起動させるための設定です。

2. 簡単なコマンドを作成する

 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";
    }
}
リスト3 Spring AIを利用するためのbuildファイル(src/main/jp/enbind/spring_ai/part1/command/SampleCommand.java)

 (1)は、このクラスをSpring Shellでのコマンドとして認識するためのアノテーションです。また、(2)のようにコマンド名をkey属性で定義しておきます(ここではhello)。

3. 作成したコマンドの実行結果を確認する

 これらを、リスト4のようにビルドして実行します。

$ ./gradlew build
$ java -jar build/libs/part1-0.0.1-SNAPSHOT.jar
リスト4 ビルドと実行(macOSもしくはLinux環境の場合)

 シェルモードでは「shell:>」と表示され、コマンドを受け付けるモードになります。ここで、先ほど作成したhelloコマンドを実行するために「hello」と入力します。

shell:>hello
hello world
shell:>exit
リスト5 インタラクティブなコマンドモード

 リスト5のような結果が得られれば、Spring Shellは正しく動作しています。

4. 生成AIからの結果を取得するコマンドクラスを作成する

 ここからが、本題である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;
    }
}
リスト6 Spring AIでの簡単なサンプルプログラム例(src/main/jp/enbind/spring_ai/part1/command/ChatCommand.javaの抜粋)

 (1)で、Spring Contextを取得します。Spring AIで利用する各インスタンスは、このSpring Contextを通じて取得できるので、あらかじめプライベートフィールドとして準備しておきましょう。

 続いて、(2)で文字列を引数に設定するコマンドを作成し、(3)(4)でAIチャットのためのインスタンスを取得します。これらのコードはOpenAIに依存していません。そのため、OpenAIからAmazon Web Services(AWS)の「Amazon Bedrock」やGoogle Geminiに変更しても、そのまま実行が可能です。詳しくは次回に説明します。

 そして、(5)でAIにリクエストを投げ、その結果を取得します。

5. OpenAIでのAPIキー取得と初期設定を実行する

 OpenAIのAPIキーを発行するには、OpenAI Platformからログインし、任意のプロジェクトを作成します。あとは、API Keysから[+Create new secret key]ボタンをクリックすることで、APIキーを作成できます(図7)。

図7 OpenAIプラットフォームの管理画面 図7 OpenAIプラットフォームの管理画面

 作成したAPIキーは、リスト7のようにSpring Bootの設定ファイルに記述します。これで、実行に必要な最低限の設定は完了です。

spring.ai.openai.api-key = sk-....(省略)...SMA
リスト7 OpenAIを利用する場合の設定例(src/main/resources/application.propertiesの抜粋)

 OpenAIは設定も非常に簡単であり、素早く簡単に始められます。なお、OpenAIではデフォルトのLLM(大規模言語モデル)として、gpt-4o-miniを利用します。これを変更するには、リスト8のようにspring.ai.openai.chat.options.modelの設定を追加してください。

spring.ai.openai.chat.options.model = gpt-3.5-turbo
リスト8 デフォルト(gpt-4o-mini)からgpt-3.5-turboに変更する場合の設定例

 このような設定は、AIベンダーごとに異なります。詳しくは利用するAIベンダーのドキュメントを参照してください。

6. AIプログラムを実行する

 3. と同じ手順で実行すると、コマンドラインモードになります。作成したchat-promptコマンドを実行すると、リスト9のような結果になります。

shell:>chat-prompt 2025年に行われる大阪万博の前の万博はいつ、どこで行われましたか
2025年の大阪万博の前に行われた万博は、2020年に開催予定だった「ドバイ万博」です。ドバイ万博は2020年10月1日から2021年3月31日までの期間に開催されました。…(省略)
リスト9 chat-promptコマンドの実行結果

 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.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。