qinfengge

qinfengge

醉后不知天在水,满船清梦压星河
github

spring AI(1)の初期化と簡単な呼び出し

之前、短いビデオを見ていたら、なんと Spring フレームワークに AI モジュールが追加されていることを知りませんでした。私は Java プログラマーとして、すぐに公式ウェブサイトを見て、チュートリアルを試してみることにしました。

現在のspring AIのバージョンは0.8.1ですが、既に正式版の 1.0 の SNAPSHOT もありますので、API は大きく変更されることはありません。要するに、現在のバージョンは使用可能であり、互換性の心配はありません。

初期化#

Idea を使用して、Spring AI プロジェクトを素早く初期化することができますが、注意してください。JDK のバージョンは最低でも 17 以上、Spring Boot のバージョンは 3 以上である必要があります。

image

また、次のようにして、Spring AI を含む初期プロジェクトを作成することもできます。

image

上の図では、最も一般的な 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 を例に挙げます。

image

実際、base-url は省略することもできます。デフォルトでは公式のアドレスが使用されます。

image

公式の 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の公式ドキュメントを参照してください。

image

プロンプト#

素晴らしい、オブジェクトができたので、呼び出すことができるのでしょうか?実際には、直接呼び出すことができます。

callメソッドは 2 つの異なるパラメータを受け取ります。

image

promptはプロンプトであり、モデルの人物設定のようなものです。ほとんどの場合、モデルにこの値を与える必要があります。

image

では、なぜmessageを直接渡すと呼び出すことができるのでしょうか?

image

ソースコードを見ると、実際には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));
    }
}

呼び出し結果は次のようになります。

image

Spring AI
Spring AI Chat のシンプルな例
spring-ai を使用した ChatGPT のクイックスタート

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。