Moonshot AI 聊天

Spring AI 支援來自 Moonshot AI 的各種 AI 語言模型。您可以使用 Moonshot 模型與 Moonshot AI 語言模型互動,並建立多語言對話助理。

先決條件

您需要使用 Moonshot 建立 API,才能存取 Moonshot AI 語言模型。在 Moonshot AI 註冊頁面 建立帳戶,並在 API 金鑰頁面 上產生權杖。Spring AI 專案定義了一個名為 spring.ai.moonshot.api-key 的組態屬性,您應該將其設定為從 API 金鑰頁面 取得的 API 金鑰 值。匯出環境變數是設定該組態屬性的一種方法

export SPRING_AI_MOONSHOT_API_KEY=<INSERT KEY HERE>

新增儲存庫和 BOM

Spring AI 成品發佈在 Spring Milestone 和 Snapshot 儲存庫中。請參閱 儲存庫 章節,將這些儲存庫新增至您的建置系統。

為了協助相依性管理,Spring AI 提供了 BOM(物料清單),以確保在整個專案中使用一致版本的 Spring AI。請參閱 相依性管理 章節,將 Spring AI BOM 新增至您的建置系統。

自動組態

Spring AI 為 Moonshot 聊天模型提供 Spring Boot 自動組態。若要啟用它,請將以下相依性新增至專案的 Maven pom.xml 檔案

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-moonshot-spring-boot-starter</artifactId>
</dependency>

或您的 Gradle build.gradle 建置檔案。

dependencies {
    implementation 'org.springframework.ai:spring-ai-moonshot-spring-boot-starter'
}
請參閱 相依性管理 章節,將 Spring AI BOM 新增至您的建置檔案。

聊天屬性

重試屬性

前綴 spring.ai.retry 用作屬性前綴,可讓您設定 Moonshot AI 聊天模型的重試機制。

屬性 描述 預設值

spring.ai.retry.max-attempts

最大重試次數。

10

spring.ai.retry.backoff.initial-interval

指數退避策略的初始睡眠持續時間。

2 秒。

spring.ai.retry.backoff.multiplier

退避間隔乘數。

5

spring.ai.retry.backoff.max-interval

最大退避持續時間。

3 分鐘。

spring.ai.retry.on-client-errors

若為 false,則擲回 NonTransientAiException,且不嘗試重試 4xx 用戶端錯誤代碼

false

spring.ai.retry.exclude-on-http-codes

不應觸發重試的 HTTP 狀態代碼清單(例如,擲回 NonTransientAiException)。

空白

spring.ai.retry.on-http-codes

應觸發重試的 HTTP 狀態代碼清單(例如,擲回 TransientAiException)。

空白

連線屬性

前綴 spring.ai.moonshot 用作屬性前綴,可讓您連線至 Moonshot。

屬性 描述 預設值

spring.ai.moonshot.base-url

要連線的 URL

api.moonshot.cn

spring.ai.moonshot.api-key

API 金鑰

-

組態屬性

前綴 spring.ai.moonshot.chat 是屬性前綴,可讓您設定 Moonshot 的聊天模型實作。

屬性 描述 預設值

spring.ai.moonshot.chat.enabled

啟用 Moonshot 聊天模型。

true

spring.ai.moonshot.chat.base-url

選用,覆寫 spring.ai.moonshot.base-url 以提供聊天專用 URL

-

spring.ai.moonshot.chat.api-key

選用,覆寫 spring.ai.moonshot.api-key 以提供聊天專用 API 金鑰

-

spring.ai.moonshot.chat.options.model

這是要使用的 Moonshot 聊天模型

moonshot-v1-8kmoonshot-v1-8kmoonshot-v1-32kmoonshot-v1-128k 指向最新的模型版本)

spring.ai.moonshot.chat.options.maxTokens

在聊天完成中產生的最大權杖數。輸入權杖和產生權杖的總長度受模型的上下文長度限制。

-

spring.ai.moonshot.chat.options.temperature

要使用的取樣溫度,其控制產生完成項目的表面創造力。較高的值會使輸出更隨機,而較低的值會使結果更集中且具決定性。不建議為相同的完成項目請求修改 temperature 和 top_p,因為這兩個設定的交互作用難以預測。

0.7

spring.ai.moonshot.chat.options.topP

一種替代使用 temperature 取樣的方法,稱為核心取樣,其中模型會考慮具有 top_p 概率質量的權杖結果。因此 0.1 表示僅考慮包含前 10% 概率質量的權杖。我們通常建議更改此項或 temperature,但不要同時更改兩者。

1.0

spring.ai.moonshot.chat.options.n

為每個輸入訊息產生多少個聊天完成選項。請注意,您將根據所有選項中產生的權杖數量收費。預設值為 1,且不能大於 5。具體而言,當 temperature 非常小且接近 0 時,我們只能傳回 1 個結果。如果此時已設定 n 且 >1,則服務將傳回非法輸入參數 (invalid_request_error)

1

spring.ai.moonshot.chat.options.presencePenalty

介於 -2.0 和 2.0 之間的數字。正值會根據新權杖是否出現在目前為止的文字中來懲罰新權杖,從而增加模型談論新主題的可能性。

0.0f

spring.ai.moonshot.chat.options.frequencyPenalty

介於 -2.0 和 2.0 之間的數字。正值會根據新權杖在目前為止的文字中已存在的頻率來懲罰新權杖,從而降低模型逐字重複相同行的可能性。

