Azure的OpenAI服务由ChatGPT提供支持,不仅继承了传统OpenAI的能力,还通过增强功能提供了由AI推动的文本生成服务。Azure提供了额外的AI安全和负责任的AI特性,正如他们最近更新的文章[这里](https://techcommunity.microsoft.com/t5/ai-azure-ai-services-blog/announcing-new-ai-safety-amp-responsible-ai-features-in-azure/ba-p/3983686)所强调的那样。

Azure为Java开发人员提供了利用AI全部潜力的机会,通过将其与一系列Azure服务集成在一起,包括诸如Azure上的矢量存储等AI相关资源。

先决条件

从链接:https://portal.azure.com[Azure门户]上的Azure OpenAI服务部分获取您的Azure OpenAI endpoint(终端点)和`api-key`(API密钥)。Spring AI定义了一个配置属性名为`spring.ai.azure.openai.api-key`,您应将其设置为从Azure获得的`API Key`(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 Portal](https://oai.azure.com/portal)创建一个Azure AI部署。

在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.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 聊天客户端提供了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'
}
Tip
请参考依赖管理部分以将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 是配置 ChatClient 实现为 Azure OpenAI 的属性前缀。

属性 描述 默认值

spring.ai.azure.openai.chat.enabled

启用 Azure OpenAI 聊天客户端。

true

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

与 Azure 使用相关,这指的是你的模型的“部署名称”,你可以在 https://oai.azure.com/portal 找到。值得注意的是,在 Azure OpenAI 部署中,“部署名称”与模型本身是不同的。围绕这些术语的混淆源于让 Azure OpenAI 客户端库与原始 OpenAI 端点兼容的意图。Azure OpenAI 与 Sam Altman 的 OpenAI 提供的部署结构有很大的不同。

部署模型名称,作为这个完成请求的一部分提供。

gpt-3.5-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 令牌 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

影响基于其在生成文本中的累积频率生成的令牌出现概率的值。正值会随着频率的增加使令牌不太可能出现,并减少模型重复相同声明的可能性。

-

Tip
所有以`spring.ai.azure.openai.chat.options`为前缀的属性可以在运行时被重写,通过在`Prompt`调用中添加一个特定请求的[chat-options]来实现。

运行时选项

链接:https://github.com/spring-projects/spring-ai/blob/main/models/spring-ai-azure-openai/src/main/java/org/springframework/ai/azure/openai/AzureOpenAiChatOptions.java [AzureOpenAiChatOptions.java]提供了模型配置,例如要使用的模型、温度、频率惩罚等。

在启动时,可以使用`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()
    ));

函数调用

您可以使用AzureOpenAiChatClient注册自定义的Java函数,并让模型智能地选择输出一个包含调用一个或多个已注册函数的参数的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.model=gpt-35-turbo
spring.ai.azure.openai.chat.options.temperature=0.7
Tip
请将 api-keyendpoint 替换为您的 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);
    }
}

手动配置

要启用它,请将 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'
}
Tip
请参考依赖管理部分以将Spring AI BOM添加到您的构建文件中。
Tip
spring-ai-azure-openai` 依赖同样提供了访问 AzureOpenAiChatClient 的能力。要了解更多关于 AzureOpenAiChatClient 的信息,请参考链接:../chat/azure-openai-chat.html[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("Generate the names of 5 famous pirates."));

// 或者使用流响应
Flux<ChatResponse> response = chatClient.stream(
    new Prompt("生成5个著名海盗的名字。"));
Note
gpt-35-turbo` 实际上是在 Azure AI 门户中呈现的 Deployment Name