Azure OpenAI 聊天

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

Azure 为 Java 开发人员提供了利用 AI 的全部潜力的机会,方法是将 AI 与一系列 Azure 服务集成,其中包括 AI 相关资源,例如 Azure 上的 Vector Stores。spring-doc.cadn.net.cn

先决条件

Azure OpenAI 客户端提供三个连接选项:使用 Azure API 密钥或使用 OpenAI API 密钥,或使用 Microsoft Entra ID。spring-doc.cadn.net.cn

Azure API 密钥和端点

获取 Azure OpenAIendpointapi-keyAzure 门户上的 Azure OpenAI 服务部分。spring-doc.cadn.net.cn

Spring AI 定义了两个配置属性:spring-doc.cadn.net.cn

  1. spring.ai.azure.openai.api-key:将此设置为API Key从 Azure 获得。spring-doc.cadn.net.cn

  2. spring.ai.azure.openai.endpoint:将此设置为在 Azure 中预置模型时获取的终端节点 URL。spring-doc.cadn.net.cn

您可以通过导出环境变量来设置这些配置属性:spring-doc.cadn.net.cn

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

OpenAI 密钥

要使用 OpenAI 服务(而不是 Azure)进行身份验证,请提供 OpenAI API 密钥。这会自动将终端节点设置为 api.openai.com/v1spring-doc.cadn.net.cn

使用此方法时,请将spring.ai.azure.openai.chat.options.deployment-nameproperty 添加到您要使用的 OpenAI 模型的名称中。spring-doc.cadn.net.cn

export SPRING_AI_AZURE_OPENAI_OPENAI_API_KEY=<INSERT OPENAI KEY HERE>

Microsoft Entra ID

要使用 Microsoft Entra ID(以前称为 Azure Active Directory)进行身份验证,请创建一个TokenCredentialbean 的配置。 如果此 Bean 可用,则OpenAIClient实例。 屋宇 署 === 部署名称spring-doc.cadn.net.cn

要使用 Azure AI 应用程序,您需要通过 Azure AI 门户创建 Azure AI 部署。 在 Azure 中,每个客户端都必须指定一个Deployment Name连接到 Azure OpenAI 服务。 请务必注意,Deployment Name与您选择部署的模型不同。 例如,可以将名为“MyAiDeployment”的部署配置为使用 GPT 3.5 Turbo 模型或 GPT 4.0 模型。spring-doc.cadn.net.cn

要开始使用,请按照以下步骤创建具有默认设置的部署:spring-doc.cadn.net.cn

Deployment Name: `gpt-4o`
Model Name: `gpt-4o`

此 Azure 配置与 Spring Boot Azure AI Starter 及其自动配置功能的默认配置一致。 如果你使用不同的 Deployment Name,请确保相应地更新 configuration 属性:spring-doc.cadn.net.cn

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

Azure OpenAI 和 OpenAI 的不同部署结构会导致 Azure OpenAI 客户端库中名为deploymentOrModelName. 这是因为在 OpenAI 中没有Deployment Name,则只有一个Model Name.spring-doc.cadn.net.cn

物业spring.ai.azure.openai.chat.options.model已重命名为spring.ai.azure.openai.chat.options.deployment-name.
如果您决定连接到OpenAI而不是Azure OpenAI,通过设置spring.ai.azure.openai.openai-api-key=<Your OpenAI Key>财产 然后spring.ai.azure.openai.chat.options.deployment-name被视为 OpenAI 模型名称。

访问 OpenAI 模型

您可以将客户端配置为直接使用OpenAI而不是Azure OpenAI部署的模型。 为此,您需要设置spring.ai.azure.openai.openai-api-key=<Your OpenAI Key>而不是spring.ai.azure.openai.api-key=<Your Azure OpenAi Key>.spring-doc.cadn.net.cn

添加存储库和 BOM

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

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

自动配置

Spring AI 为 Azure OpenAI 聊天客户端提供 Spring Boot 自动配置。 要启用它,请将以下依赖项添加到项目的 Maven 中pom.xml或 Gradlebuild.gradlebuild 文件:spring-doc.cadn.net.cn

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-azure-openai-spring-boot-starter</artifactId>
</dependency>
dependencies {
    implementation 'org.springframework.ai:spring-ai-azure-openai-spring-boot-starter'
}
请参阅 Dependency Management 部分,将 Spring AI BOM 添加到您的构建文件中。

聊天属性

前缀spring.ai.azure.openai是用于配置与 Azure OpenAI 的连接的属性前缀。spring-doc.cadn.net.cn

财产 描述 违约

spring.ai.azure.openai.api-keyspring-doc.cadn.net.cn

来自 Azure AI OpenAI 的密钥Keys and Endpoint部分Resource Managementspring-doc.cadn.net.cn

-spring-doc.cadn.net.cn

spring.ai.azure.openai.endpointspring-doc.cadn.net.cn

Azure AI OpenAI 中的终结点Keys and Endpoint部分Resource Managementspring-doc.cadn.net.cn

-spring-doc.cadn.net.cn

spring.ai.azure.openai.openai-api-keyspring-doc.cadn.net.cn

