👋

Spring AIの紹介

に公開

Spring AIの紹介

Spring AIは、Spring Frameworkを使って、OpenAI(ChatGPT)やGeminiなどのAIサービスと連携するためのライブラリです。
Spring Frameworkの機能を利用しながら、AIサービスを利用するプログラムを開発することができます。
2025年3月時点でまだ開発中の段階ですが、SpringBootアプリケーションに構成することができます。

今回は以下の開発環境をもとに、Spring AIを使ってOpen AIのチャットを利用するプログラムの基本的な実装方法を紹介していきます。

  • Java 21
  • Gradle Groovy
  • SpringBoot 3.4.3
  • Spring AI 1.0.0 M6

Spring AIはまだ開発中のため、APIの仕様が変更されるかもしれませんのでご注意ください。

SpringBootアプリケーションの作成

SpringBootでWebサービスを実行するためのプロジェクトを作成します。
Spring Initializrを利用すると、ソースコードのスケルトンを簡単に作成できます。

Spring Initializrで以下の値で設定し、プロジェクトを作成します。

  • Project: Gradle Groovy
  • Language: Java
  • Spring Boot: 3.4.3
  • Project Metadata
    • Group: com.example
    • Artifact: spring-openai-demo
    • Name: spring-openai-demo
    • Description: Demo project for Spring AI
    • Package name: com.example.demo
  • Packaging: Jar
  • Java: 21
  • Dependencies:
    • Spring Web
    • OpenAI
    • Spring Boot DevTools (LiveReload機能を提供する開発ツールを利用したい場合に追加)

Spring Initlizr

SpringBootの機能を構成する際にポイントになるのは、「OpenAI」を依存関係(dependencies)に設定することです。
スケルトンで作成したbuild.gradleの完全なコードはこのようになります。

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.4.3'
    id 'io.spring.dependency-management' version '1.1.7'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(21)
    }
}

repositories {
    mavenCentral()
}

ext {
    set('springAiVersion', "1.0.0-M6")
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.ai:spring-ai-openai-spring-boot-starter' // OpenAIと連携するためのライブラリー
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.ai:spring-ai-bom:${springAiVersion}"
    }
}

tasks.named('test') {
    useJUnitPlatform()
}

次に src/resources/application.properties に「OpenAIのAPIキー」と「チャットのモデル」を設定します。

「OpenAIのAPIキー」はOpenAIの公式サイトより取得します。APIキーを取得する流れについては割愛します。
OpenAIで利用可能な「チャットのモデル」は、OpenAI APIの公式サイトに載っています。
ここではgpt-4o-miniを使用してみます。

OpenAI Models

application.properties の設定内容は以下のようになります。

spring.application.name=spring-openai-demo

spring.ai.openai.api-key=<OpenAIのAPIキーをここに入力>
spring.ai.openai.chat.options.model=gpt-4o-mini

データを格納するクラスの作成

リクエストとレスポンスのデータを格納するクラスを作成します。
送信と返答のデータはテキスト文字列になりますので、リクエストとレスポンスそれぞれString型のプロパティを持つクラスを実装します。

  1. チャットに送信するメッセージを格納するChatRequestクラス
public record ChatRequest(String message) {
}
  1. チャットからの返答を格納するChatResponseクラス
public record CharResponse(String result) {
}

チャットを呼び出すサービスの作成

@Serviceアノテーションを付与したサービスChatServiceクラスを作成します。

@Service
public class ChatService {
}

Spring AIには、org.springframework.ai.chat.client.ChatClient.Builderと呼ばれるAIサービスのチャットと連携するためのインタフェースが用意されています。
このインタフェースの型でサービスクラスのメンバーに@Autowiredを付与して定義することにより、OpenAIと連携するサービスプロバイダーのオブジェクトがSpring Frameworkによって依存性注入されるようになります。

@Service
public class ChatService {

    @Autowired
    private ChatClient.Builder chatClientBuilder;
}

ChatServiceクラスに、チャットとやり取りするcallメソッドを実装します。
チャットに送信するメッセージのテキストをChatRequest型の引数として受け取り、チャットからの返答をChatResponseオブジェクトとして返します。

  1. chatClientBuilder.build()を呼び出してChatClientのインスタンスを取得します。
  2. ChatClientのインスタンスに対してprompt().user("<メッセージの文字列>").call()を呼び出し、チャットにメッセージを送信します。送信結果はChatClient.ClientReponseSpecオブジェクトで返されます。
  3. チャットからの返答テキストをChatClient.ClientReponseSpec#content()メソッドで取得します。

この処理を実装したものが以下のコードになります。

@Service
public class ChatService {

    @Autowired
    private ChatClient.Builder chatClientBuilder;

    public ChatResponse call(ChatRequest chatRequest) {
        ChatClient chatClient = chatClientBuilder.build();
        ChatClient.ClientReponseSpec response = chatClient.prompt().user(chatRequest.message()).call();
        return new ChatResponse(response.content());
    }
}