0.0f

spring.ai.moonshot.chat.options.stop

最多 5 個序列,API 將在此處停止產生更多權杖。每個字串不得超過 32 個位元組

-

您可以覆寫 ChatModel 實作的通用 spring.ai.moonshot.base-urlspring.ai.moonshot.api-key。如果設定了 spring.ai.moonshot.chat.base-urlspring.ai.moonshot.chat.api-key 屬性,則它們優先於通用屬性。如果您想為不同的模型和不同的模型端點使用不同的 Moonshot 帳戶,這會很有用。
前綴為 spring.ai.moonshot.chat.options 的所有屬性都可以在執行時透過將請求特定的 執行時選項 新增至 Prompt 呼叫來覆寫。

執行時選項

MoonshotChatOptions.java 提供模型組態,例如要使用的模型、temperature、frequency penalty 等。

在啟動時,可以使用 MoonshotChatModel(api, options) 建構子或 spring.ai.moonshot.chat.options.* 屬性來組態預設選項。

在執行時,您可以透過將新的、請求特定的選項新增至 Prompt 呼叫來覆寫預設選項。例如,覆寫特定請求的預設模型和 temperature

ChatResponse response = chatModel.call(
    new Prompt(
        "Generate the names of 5 famous pirates.",
        MoonshotChatOptions.builder()
            .withModel(MoonshotApi.ChatModel.MOONSHOT_V1_8K.getValue())
            .withTemperature(0.5)
        .build()
    ));
除了模型特定的 MoonshotChatOptions 之外,您還可以使用可移植的 ChatOptions 實例,使用 ChatOptionsBuilder#builder() 建立。

範例控制器(自動組態)

建立 新的 Spring Boot 專案,並將 spring-ai-moonshot-spring-boot-starter 新增至您的 pom(或 gradle)相依性。

src/main/resources 目錄下新增 application.properties 檔案,以啟用和組態 Moonshot 聊天模型

spring.ai.moonshot.api-key=YOUR_API_KEY
spring.ai.moonshot.chat.options.model=moonshot-v1-8k
spring.ai.moonshot.chat.options.temperature=0.7
api-key 替換為您的 Moonshot 憑證。

這將建立一個 MoonshotChatModel 實作,您可以將其注入到您的類別中。以下是一個簡單的 @Controller 類別範例,該類別使用聊天模型進行文字生成。

@RestController
public class ChatController {

    private final MoonshotChatModel chatModel;

    @Autowired
    public ChatController(MoonshotChatModel chatModel) {
        this.chatModel = chatModel;
    }

    @GetMapping("/ai/generate")
    public Map generate(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
        return Map.of("generation", this.chatModel.call(message));
    }

    @GetMapping("/ai/generateStream")
	public Flux<ChatResponse> generateStream(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
        var prompt = new Prompt(new UserMessage(message));
        return this.chatModel.stream(prompt);
    }
}

手動組態

MoonshotChatModel 實作 ChatModelStreamingChatModel,並使用 低階 Moonshot Api 用戶端 連線至 Moonshot 服務。

spring-ai-moonshot 相依性新增至專案的 Maven pom.xml 檔案

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-moonshot</artifactId>
</dependency>

或您的 Gradle build.gradle 建置檔案。

dependencies {
    implementation 'org.springframework.ai:spring-ai-moonshot'
}
請參閱 相依性管理 章節,將 Spring AI BOM 新增至您的建置檔案。

接下來,建立 MoonshotChatModel 並使用它進行文字生成

var moonshotApi = new MoonshotApi(System.getenv("MOONSHOT_API_KEY"));

var chatModel = new MoonshotChatModel(this.moonshotApi, MoonshotChatOptions.builder()
                .withModel(MoonshotApi.ChatModel.MOONSHOT_V1_8K.getValue())
                .withTemperature(0.4)
                .withMaxTokens(200)
                .build());

ChatResponse response = this.chatModel.call(
    new Prompt("Generate the names of 5 famous pirates."));

// Or with streaming responses
Flux<ChatResponse> streamResponse = this.chatModel.stream(
    new Prompt("Generate the names of 5 famous pirates."));

MoonshotChatOptions 提供聊天請求的組態資訊。MoonshotChatOptions.Builder 是流暢的選項建構器。

低階 Moonshot Api 用戶端

MoonshotApi 提供 Moonshot AI API 的輕量級 Java 用戶端。

以下是如何以程式設計方式使用 API 的簡單程式碼片段

MoonshotApi moonshotApi =
    new MoonshotApi(System.getenv("MOONSHOT_API_KEY"));

ChatCompletionMessage chatCompletionMessage =
    new ChatCompletionMessage("Hello world", Role.USER);

// Sync request
ResponseEntity<ChatCompletion> response = this.moonshotApi.chatCompletionEntity(
    new ChatCompletionRequest(List.of(this.chatCompletionMessage), MoonshotApi.ChatModel.MOONSHOT_V1_8K.getValue(), 0.7, false));

// Streaming request
Flux<ChatCompletionChunk> streamResponse = this.moonshotApi.chatCompletionStream(
        new ChatCompletionRequest(List.of(this.chatCompletionMessage), MoonshotApi.ChatModel.MOONSHOT_V1_8K.getValue(), 0.7, true));

請遵循 MoonshotApi.java 的 JavaDoc 以取得更多資訊。

MoonshotApi 範例