之前、短いビデオを見ていたら、なんと 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 のクイックスタート