Azure OpenAI 聊天

Azure 的 OpenAI 产品由 ChatGPT 提供支持,超越了传统的 OpenAI 功能,提供具有增强功能的 AI 驱动的文本生成。Azure 提供额外的 AI 安全和负责任的 AI 功能,如最近更新中所述 此处.

Azure 为 Java 开发人员提供了将 AI 与一系列 Azure 服务(包括 AI 相关资源,例如 Azure 上的向量存储)集成,从而充分利用 AI 潜力的机会。

先决条件

Azure 门户 上的 Azure OpenAI 服务部分获取您的 Azure OpenAI endpointapi-key。Spring AI 定义了一个名为 spring.ai.azure.openai.api-key 的配置属性,您应该将其设置为从 Azure 获取的 API 密钥 的值。还有一个名为 spring.ai.azure.openai.endpoint 的配置属性,您应该将其设置为在 Azure 中配置模型时获得的端点 URL。导出环境变量是设置这些配置属性的一种方法

export SPRING_AI_AZURE_OPENAI_API_KEY=<INSERT KEY HERE>
export SPRING_AI_AZURE_OPENAI_ENDPOINT=<INSERT ENDPOINT URL HERE>

部署名称

要使用运行 Azure AI 应用程序,请通过 [Azure AI 门户](oai.azure.com/portal) 创建 Azure AI 部署。

在 Azure 中,每个客户端必须指定一个 部署名称 来连接到 Azure OpenAI 服务。

重要的是要了解 部署名称 与您选择部署的模型不同。

例如,名为“MyAiDeployment”的部署可以配置为使用 GPT 3.5 Turbo 模型或 GPT 4.0 模型。

目前,为了简单起见,您可以使用以下设置创建部署。

部署名称:gpt-35-turbo 模型名称:gpt-35-turbo

此 Azure 配置将与 Spring Boot Azure AI 启动器及其自动配置功能的默认配置保持一致。

如果您使用不同的部署名称,请相应地更新配置属性。

spring.ai.azure.openai.chat.options.deployment-name=<my deployment name>

Azure OpenAI 和 OpenAI 的不同部署结构导致 Azure OpenAI 客户端库中出现一个名为 deploymentOrModelName 的属性。这是因为在 OpenAI 中没有 部署名称,只有 模型名称

属性 spring.ai.azure.openai.chat.options.model 已重命名为 spring.ai.azure.openai.chat.options.deployment-name

添加存储库和 BOM

Spring AI 工件发布在 Spring Milestone 和 Snapshot 存储库中。请参阅 存储库 部分,将这些存储库添加到您的构建系统中。

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

自动配置

Spring AI 为 Azure OpenAI Chat 客户端提供 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 的 ChatModel 实现的属性前缀。

属性 描述 默认值

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

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

0.7

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

一种称为核采样的温度采样的替代方法。此值会导致模型考虑具有提供的概率质量的令牌的结果。

-

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

一个 GPT token ID 与偏差分数之间的映射,它会影响特定 token 出现在完成响应中的概率。Token ID 是通过外部分词器工具计算的,而偏差分数位于 -100 到 100 的范围内,最小值和最大值分别对应于完全禁止或独占选择一个 token。特定偏差分数的具体行为因模型而异。

-

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

一个值,它会根据生成的 token 在生成的文本中是否存在来影响其出现的概率。正值将使 token 在已存在时不太可能出现,并增加模型输出新主题的可能性。

-

spring.ai.azure.openai.chat.options.responseFormat

一个对象,指定模型必须输出的格式。使用 AzureOpenAiResponseFormat.JSON 启用 JSON 模式,这将保证模型生成的 message 是有效的 JSON。使用 AzureOpenAiResponseFormat.TEXT 启用 TEXT 模式。

-

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

一个值,它会根据生成的 token 在生成的文本中的累积频率来影响其出现的概率。正值将使 token 在其频率增加时不太可能出现,并降低模型逐字重复相同语句的可能性。

-

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

运行时选项

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

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

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

ChatResponse response = chatModel.call(
    new Prompt(
        "Generate the names of 5 famous pirates.",
        AzureOpenAiChatOptions.builder()
            .withModel("gpt-4-32k")
            .withTemperature(0.4)
        .build()
    ));
除了特定于模型的 AzureOpenAiChatOptions.java 之外,您还可以使用可移植的 ChatOptions 实例,该实例使用 ChatOptionsBuilder#builder() 创建。

函数调用

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

示例控制器

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

src/main/resources 目录下添加一个 application.properties 文件,以启用和配置 OpenAi 聊天模型

spring.ai.azure.openai.api-key=YOUR_API_KEY
spring.ai.azure.openai.endpoint=YOUR_ENDPOINT
spring.ai.azure.openai.chat.options.deployment-name=gpt-35-turbo
spring.ai.azure.openai.chat.options.temperature=0.7
api-keyendpoint 替换为您的 Azure OpenAI 凭据。

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

@RestController
public class ChatController {

    private final AzureOpenAiChatModel chatModel;

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

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

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

手动配置

AzureOpenAiChatModel 实现 ChatModelStreamingChatModel,并使用 Azure OpenAI Java 客户端

要启用它,请将 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 依赖项还提供对 AzureOpenAiChatModel 的访问。有关 AzureOpenAiChatModel 的更多信息,请参阅 Azure OpenAI 聊天 部分。

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

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

var openAIChatOptions = AzureOpenAiChatOptions.builder()
  .withDeploymentName("gpt-35-turbo")
  .withTemperature(0.4f)
  .withMaxTokens(200)
  .build();

var chatModel = new AzureOpenAiChatModel(openAIClient, openAIChatOptions);

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

// Or with streaming responses
Flux<ChatResponse> response = chatModel.stream(
  new Prompt("Generate the names of 5 famous pirates."));
gpt-35-turbo 实际上是 Azure AI 门户中显示的 部署名称