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機能を提供する開発ツールを利用したい場合に追加)
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
を使用してみます。
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
型のプロパティを持つクラスを実装します。
- チャットに送信するメッセージを格納する
ChatRequest
クラス
public record ChatRequest(String message) {
}
- チャットからの返答を格納する
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
オブジェクトとして返します。
-
chatClientBuilder.build()
を呼び出してChatClient
のインスタンスを取得します。 -
ChatClient
のインスタンスに対してprompt().user("<メッセージの文字列>").call()
を呼び出し、チャットにメッセージを送信します。送信結果はChatClient.ClientReponseSpec
オブジェクトで返されます。 - チャットからの返答テキストを
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アプリケーションを起動した様子
コマンドライン上での動作確認
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にアクセスします。
-
chat-controller
を選択し、POST /
を選択します。 -
Try it out
ボタンをクリックし、Request Body
のmessage
にJavaについて教えてください。
と入力し、Execute
ボタンを押下します。
-
Responses
にOpenAIからの返答が表示されます。
まとめ
Spring AIを使うことで、Spring Frameworkを使ったアプリケーションにAIサービスの機能を簡単に組み込むことができます。
Spring AIの正式リリースがとても待ち遠しいです。
Discussion