你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Azure 容器应用中的 Java PetClinic AI 示例概述

Spring PetClinic 示例是一个经典的参考应用程序,演示如何在 Java 中使用 Spring Boot。 本教程以 Azure 容器应用为基础构建的 AI 增强版本,该版本使用新式 AI 功能扩展了传统的 PetClinic 管理系统。

本教程中构建的应用程序是一个 AI 聊天助手,它使用检索增强生成 (RAG)。 若要连接到 Azure OpenAI 服务,该应用程序使用 Spring AI SDK 来支持 Web 应用程序。 有关 RAG 的详细信息,请参阅使用 Azure OpenAI 服务实现检索增强生成 (RAG)

该应用程序具有许多不同的服务,共同将 AI 相关功能引入 Spring PetClinic 示例。

Azure 容器应用中的 AI 应用体系结构

下图显示了 Azure 容器应用中的 AI 应用程序体系结构:

AI 应用程序体系结构示意图,其中包括容器应用环境、API 网关、用于身份验证的 Entra ID 和其他组件。

该应用程序的 API 网关托管在 Azure 容器应用环境中,充当所有外部请求的中心入口点。

该网关执行以下功能:

  • 路由和管理应用程序组件之间的通信。
  • 通过 Microsoft Entra ID 对用户进行身份验证。
  • 使用托管标识保护对 Azure 容器注册表和认知服务的访问。
  • 处理所有传入的外部用户请求。

该网关在专用虚拟网络中运行,确保应用程序与外部系统之间的通信安全且隔离。

下表描述了应用程序中的主要组件和服务:

服务或功能 说明
Azure Container Apps 用于生成和部署新式应用的完全托管的无服务器容器平台。 处理容器化应用程序的自动缩放、流量拆分和修订管理。
Azure 容器应用环境 围绕一组容器应用的安全边界,这些容器应用共享网络、缩放和管理配置。 为容器应用部署提供基础运行时。
Azure OpenAI 服务 提供对 OpenAI 的 ChatGPT、嵌入和强大的语言模型(如 GPT-4)的 REST API 访问权限。 启用具有企业级安全性和合规性功能的 AI 功能。
Azure 容器注册表 用于存储和管理容器映像的专用 Docker 注册表服务。 支持自动化容器生成、漏洞扫描和异地复制。
托管标识 为 Azure 服务提供 Azure AD 中的自动托管标识。 通过实现安全的服务到服务身份验证,且无需在代码中存储凭据,从而消除了对凭据管理的需求。
Spring AI 适用于 AI 工程的 Spring 框架,将 AI 设计原则应用于 Spring 生态系统。 另外,Langchain4j 是另一个 AI 框架,在 spring-petclinic-langchain4j 中有其自身的 PetClinic 示例。 有关详细信息,请参阅聊天客户端 API

有关基础结构作为应用程序的代码元素的详细信息,请参阅在 Azure 容器应用中引入首个 AI 应用存储库中的 bicep 脚本

代码实现

以下部分介绍代码,以帮助你了解首个 AI 应用程序的运行流程。

进行 REST 调用

控制器 ChatClient 负责与聊天客户端终结点通信。 PetclinicChatClient.java 中提交提示的语法包括提交用户输入的对象 chatClient

return this.chatClient.prompt().user(u -> u.text(query)).call().content();

聊天自定义

ChatConfiguration 类自定义发送到 chatClient 的请求。 以下列表描述了 chatClient 的一些关键配置设置:

  • 连接身份验证:客户端连接到 Azure OpenAI。 支持 API 密钥身份验证和托管标识身份验证。
  • 配置设置位置:对于 ChatModel,部署 gpt-4o 和温度 0.7 在配置文件中设置。
  • 矢量数据库:矢量数据库存储源文档的数学表示形式,称为“嵌入”。 聊天 API 使用矢量数据查找与用户问题相关的文档。
  • 系统提示:自定义 AI 行为并提高性能。
  • API 终结点:应用程序拥有自定义的 Azure Functions 终结点,以便 OpenAI 可以与应用程序交互。
  • 顾问:顾问提供了一种灵活而强大的方法来拦截、修改和增强 Spring 应用程序中的 AI 驱动的交互。

示例

以下代码示例演示 ChatClientCustomizer 类如何加载配置信息:

@Bean
public ChatClientCustomizer chatClientCustomizer(VectorStore vectorStore, ChatModel model) {
    ChatMemory chatMemory = new InMemoryChatMemory();

    return b -> b.defaultSystem(systemResource)
        .defaultFunctions("listOwners", "listVets", "addPetToOwner", "addOwnerToPetclinic")
        .defaultAdvisors(new PromptChatMemoryAdvisor(chatMemory),
            new ModeledQuestionAnswerAdvisor(vectorStore, SearchRequest.defaults(), model));
}

API 终结点

java.util.Function 下定义的 Beans 是应用程序上下文中定义的函数。 这些函数是 AI 模型和 PetClinic 应用程序之间的接口。

AIFunctionConfiguration.java 中存在与 PetClinic 应用程序通信的示例函数。 请记住以下有关这些函数的详细信息:

  • 函数的 @Description 注释可帮助 AI 模型理解自然语言中的函数。
  • 函数体因业务需求而各有不同。

顾问

顾问是修改或增强 AI 提示的组件,充当提示处理的中间件。

该应用程序使用两个不同的顾问:

  • QuestionAnswerAdvisor 调用 AI 模型以生成新的用户查询,该查询包括搜索向量的结果,然后再完成提示。
  • PromptChatMemoryAdvisor 将聊天内存添加到提示中,并向聊天模型提供对话历史记录。 在此上下文中,AI 模型可以记住聊天上下文并提高聊天质量。

有关详细信息,请参阅顾问 API

后续步骤