(非 Azure)OpenAI API 密钥。用于使用 OpenAI 服务进行身份验证,而不是使用 Azure OpenAI 进行身份验证。 这会自动将终端节点设置为 api.openai.com/v1。使用任一api-keyopenai-api-key财产。 使用此配置,spring.ai.azure.openai.chat.options.deployment-name作为 OpenAi 模型名称受到威胁。spring-doc.cadn.net.cn

-spring-doc.cadn.net.cn

spring.ai.azure.openai.custom-headersspring-doc.cadn.net.cn

要包含在 API 请求中的自定义标头的映射。映射中的每个条目都表示一个标头,其中 key 是标头名称,value 是标头值。spring-doc.cadn.net.cn

空地图spring-doc.cadn.net.cn

前缀spring.ai.azure.openai.chat是配置ChatModelAzure OpenAI 的实现。spring-doc.cadn.net.cn

财产 描述 违约

spring.ai.azure.openai.chat.enabledspring-doc.cadn.net.cn

启用 Azure OpenAI 聊天模型。spring-doc.cadn.net.cn

spring-doc.cadn.net.cn

spring.ai.azure.openai.chat.options.deployment-namespring-doc.cadn.net.cn

在 Azure 中使用时,这是指模型的“部署名称”,您可以在 oai.azure.com/portal 中找到该名称。 请务必注意,在 Azure OpenAI 部署中,“部署名称”与模型本身不同。 围绕这些术语的混淆源于使 Azure OpenAI 客户端库与原始 OpenAI 终结点兼容的意图。 Azure OpenAI 和 Sam Altman 的 OpenAI 提供的部署结构差异很大。 部署模型名称,作为此完成请求的一部分提供。spring-doc.cadn.net.cn

GPT-4O 型spring-doc.cadn.net.cn

spring.ai.azure.openai.chat.options.maxTokensspring-doc.cadn.net.cn

要生成的最大令牌数。spring-doc.cadn.net.cn

-spring-doc.cadn.net.cn

spring.ai.azure.openai.chat.options.temperaturespring-doc.cadn.net.cn

要使用的采样温度,用于控制生成的完成项的明显创造性。较高的值将使输出更具随机性,而较低的值将使结果更加集中和确定。不建议为相同的 completions 请求修改 temperature 和 top_p,因为这两个设置的交互很难预测。spring-doc.cadn.net.cn

0.7spring-doc.cadn.net.cn

spring.ai.azure.openai.chat.options.topPspring-doc.cadn.net.cn

一种称为细胞核采样的温度采样的替代方法。此值使模型考虑具有提供的概率质量的标记的结果。spring-doc.cadn.net.cn

-spring-doc.cadn.net.cn

spring.ai.azure.openai.chat.options.logitBiasspring-doc.cadn.net.cn

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

-spring-doc.cadn.net.cn

spring.ai.azure.openai.chat.options.userspring-doc.cadn.net.cn

作的调用方或最终用户的标识符。这可能用于跟踪或速率限制目的。spring-doc.cadn.net.cn

-spring-doc.cadn.net.cn

spring.ai.azure.openai.chat.options.nspring-doc.cadn.net.cn

应为聊天完成响应生成的聊天完成选项的数量。spring-doc.cadn.net.cn

-spring-doc.cadn.net.cn

spring.ai.azure.openai.chat.options.stopspring-doc.cadn.net.cn

将结束 completions 生成的文本序列的集合。spring-doc.cadn.net.cn

-spring-doc.cadn.net.cn

spring.ai.azure.openai.chat.options.presencePenaltyspring-doc.cadn.net.cn

一个值,该值根据生成的标记在生成的文本中的现有存在来影响生成标记的出现概率。正值将使标记在已经存在时不太可能出现,并增加模型输出新主题的可能性。spring-doc.cadn.net.cn

-spring-doc.cadn.net.cn

spring.ai.azure.openai.chat.options.responseFormatspring-doc.cadn.net.cn

一个对象,用于指定模型必须输出的格式。用AzureOpenAiResponseFormat.JSON启用 JSON 模式,该模式保证模型生成的消息是有效的 JSON。使用 AzureOpenAiResponseFormat.TEXT 可启用 TEXT 模式。spring-doc.cadn.net.cn

-spring-doc.cadn.net.cn

spring.ai.azure.openai.chat.options.frequencyPenaltyspring-doc.cadn.net.cn

一个值,该值根据生成的标记在生成的文本中的累积频率来影响生成标记的出现概率。正值将使令牌不太可能随着频率的增加而出现,并降低模型逐字重复相同语句的可能性。spring-doc.cadn.net.cn

-spring-doc.cadn.net.cn

spring.ai.azure.openai.chat.options.proxy-tool-callsspring-doc.cadn.net.cn

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

spring-doc.cadn.net.cn

所有前缀为spring.ai.azure.openai.chat.options可以通过将特定于请求的运行时选项添加到Prompt叫。

运行时选项

AzureOpenAiChatOptions.java 提供模型配置,例如要使用的模型、温度、频率损失等。spring-doc.cadn.net.cn

