Azure OpenAI 聊天

由 ChatGPT 提供支持的 Azure OpenAI 产品超越了传统的 OpenAI 功能,实现了具有增强功能的 AI 驱动文本生成。Azure 提供了额外的 AI 安全性和负责任 AI 功能,如其最近更新中所强调的,点击此处查看详情。

Azure 为 Java 开发人员提供了利用 AI 潜力的机会,方法是将其与一系列 Azure 服务集成,其中包括与 AI 相关的资源,例如 Azure 上的矢量存储。

自动配置

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

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

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

dependencies {
    implementation 'org.springframework.ai:spring-ai-azure-openai-spring-boot-starter'
}
请参阅依赖管理部分,将 Spring AI BOM 添加到您的构建文件中。

聊天属性

前缀 spring.ai.azure.openai 是配置连接到Azure OpenAI的属性前缀。

属性 描述 默认值

spring.ai.azure.openai.api-key

来自Azure AI OpenAI 密钥和端点 部分的密钥

-

spring.ai.azure.openai.endpoint

来自Azure AI OpenAI 密钥和端点 部分的端点

-

前缀 spring.ai.azure.openai.chat 是配置Azure OpenAI的ChatClient实现的属性前缀。

属性 描述 默认

spring.ai.azure.openai.chat.enabled

启用 Azure OpenAI 聊天客户端。

true

spring.ai.azure.openai.chat.options.deployment-name

* 在 Azure 中使用时,这指的是您模型的“部署名称”,您可以在 oai.azure.com/portal 找到。重要说明,在 Azure OpenAI 部署中,“部署名称”与模型本身是不同的。围绕这些术语的混淆源于要使 Azure OpenAI 客户端库与原始 OpenAI 端点兼容的意图。Azure OpenAI 和 Sam Altman 的 OpenAI 提供的部署模型结构有很大不同。部署模型名称作为此完成请求的一部分。

gpt-35-turbo

spring.ai.azure.openai.chat.options.maxTokens

要生成的最大令牌数。

-

spring.ai.azure.openai.chat.options.temperature

用于控制生成完成的显式创造力的采样温度。更高的值将使输出更随机,而较低的值将使结果更集中和确定性。不建议修改 temperature 和 top_p 用于相同的完成请求,因为这两个设置的相互作用难以预测。

0.7

spring.ai.azure.openai.chat.options.topP

一种与温度抽样称为核心抽样的替代方法。此值使模型考虑带有提供的概率质量的令牌的结果。

-

spring.ai.azure.openai.chat.options.logitBias

GPT 令牌 ID 和偏差分数之间的映射,影响完成响应中特定令牌出现的概率。令牌 ID 是通过外部令牌化工具计算的,而偏差分数位于 -100 到 100 的范围内,最小值和最大值对应于完全禁止或独占选择令牌。给定偏差分数的确切行为因模型而异。

-

spring.ai.azure.openai.chat.options.user

操作的调用者或最终用户的标识符。这可能用于跟踪或限制速率。

-

spring.ai.azure.openai.chat.options.n

应为完成响应生成的聊天完成选择的数量。

-

spring.ai.azure.openai.chat.options.stop

将结束完成生成的一系列文本序列。

-

spring.ai.azure.openai.chat.options.presencePenalty

影响根据生成的文本中的现有出现来生成的令牌出现的概率的值。正值会使已经存在的令牌出现的可能性减少,并增加模型输出新主题的可能性。

-

spring.ai.azure.openai.chat.options.frequencyPenalty

根据生成的文本中的累积频率影响生成的令牌出现的概率的值。正值会使令牌在频率增加时出现的可能性减少,并降低模型重复完全相同语句的可能性。

-

所有以 spring.ai.azure.openai.chat.options 开头的属性都可以通过将请求特定的 聊天选项 添加到 Prompt 调用来在运行时覆盖。

聊天选项

AzureOpenAiChatOptions.java 提供了模型配置,例如要使用的模型、温度、频率惩罚等。

在启动时,可以使用 AzureOpenAiChatClient(api, options) 构造函数或 spring.ai.azure.openai.chat.options.* 属性来配置默认选项。

在运行时,您可以通过将新的、特定于请求的选项添加到 Prompt 调用来覆盖默认选项。例如,要为特定请求覆盖默认模型和温度:

ChatResponse response = chatClient.call(
    new Prompt(
        "生成5个著名海盗的名字。",
        AzureOpenAiChatOptions.builder()
            .withModel("gpt-4-32k")
            .withTemperature(0.4)
        .build()
    ));
除了模型特定的 AzureOpenAiChatOptions.java,您还可以使用可移植的 ChatOptions 实例,使用 ChatOptionsBuilder#builder() 创建。

函数调用

您可以注册自定义的Java函数到 AzureOpenAiChatClient,并让模型智能地选择输出一个包含调用注册函数之一或多个参数的 JSON 对象。这是一种将LLM能力与外部工具和API连接的强大技术。了解更多关于 Azure OpenAI 函数调用

样本控制器(自动配置)

创建 一个新的Spring Boot项目,并在您的pom(或gradle)依赖中添加 spring-ai-azure-openai-spring-boot-starter

添加一个 application.properties 文件,放在 src/main/resources 目录下,以启用和配置 OpenAi 聊天客户端:

spring.ai.azure.openai.api-key=YOUR_API_KEY
spring.ai.azure.openai.endpoint=YOUR_ENDPOINT
spring 

手动配置

AzureOpenAiChatClient 实现了 ChatClientStreamingChatClient 并使用 Azure OpenAI Java Client

要启用它,请将 spring-ai-azure-openai 依赖项添加到您项目的 Maven pom.xml 文件中:

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

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

dependencies {
    implementation 'org.springframework.ai:spring-ai-azure-openai'
}
请参阅 依赖管理 部分,在您的构建文件中添加 Spring AI BOM。
spring-ai-azure-openai 依赖还提供对 AzureOpenAiChatClient 的访问。有关 AzureOpenAiChatClient 的更多信息,请参阅Azure OpenAI Chat 部分。

接下来,创建一个 AzureOpenAiChatClient 实例并使用它生成文本响应:

var openAIClient = OpenAIClientBuilder()
        .credential(new AzureKeyCredential(System.getenv("AZURE_OPENAI_API_KEY")))
		.endpoint(System.getenv("AZURE_OPENAI_ENDPOINT"))
		.buildClient();

var chatClient = new AzureOpenAiChatClient(openAIClient).withDefaultOptions(
		AzureOpenAiChatOptions.builder()
            .withModel("gpt-35-turbo")
            .withTemperature(0.4)
            .withMaxTokens(200)
        .build());

ChatResponse response = chatClient.call(
    new Prompt("生成5个著名海盗的名字。"));

// 或使用流式响应
Flux<ChatResponse> response = chatClient.stream(
    new Prompt("生成5个著名海盗的名字。"));
实际上,gpt-35-turbo 是在 Azure AI 门户中显示的 部署名称