智谱AI聊天

Spring AI 支持智谱AI的各种AI语言模型。您可以与智谱AI语言模型交互,并基于智谱AI模型创建多语言会话助手。

先决条件

您需要使用智谱AI创建一个API来访问智谱AI语言模型。

请在 智谱AI注册页面 创建账户,并在 API Keys页面 生成令牌。

Spring AI项目定义了一个名为 spring.ai.zhipuai.api-key 的配置属性,您应该将其设置为从API Keys页面获取的 API Key 值。

您可以在 application.properties 文件中设置此配置属性:

spring.ai.zhipuai.api-key=<your-zhipuai-api-key>

为了在处理API密钥等敏感信息时增强安全性,您可以使用Spring表达式语言(SpEL)引用自定义环境变量:

# 在 application.yml 中
spring:
  ai:
    zhipuai:
      api-key: ${ZHIPUAI_API_KEY}
# 在您的环境或 .env 文件中
export ZHIPUAI_API_KEY=<your-zhipuai-api-key>

您也可以在应用程序代码中以编程方式设置此配置:

// 从安全源或环境变量中检索API密钥
String apiKey = System.getenv("ZHIPUAI_API_KEY");

添加仓库和BOM

Spring AI的artifact发布在Maven Central和Spring Snapshot仓库中。 请参阅 Artifact Repositories 部分,将这些仓库添加到您的构建系统。

为了帮助进行依赖管理,Spring AI提供了一个BOM(bill of materials)以确保在整个项目中使用的Spring AI版本一致。请参阅 Dependency Management 部分,将Spring AI BOM添加到您的构建系统。

自动配置

Spring AI自动配置、启动器模块的artifact名称发生了重大变化。 请参阅 升级说明 了解更多信息。

Spring AI为智谱AI聊天客户端提供了Spring Boot自动配置。 要启用它,请将以下依赖项添加到您的项目Maven pom.xml 文件中:

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-model-zhipuai</artifactId>
</dependency>

或添加到您的Gradle build.gradle 构建文件中。

dependencies {
    implementation 'org.springframework.ai:spring-ai-starter-model-zhipuai'
}

请参阅 Dependency Management 部分,将Spring AI BOM添加到您的构建文件。

聊天属性

重试属性

前缀 spring.ai.retry 用作属性前缀,允许您配置智谱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.zhiPu 用作属性前缀,允许您连接到智谱AI。

属性 描述 默认值

spring.ai.zhipuai.base-url

要连接的URL

[role="bare"][role="bare"][role="bare"]https://open.bigmodel.cn/api/paas

spring.ai.zhipuai.api-key

API密钥

-

配置属性

聊天自动配置的启用和禁用现在通过前缀为 spring.ai.model.chat 的顶级属性进行配置。 要启用, spring.ai.model.chat=zhipuai (默认启用) 要禁用, spring.ai.model.chat=none (或任何与 zhipuai 不匹配的值) 此更改是为了允许配置多个模型。

前缀 spring.ai.zhipuai.chat 是属性前缀,允许您配置智谱AI的聊天模型实现。

属性 描述 默认值

spring.ai.zhipuai.chat.enabled (已移除且不再有效)

启用智谱AI聊天模型。

true

spring.ai.model.chat

启用智谱AI聊天模型。

zhipuai

spring.ai.zhipuai.chat.base-url

可选覆盖 spring.ai.zhipuai.base-url 以提供聊天专用URL

[role="bare"][role="bare"][role="bare"]https://open.bigmodel.cn/api/paas

spring.ai.zhipuai.chat.api-key

可选覆盖 spring.ai.zhipuai.api-key 以提供聊天专用API密钥

-

spring.ai.zhipuai.chat.options.model

要使用的智谱AI聊天模型

GLM-3-TurboGLM-3-TurboGLM-4GLM-4-AirGLM-4-AirXGLM-4-FlashGLM-4V 指向最新模型版本)

spring.ai.zhipuai.chat.options.maxTokens

在聊天完成中生成的最大令牌数。输入令牌和生成令牌的总长度受模型上下文长度的限制。

-

spring.ai.zhipuai.chat.options.temperature

要使用的采样温度,介于0和1之间。较高的值(如0.8)会使输出更随机,而较低的值(如0.2)会使其更集中和确定。我们通常建议更改此项或 top_p,但不要同时更改两者。

0.7

spring.ai.zhipuai.chat.options.topP

采样温度的替代方法,称为核采样,模型考虑具有 top_p 概率质量的令牌结果。因此0.1表示只考虑构成前10%概率质量的令牌。我们通常建议更改此项或温度,但不要同时更改两者。

1.0

spring.ai.zhipuai.chat.options.stop