启动时,可以使用AzureOpenAiChatModel(api, options)constructor 或spring.ai.azure.openai.chat.options.*性能。spring-doc.cadn.net.cn

在运行时,您可以通过向Prompt叫。 例如,要覆盖特定请求的默认模型和温度:spring-doc.cadn.net.cn

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

函数调用

可以使用 AzureOpenAiChatModel 注册自定义 Java 函数,并让模型智能地选择输出包含参数的 JSON 对象,以调用一个或多个已注册的函数。 这是一种将 LLM 功能与外部工具和 API 连接起来的强大技术。 详细了解 Azure OpenAI 函数调用spring-doc.cadn.net.cn

模 态

多模态是指模型同时理解和处理来自各种来源的信息(包括文本、图像、音频和其他数据格式)的能力。 目前,Azure OpenAIgpt-4oModel 提供多模态支持。spring-doc.cadn.net.cn

Azure OpenAI 可以将 base64 编码的图像列表或图像 URL 与消息合并。 Spring AI 的 Message 接口通过引入 Media 类型来促进多模态 AI 模型。 此类型包含有关消息中媒体附件的数据和详细信息,使用 Spring 的org.springframework.util.MimeType以及java.lang.Object对于原始媒体数据。spring-doc.cadn.net.cn

下面是一个摘自 OpenAiChatModelIT.java 的代码示例,说明了使用GPT_4_O型。spring-doc.cadn.net.cn

URL url = new URL("https://docs.spring.io/spring-ai/reference/_images/multimodal.test.png");
String response = ChatClient.create(chatModel).prompt()
        .options(AzureOpenAiChatOptions.builder().withDeploymentName("gpt-4o").build())
        .user(u -> u.text("Explain what do you see on this picture?").media(MimeTypeUtils.IMAGE_PNG, this.url))
        .call()
        .content();
您也可以传递多个图像。

它将multimodal.test.png图像:spring-doc.cadn.net.cn

多模态测试图像

以及文本消息 “Explain what do you see on this picture?”,并生成如下响应:spring-doc.cadn.net.cn

This is an image of a fruit bowl with a simple design. The bowl is made of metal with curved wire edges that
create an open structure, allowing the fruit to be visible from all angles. Inside the bowl, there are two
yellow bananas resting on top of what appears to be a red apple. The bananas are slightly overripe, as
indicated by the brown spots on their peels. The bowl has a metal ring at the top, likely to serve as a handle
for carrying. The bowl is placed on a flat surface with a neutral-colored background that provides a clear
view of the fruit inside.

您还可以传入 Classpath 资源而不是 URL,如下例所示spring-doc.cadn.net.cn

Resource resource = new ClassPathResource("multimodality/multimodal.test.png");

String response = ChatClient.create(chatModel).prompt()
    .options(AzureOpenAiChatOptions.builder()
    .withDeploymentName("gpt-4o").build())
    .user(u -> u.text("Explain what do you see on this picture?")
    .media(MimeTypeUtils.IMAGE_PNG, this.resource))
    .call()
    .content();

Samples控制器

创建一个新的 Spring Boot 项目并添加spring-ai-azure-openai-spring-boot-starter添加到您的 POM(或 Gradle)依赖项中。spring-doc.cadn.net.cn

添加application.properties文件中的src/main/resources目录中,以启用和配置 OpenAi 聊天模型:spring-doc.cadn.net.cn

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-4o
spring.ai.azure.openai.chat.options.temperature=0.7
api-keyendpoint替换为您的 Azure OpenAI 凭据。

这将创建一个AzureOpenAiChatModel实现,您可以将其注入到您的类中。 下面是一个简单的示例@Controller使用 Chat 模型生成文本的类。spring-doc.cadn.net.cn

@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", this.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 this.chatModel.stream(prompt);
    }
}

手动配置

AzureOpenAiChatModel 实现ChatModelStreamingChatModel并使用 Azure OpenAI Java 客户端spring-doc.cadn.net.cn

要启用它,请添加spring-ai-azure-openai依赖项添加到项目的 Mavenpom.xml文件:spring-doc.cadn.net.cn

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

或发送到您的 Gradlebuild.gradlebuild 文件。spring-doc.cadn.net.cn

dependencies {
    implementation 'org.springframework.ai:spring-ai-azure-openai'
}
请参阅 Dependency Management 部分,将 Spring AI BOM 添加到您的构建文件中。
spring-ai-azure-openai依赖项还提供对AzureOpenAiChatModel.有关AzureOpenAiChatModel请参阅 Azure OpenAI Chat 部分。

接下来,创建一个AzureOpenAiChatModel实例并使用它来生成文本响应:spring-doc.cadn.net.cn

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-4o")
  .withTemperature(0.4)
  .withMaxTokens(200)
  .build();

var chatModel = new AzureOpenAiChatModel(this.openAIClient, this.openAIChatOptions);

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

// Or with streaming responses
Flux<ChatResponse> response = this.chatModel.stream(
  new Prompt("Generate the names of 5 famous pirates."));
gpt-4o实际上是Deployment Name如 Azure AI 门户中所示。