之前、短いビデオを見ていたら、なんと Spring フレームワークに AI モジュールが追加されていることを知りました。私は Java プログラマーとして、これを知らなかったので、すぐに公式ウェブサイトを見て、チュートリアルを試してみることにしました。
現在のspring AIのバージョンは0.8.1ですが、既に正式版の 1.0 の SNAPSHOT もありますので、API は大きく変更されることはありません。つまり、現在のバージョンは使用可能であり、互換性の問題は心配する必要はありません。
初期化#
Idea を使用して、Spring AI プロジェクトを素早く初期化することができます。ただし、JDK のバージョンは最低でも 17 以上、Spring Boot のバージョンは 3 以上である必要があります。
また、以下のリンクを使用して、Spring AI を含む初期プロジェクトを作成することもできます:
上記の図では、最も一般的な OpenAI の依存関係を追加しています。Spring AI は、以下の BOM を追加しています:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>0.8.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
そして、選択した OpenAI:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
クイックスタート#
準備#
次に、モデルのエンドポイントを提供する必要があります。ここでは OpenAI を例に挙げます。
実際、base-url は省略することもできます。デフォルトでは公式のアドレスが使用されます。
公式の API エンドポイントを使用する場合、プログラムにプロキシを追加する必要があるかもしれません。
System.setProperty("https.proxyHost", "localhost");
System.setProperty("https.proxyPort", "7890");
クライアントオブジェクト#
設定ファイルで情報を設定している場合は、オブジェクトを直接初期化することができます。
private final OpenAiChatClient chatClient;
もう一つの方法は、コード内でオブジェクトを作成することです。
var openAiApi = new OpenAiApi("https://api.openai.com", "sk-xxxxx");
OpenAiChatClient chatClient = new OpenAiChatClient(openAiApi, OpenAiChatOptions.builder()
.withModel("gpt-3.5-turbo-1106")
.withTemperature(0.4F)
.build());
コードを使用すると、オブジェクトを柔軟にカスタマイズすることができます。withModel("gpt-3.5-turbo-1106")
は、どのモデルを使用するかを指定しています。デフォルトでは gpt-3.5-turbo が使用されます。withTemperature(0.4F)
は、モデルのランダムな特性を指定しています(Temperature のデフォルト値は 0.8 で、値が大きいほど、返される内容が多様性、創造性、ランダム性を持ちます。0 に設定すると、事実に基づいた回答が得られます。正確な回答を得るためには、このパラメータを下げる必要があります。日常会話では 0.5-0.8 を推奨します)。
ただし、これらのパラメータは設定ファイルで指定することもできます。詳細については、公式ドキュメントのConfiguration Propertiesを参照してください。
プロンプト#
素晴らしい、オブジェクトができたので、呼び出すことができるのでしょうか?実際には、直接呼び出すことができます。
call
メソッドは 2 つの異なるパラメータを受け取ります。
prompt
はプロンプトであり、モデルの人物設定のようなものです。ほとんどの場合、モデルにこの値を与える必要があります。
では、なぜmessage
を直接渡すこともできるのでしょうか?
ソースコードを見ると、実際にはprompt
でラップされていることがわかります。
Prompt を作成するのも簡単です:
private static Prompt getPrompt(String message) {
String systemPrompt = "{prompt}";
SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemPrompt);
Message userMessage = new UserMessage(message);
Message systemMessage = systemPromptTemplate.createMessage(MapUtil.of("prompt", "you are a helpful AI assistant"));
return new Prompt(List.of(userMessage, systemMessage));
}
ここでも、message
をラップしていますが、systemMessage
が追加されています。これは、モデルの人物設定のようなものです。
実際には、Prompt にはさまざまな種類があり、さまざまな方法で使用することができます。プロンプトだけでなく、マルチターンの対話にも重要です。
以下は完全なコードです。
@RestController
@RequestMapping("ai")
@RequiredArgsConstructor
@CrossOrigin
public class OpenAIController {
private final OpenAiChatClient chatClient;
@GetMapping("chat/{message}")
public String opChat(@PathVariable String message) {
Prompt prompt = getPrompt(message);
List<Generation> response = chatClient.call(prompt).getResults();
StringBuilder result = new StringBuilder();
for (Generation generation : response) {
String content = generation.getOutput().getContent();
result.append(content);
}
return result.toString();
}
private static Prompt getPrompt(String message) {
String systemPrompt = "{prompt}";
SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemPrompt);
Message userMessage = new UserMessage(message);
Message systemMessage = systemPromptTemplate.createMessage(MapUtil.of("prompt", "you are a helpful AI assistant"));
return new Prompt(List.of(userMessage, systemMessage));
}
}
呼び出し結果は以下の通りです。
Spring AI
Spring AI Chat のシンプルな例
spring-ai を使用した ChatGPT のクイックスタート