ZhiPuAiChatOptions.java 提供模型配置,如要使用的模型、温度、频率惩罚等。
在启动时,可以通过ZhiPuAiChatModel(api, options)构造函数或spring.ai.zhipuai.chat.options.*属性来配置默认选项。
在运行时,您可以通过向Prompt调用添加新的、特定于请求的选项来覆盖默认选项。例如,要为特定请求覆盖默认模型和温度:
ChatResponse response = chatModel.call(new Prompt("Generate the names of 5 famous pirates.",ZhiPuAiChatOptions.builder().model(ZhiPuAiApi.ChatModel.GLM_4_Air.getValue()).temperature(0.5).build()));
除了特定于模型的ZhiPuAiChatOptions之外,您还可以使用一个便携式的ChatOptions实例,该实例是通过ChatOptions#builder()创建的。
示例控制器
创建一个新的Spring Boot项目,并将spring-ai-starter-model-zhipuai添加到您的pom(或gradle)依赖项中。
在src/main/resources目录下添加一个application.properties文件,以启用和配置ZhiPuAi聊天模型:
spring.ai.zhipuai.api-key=YOUR_API_KEYspring.ai.zhipuai.chat.options.model=glm-4-airspring.ai.zhipuai.chat.options.temperature=0.7
将api-key替换为您的智谱AI凭证。
这将创建一个ZhiPuAiChatModel实现,你可以将其注入到你的类中。以下是一个简单的@Controller类的示例,该类使用聊天模型进行文本生成。
@RestControllerpublic class ChatController {private final ZhiPuAiChatModel chatModel;@Autowiredpublic ChatController(ZhiPuAiChatModel 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(value = "/ai/generateStream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)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);}}
手动配置
ZhiPuAiChatModel实现了ChatModel和StreamingChatModel接口,并使用底层ZhiPuAiApi客户端连接到ZhiPuAI服务。
将spring-ai-zhipuai依赖项添加到您项目的Maven pom.xml文件中:
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-zhipuai</artifactId></dependency>
或者添加到你的Gradle build.gradle构建文件中。
dependencies {implementation 'org.springframework.ai:spring-ai-zhipuai'}
接下来,创建一个ZhiPuAiChatModel,并使用它进行文本生成:
var zhiPuAiApi = new ZhiPuAiApi(System.getenv("ZHIPU_AI_API_KEY"));var chatModel = new ZhiPuAiChatModel(this.zhiPuAiApi, ZhiPuAiChatOptions.builder().model(ZhiPuAiApi.ChatModel.GLM_4_Air.getValue()).temperature(0.4).maxTokens(200).build());ChatResponse response = this.chatModel.call(new Prompt("Generate the names of 5 famous pirates."));// Or with streaming responsesFlux<ChatResponse> streamResponse = this.chatModel.stream(new Prompt("Generate the names of 5 famous pirates."));
ZhiPuAiChatOptions提供了聊天请求的配置信息。ZhiPuAiChatOptions.Builder是一个流畅的选项构建器。
Low-level ZhiPuAiApi客户端
ZhiPuAiApi为ZhiPu AI API提供了一个轻量级的Java客户端。
以下是一个简单的代码片段,展示了如何以编程方式使用API:
ZhiPuAiApi zhiPuAiApi =new ZhiPuAiApi(System.getenv("ZHIPU_AI_API_KEY"));ChatCompletionMessage chatCompletionMessage =new ChatCompletionMessage("Hello world", Role.USER);// Sync requestResponseEntity<ChatCompletion> response = this.zhiPuAiApi.chatCompletionEntity(new ChatCompletionRequest(List.of(this.chatCompletionMessage), ZhiPuAiApi.ChatModel.GLM_4_Air.getValue(), 0.7, false));// Streaming requestFlux<ChatCompletionChunk> streamResponse = this.zhiPuAiApi.chatCompletionStream(new ChatCompletionRequest(List.of(this.chatCompletionMessage), ZhiPuAiApi.ChatModel.GLM_4_Air.getValue(), 0.7, true));
ZhiPuAiApi示例
ZhiPuAiApiIT测试提供了一些关于如何使用轻量级库的一般示例。
import java.util.List;import java.util.Objects;import org.junit.jupiter.api.Test;import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;import reactor.core.publisher.Flux;import org.springframework.ai.zhipuai.api.ZhiPuAiApi.ChatCompletion;import org.springframework.ai.zhipuai.api.ZhiPuAiApi.ChatCompletionChunk;import org.springframework.ai.zhipuai.api.ZhiPuAiApi.ChatCompletionMessage;import org.springframework.ai.zhipuai.api.ZhiPuAiApi.ChatCompletionMessage.Role;import org.springframework.ai.zhipuai.api.ZhiPuAiApi.ChatCompletionRequest;import org.springframework.ai.zhipuai.api.ZhiPuAiApi.Embedding;import org.springframework.ai.zhipuai.api.ZhiPuAiApi.EmbeddingList;import org.springframework.http.ResponseEntity;import static org.assertj.core.api.Assertions.assertThat;/*** @author Geng Rong* @author YunKui Lu*/@EnabledIfEnvironmentVariable(named = "ZHIPU_AI_API_KEY", matches = ".+")public class ZhiPuAiApiIT {ZhiPuAiApi zhiPuAiApi = ZhiPuAiApi.builder().apiKey(System.getenv("ZHIPU_AI_API_KEY")).build();@Testvoid chatCompletionEntity() {ChatCompletionMessage chatCompletionMessage = new ChatCompletionMessage("Hello world", Role.USER);ResponseEntity<ChatCompletion> response = this.zhiPuAiApi.chatCompletionEntity(new ChatCompletionRequest(List.of(chatCompletionMessage), "glm-3-turbo", 0.7, false));assertThat(response).isNotNull();assertThat(response.getBody()).isNotNull();}@Testvoid chatCompletionEntityWithMoreParams() {ChatCompletionMessage chatCompletionMessage = new ChatCompletionMessage("Hello world", Role.USER);ResponseEntity<ChatCompletion> response = this.zhiPuAiApi.chatCompletionEntity(new ChatCompletionRequest(List.of(chatCompletionMessage), "glm-4-flash", 1024, null,false, 0.95, 0.7, null, null, null, "test_request_id", false, null, null));assertThat(response).isNotNull();assertThat(response.getBody()).isNotNull();assertThat(response.getBody().usage()).isNotNull();}@Testvoid chatCompletionStream() {ChatCompletionMessage chatCompletionMessage = new ChatCompletionMessage("Hello world", Role.USER);Flux<ChatCompletionChunk> response = this.zhiPuAiApi.chatCompletionStream(new ChatCompletionRequest(List.of(chatCompletionMessage), "glm-4-flash", 0.7, true));assertThat(response).isNotNull();List<ChatCompletionChunk> chunks = response.collectList().block();assertThat(chunks).isNotNull();assertThat(chunks.get(chunks.size() - 1).usage()).isNotNull();}@Testvoid embeddings() {ResponseEntity<EmbeddingList<Embedding>> response = this.zhiPuAiApi.embeddings(new ZhiPuAiApi.EmbeddingRequest<>("Hello world"));assertThat(response).isNotNull();assertThat(Objects.requireNonNull(response.getBody()).data()).hasSize(1);assertThat(response.getBody().data().get(0).embedding()).hasSize(1024);}@Testvoid embeddingsWithDimensions() {ResponseEntity<EmbeddingList<Embedding>> response = this.zhiPuAiApi.embeddings(new ZhiPuAiApi.EmbeddingRequest<>("Hello world",ZhiPuAiApi.EmbeddingModel.Embedding_3.getValue(), 1536));assertThat(response).isNotNull();assertThat(Objects.requireNonNull(response.getBody()).data()).hasSize(1);assertThat(response.getBody().data().get(0).embedding()).hasSize(1536);}}