REST APIの作成

最後に、OpenAIのチャットをWebサービスで呼び出すためのREST APIを作成します。
チャットに送信する文字列をPOSTリクエストで受け取るコントローラーを実装します。

@RestController
public class ChatController {

    @Autowired
    private ChatService chatService;

    @PostMapping
    public ChatResponse chat(@RequestBody ChatRequest chatRequest) {
        return chatService.call(chatRequest);
    }
}

アプリケーションの起動と動作確認

コマンドラインで以下のコマンドを実行します。

./gradlew bootRun

Intellij IDEAやEclipseなどのIDE(統合開発環境)からでもアプリケーションを起動することもできます。

(例) Intellij IDEAからSpringBootアプリケーションを起動した様子
Intellij IDEA

コマンドライン上での動作確認

SpringBootで実装したREST APIに「Javaについて教えてください。」という質問を送信して、Open AIからの返答を確認してみます。
POSTリクエストで送信するJSON形式のボディはこのようになります。

{
  "message": "Javaについて教えてください。"
}

curlコマンドを使って、この質問をPOSTリクエストします。

curl -X 'POST' 'http://localhost:8080/' -H 'accept: */*' -H 'Content-Type: application/json' -d '{"message": "Javaについて教えてください。"}'

すると、Open AIからの返答がREST APIのレスポンスとして出力されます。

{"result":"Javaは、オラクル(Oracle Corporation)によって開発された高級プログラミング言語で、特にオブジェクト指向プログラミングの特徴を持っています。以下はJavaの基本的な特徴や利点についての説明です。\n\n### 1. オブジェクト指向\nJavaはオブジェクト指向プログラミング(OOP)をサポートしており、クラスとオブジェクトを使用してプログラムを構築します。これにより、コードの再利用性が高まり、メンテナンスが容易になります。\n\n### 2. プラットフォーム独立性\nJavaは「Write Once, Run Anywhere(WORA)」の理念を持っており、一度書いたコードは、Java Virtual Machine(JVM)がインストールされているどのプラットフォームでも実行可能です。これにより、異なるオペレーティングシステム間での互換性が保たれます。\n\n### 3. メモリ管理\nJavaは自動メモリ管理機能(ガーベジコレクション)を提供しており、使われなくなったオブジェクトを自動的にメモリから解放します。これにより、メモリリークのリスクが減少します。\n\n### 4. セキュリティ\nJavaはセキュリティに重点を置いた設計がされており、特にネットワークアプリケーションにおいては、サンドボックス環境でアプリケーションを実行することが可能です。\n\n### 5. 豊富なライブラリとフレームワーク\nJavaは、多くの標準ライブラリやフレームワークが提供されており、これにより開発効率が向上します。たとえば、SpringやHibernateなどのフレームワークは、企業向けアプリケーションの開発で広く使用されています。\n\n### 6. 幅広い用途\nJavaは、デスクトップアプリケーション、ウェブアプリケーション、モバイルアプリ(Android)、ゲーム開発、ビッグデータ処理、IoT(Internet of Things)など、さまざまな分野で利用されています。\n\n### 7. コミュニティとサポート\nJavaは非常に大きな開発者コミュニティを持っており、豊富なリソースが存在します。オンラインフォーラム、ドキュメント、チュートリアルなどが提供されているため、学習や問題解決がしやすいです。\n\n### まとめ\nJavaはその安定性、セキュリティ、プラットフォーム独立性から、多くの企業や開発者に選ばれている言語です。プログラミングを始めるには良い選択肢であり、さまざまなプロジェクトに対応できる柔軟性を持っています。興味があれば、ぜひ学んでみてください!"}

チャットからの返答内容は常に一定ではありません。これはあくまで結果の一例になります。

Swaggerを使った動作確認

curlコマンドがインストールされていない環境では、Swaggerなどのツールを使って動作確認することもできます。
Swaggerを利用する場合、build.gradleに以下の依存関係を追加します。

  • org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.5 (2025年3月時点のリリースバージョンです)
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.ai:spring-ai-openai-spring-boot-starter'
    implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.5") // 追加したSwaggerの依存関係!!
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

アプリケーションを再起動し、ブラウザで以下のURLにアクセスします。

http://localhost:8080/swagger-ui/index.html

  1. chat-controllerを選択し、POST /を選択します。

  2. Try it outボタンをクリックし、Request BodymessageJavaについて教えてください。と入力し、Executeボタンを押下します。
    Swagger - Try it out

  3. ResponsesにOpenAIからの返答が表示されます。
    Swagger Responses

まとめ

Spring AIを使うことで、Spring Frameworkを使ったアプリケーションにAIサービスの機能を簡単に組み込むことができます。
Spring AIの正式リリースがとても待ち遠しいです。

株式会社キャリオット

Discussion