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>
自動組態
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,且不嘗試重試 |
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 |
|
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 聊天模型 |
|
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-url 和 spring.ai.moonshot.api-key 。如果設定了 spring.ai.moonshot.chat.base-url 和 spring.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 實作 ChatModel
和 StreamingChatModel
,並使用 低階 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 範例
-
MoonshotApiIT.java 測試提供了一些關於如何使用輕量級程式庫的通用範例。
-
MoonshotApiToolFunctionCallIT.java 測試展示了如何使用低階 API 來呼叫工具函式。