模型将停止生成由 stop 指定的字符,目前只支持 ["stop_word1"] 格式的单个停止词

-

spring.ai.zhipuai.chat.options.user

代表您的最终用户的唯一标识符,可以帮助智谱AI监控和检测滥用。

-

spring.ai.zhipuai.chat.options.requestId

该参数由客户端传递,必须确保唯一性。它用于区分每个请求的唯一标识符。如果客户端不提供,平台将默认生成。

-

spring.ai.zhipuai.chat.options.doSample

do_sample 设置为true时,启用采样策略。如果 do_sample 为false,则采样策略参数 temperaturetop_p 将不生效。

true

spring.ai.zhipuai.chat.options.proxy-tool-calls

如果为true,Spring AI将不会在内部处理函数调用,而是将它们代理到客户端。然后由客户端负责处理函数调用,将它们分派到适当的函数,并返回结果。如果为false(默认值),Spring AI将在内部处理函数调用。仅适用于支持函数调用的聊天模型

false

您可以为 ChatModel 实现覆盖通用的 spring.ai.zhipuai.base-urlspring.ai.zhipuai.api-key。 如果设置了 spring.ai.zhipuai.chat.base-urlspring.ai.zhipuai.chat.api-key 属性,它们将优先于通用属性。 这在您希望为不同的模型和不同的模型端点使用不同的智谱AI账户时非常有用。

所有以 spring.ai.zhipuai.chat.options 为前缀的属性都可以在运行时通过向 Prompt 调用添加请求特定的 运行时选项 来覆盖。

运行时选项

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_3_Turbo.getValue())
            .temperature(0.5)
        .build()
    ));

除了特定于模型的 ZhiPuAiChatOptions 之外,您还可以使用通过 ChatOptions#builder() 创建的可移植 ChatOptions 实例。

示例控制器

创建 一个新的Spring Boot项目,并将 spring-ai-starter-model-zhipuai 添加到您的pom(或gradle)依赖项中。

src/main/resources 目录下添加 application.properties 文件,以启用和配置智谱AI聊天模型:

spring.ai.zhipuai.api-key=YOUR_API_KEY
spring.ai.zhipuai.chat.options.model=glm-4-air
spring.ai.zhipuai.chat.options.temperature=0.7

用您的智谱AI凭据替换 api-key

这将创建一个 ZhiPuAiChatModel 实现,您可以将其注入到您的类中。 这是一个简单的 @Controller 类示例,它使用聊天模型进行文本生成。

@RestController
public class ChatController {

    private final ZhiPuAiChatModel chatModel;

    @Autowired
    public 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 实现了 ChatModelStreamingChatModel,并使用 低级智谱AI API客户端 连接到智谱AI服务。

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'
}

请参阅 Dependency Management 部分,将Spring AI BOM添加到您的构建文件。

接下来,创建一个 ZhiPuAiChatModel 并将其用于文本生成:

var zhiPuAiApi = new ZhiPuAiApi(System.getenv("ZHIPU_AI_API_KEY"));

var chatModel = new ZhiPuAiChatModel(this.zhiPuAiApi, ZhiPuAiChatOptions.builder()
                .model(ZhiPuAiApi.ChatModel.GLM_3_Turbo.getValue())
                .temperature(0.4)
                .maxTokens(200)
                .build());

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

// 或使用流式响应
Flux<ChatResponse> streamResponse = this.chatModel.stream(
    new Prompt("Generate the names of 5 famous pirates."));

ZhiPuAiChatOptions 提供了聊天请求的配置信息。 ZhiPuAiChatOptions.Builder 是一个流畅的选项构建器。

低级智谱AI API客户端

ZhiPuAiApi智谱AI API 提供了一个轻量级的Java客户端。

以下是一个如何以编程方式使用API的简单代码片段:

ZhiPuAiApi zhiPuAiApi =
    new ZhiPuAiApi(System.getenv("ZHIPU_AI_API_KEY"));

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

// 同步请求
ResponseEntity<ChatCompletion> response = this.zhiPuAiApi.chatCompletionEntity(
    new ChatCompletionRequest(List.of(this.chatCompletionMessage), ZhiPuAiApi.ChatModel.GLM_3_Turbo.getValue(), 0.7, false));

// 流式请求
Flux<ChatCompletionChunk> streamResponse = this.zhiPuAiApi.chatCompletionStream(
        new ChatCompletionRequest(List.of(this.chatCompletionMessage), ZhiPuAiApi.ChatModel.GLM_3_Turbo.getValue(), 0.7, true));

请遵循 ZhiPuAiApi.java 的JavaDoc以获取更多信息。

智谱AI API示例