Azure OpenAI Chat

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

Azure 为 Java 开发人员提供了通过将 AI 与一系列 Azure 服务集成来充分发挥 AI 潜力的机会,其中包括与 AI 相关的资源,例如 Azure 上的 Vector Stores。

先决条件

Azure 门户 上的 Azure OpenAI 服务 获取你的 Azure OpenAI endpointapi-key

Spring AI 定义了一个名为 spring.ai.azure.openai.api-key 的配置属性,您应该将其设置为从 Azure 获取的值。还有一个名为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 Portal 创建一个 Azure AI Deployment .

在 Azure 中,每个客户端必须指定一个Deployment Name 连接到 Azure OpenAI 服务。

必须了解 Deployment Name 与您选择部署的模型不是一回事。

对于实例,一个名称为 'MyAiDeployment' 的 部署,可以是使用 GPT 3.5 Turbo 模型 部署的也可以是使用 GPT 4.0 模型.

现在,为了简单起见,您可以使用以下设置创建部署:

Deployment Name: `gpt-35-turbo`
Model Name: `gpt-35-turbo`

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

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

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

Azure OpenAI 和 OpenAI 的不同部署结构导致 Azure OpenAI 客户端库中有一个名为 deploymentOrModelName 的参数 .这是因为在 OpenAI 中没有Deployment Name,只有 Model Name.

在后续版本中,Spring AI 将该属性重命名 spring.ai.azure.openai.chat.options.modelspring.ai.azure.openai.chat.options.deployment-name 以避免混淆。

添加存储库和 BOM

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

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

自动配置

Spring AI 为 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'
}

Chat 属性

连接属性

spring.ai.azure.openai 前缀的属性,可让您配置 Azure OpenAI Chat 客户端的连接。

属性 描述 默认值
spring.ai.azure.openai.api-key Azure AI OpenAI Resource Management => Keys and Endpoint 下的 Key -
spring.ai.azure.openai.endpoint Azure AI OpenAI Resource Management => Keys and Endpoint 下的 Endpoint -
配置属性

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 * In use with Azure, this refers to the “Deployment Name” of your model, which you can find at https://oai.azure.com/portal. It’s important to note that within an Azure OpenAI deployment, the “Deployment Name” is distinct from the model itself. The confusion around these terms stems from the intention to make the Azure OpenAI client library compatible with the original OpenAI endpoint. The deployment structures offered by Azure OpenAI and Sam Altman’s OpenAI differ significantly. Deployments model name to provide as part of this completions request. gpt-35-turbo
spring.ai.azure.openai.chat.options.maxTokens The maximum number of tokens to generate. -
spring.ai.azure.openai.chat.options.temperature The sampling temperature to use that controls the apparent creativity of generated completions. Higher values will make output more random while lower values will make results more focused and deterministic. It is not recommended to modify temperature and top_p for the same completions request as the interaction of these two settings is difficult to predict. 0.7
spring.ai.azure.openai.chat.options.topP An alternative to sampling with temperature called nucleus sampling. This value causes the model to consider the results of tokens with the provided probability mass. -
spring.ai.azure.openai.chat.options.logitBias A map between GPT token IDs and bias scores that influences the probability of specific tokens appearing in a completions response. Token IDs are computed via external tokenizer tools, while bias scores reside in the range of -100 to 100 with minimum and maximum values corresponding to a full ban or exclusive selection of a token, respectively. The exact behavior of a given bias score varies by model. -
spring.ai.azure.openai.chat.options.user An identifier for the caller or end user of the operation. This may be used for tracking or rate-limiting purposes. -
spring.ai.azure.openai.chat.options.n The number of chat completions choices that should be generated for a chat completions response. -
spring.ai.azure.openai.chat.options.stop A collection of textual sequences that will end completions generation. -
spring.ai.azure.openai.chat.options.presencePenalty A value that influences the probability of generated tokens appearing based on their existing presence in generated text. Positive values will make tokens less likely to appear when they already exist and increase the model’s likelihood to output new topics. -
spring.ai.azure.openai.chat.options.frequencyPenalty A value that influences the probability of generated tokens appearing based on their cumulative frequency in generated text. Positive values will make tokens less likely to appear as their frequency increases and decrease the likelihood of the model repeating the same statements verbatim. -

*提示: *所有 spring.ai.azure.openai.chat.options 前缀的属性, 可以在运行期间通过添加特定请求参数到 Prompt 调用 实现覆盖.

聊天选项

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

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

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

ChatResponse response = chatClient.call(
    new Prompt(
        "Generate the names of 5 famous pirates.",
        AzureOpenAiChatOptions.builder()
            .withModel("gpt-4-32k")
            .withTemperature(0.4)
        .build()
    ));

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

Function Calling(函数调用)

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

Sample Controller (自动配置)

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

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

spring.ai.azure.openai.api-key=YOUR_API_KEY
spring.ai.azure.openai.endpoint=YOUR_ENDPOINT
spring.ai.azure.openai.chat.options.model=gpt-35-turbo
spring.ai.azure.openai.chat.options.temperature=0.7

提示: 替换api-key为您的 Azure OpenAI 凭据。

这将创建一个可以注入到您的类中的 AzureOpenAiChatClient 实现。下面是一个@Controller使用聊天客户端生成文本的简单类的示例。

@RestController
public class ChatController {

    private final AzureOpenAiChatClient chatClient;

    @Autowired
    public ChatController(AzureOpenAiChatClient chatClient) {
        this.chatClient = chatClient;
    }

    @GetMapping("/ai/generate")
    public Map generate(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
        return Map.of("generation", chatClient.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 chatClient.stream(prompt);
    }
}

手动配置

AzureOpenAiChatClient 实现 ChatClientStreamingChatClient, 并使用 Azure OpenAI Java Client 连接到 OpenAI 服务。

添加 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-azure-openai 依赖项还提供对AzureOpenAiChatClient. 有关 AzureOpenAiChatClient 更多信息,请参阅 Azure OpenAI 聊天部分。

接下来,创建一个 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("Generate the names of 5 famous pirates."));

// Or with streaming responses
Flux<ChatResponse> response = chatClient.stream(
    new Prompt("Generate the names of 5 famous pirates."));

*注意: *这里的 gpt-35-turbo 实际上是Azure AI 门户中的 Deployment Name.

作者:Jeebiz  创建时间:2024-04-05 23:36
最后编辑:Jeebiz  更新时间:2024-07-06 19:00