人工智能 频道

Spring AI:面向 Java 开发人员的 AI 框架

  Spring 雄心勃勃的新企业 AI 框架为 Java 开发人员开始使用生成式 AI 提供了一个熟悉的切入点。它还利用了 Java 作为经过时间考验的企业集成平台的优势。让我们开始使用 Spring AI。

  过去几年来,人工智能一直是程序员的狂欢,而一种语言——Python——无疑是舞会上的美女。 Java 和其他语言已经有点被边缘化了。但现在我们正在进入一个新阶段,人工智能模型是机器学习的关键组成部分,关键问题是如何将其功能集成到更大的系统中。这种集成恰好是 Java 的专长。对于 Java 开发人员来说,更好的是 Spring 框架最近推出了Spring AI ,它简化了各种 AI 项目的编程。借助 Spring AI,您可以将熟悉的 Spring 语义以及您已经了解的有关企业基础架构的所有知识应用到机器学习中。

  在人工智能开发方面,Java 能否与 Python 相媲美?只有时间才能证明一切,但 Spring AI 是提出这种可能性的几个较新项目之一。我们来看一下。

  什么是 Spring AI?

  Spring AI 旨在封装广泛的 AI 工具提供者,包括支持自然语言处理和生成式 AI的库和框架:

  自然语言处理(NLP) :OpenAI 的 GPT、Google 的 Gemini、Hugging Face Transformers

  计算机视觉:TensorFlow、PyTorch、OpenAI 的 DALL-E

  语音识别和合成:Google Speech-to-Text、Amazon Transcribe、Azure 语音服务

  推荐系统:TensorFlow Recommenders、Amazon Personalize

  生成式人工智能:稳定扩散、OpenAI 的 DALL-E、Midjourney

  提取、转换、加载 (ETL) :向量存储转换

  Spring AI 还包括或计划包括用于异常检测、时间序列分析和强化学习的专门提供程序。您可以在Spring AI 概述页面上找到计划提供者的完整列表。 Spring 目前专注于LLM用例,并直接从 OpenAI或作为 Azure 服务支持 ChatGPT。其他人工智能提供商包括谷歌、Hugging Face 和亚马逊。

  未来的想法是以抽象形式包装这些服务,将各种 AI 工具集成到一致的 Spring 风格的组件系统中。在 Spring AI 模型中,POJO 将成为AI 领域应用程序的构建块。

  目前,让一个小聊天盒对自定义企业数据提供一致的响应可能是一项艰巨的任务。欢迎努力简化流程并使其更加顺畅。

  设置 Spring AI 项目

  使用 Spring AI 的一种方法是为其设置一个新的 Spring Boot 应用程序。在 CLI 中输入以下内容:

  spring boot new --from ai --name myProject

  或者,如果您已经有一个现有项目,则可以将以下内容添加到其中:

  spring boot add ai

  此命令将spring-ai-bom 依赖项添加到现有项目。

  Spring AI API

  Spring AI 的 API 由多个分支组成,其中最广泛的是Model 接口。模型提供了一个通用组件,开发人员可以使用该组件将几乎任何类型的 AI 功能集成到应用程序中。该接口还充当 AI 提供商在 Spring 生态系统中提供其平台的共同目标。

  在 Spring AI 中,许多不同类型的 AI 都被扩展为 Model 接口的实现,包括 ChatModel、EmbeddingModel、ImageModel 和 SpeechModel。还有一个称为 StreamingModel 的流版本,用于支持此类实现的提供者。

  这些模型实现封装了提供者完成的工作,这些工作由 ChatClient 实现使用。

  Spring AI 还支持函数调用,使自定义应用程序代码能够提供 API,AI 可以与之交互以形成其响应。到目前为止,Spring AI 支持:

  Anthropic Claude

  Azure OpenAI Azure

  Google VertexAI Gemini

  Groqgroq

  Mistral AI

  OllamaOlma

  OpenAI

  Spring AI 还包括对矢量数据库的 ETL(提取、转换、加载)支持。它被建模为文档读取器、转换器和写入器。涵盖所有主要供应商。

  Spring AI 还推出了广泛的嵌入支持。 EmbeddingModel 接口为各种提供程序抽象了文本到数字格式的转换。

  Spring AI 解决的另一个复杂领域是多模态。这允许您混合文本和图像。以下是 Spring AI 文档中的示例:

  byte[] imageData = new ClassPathResource("/multimodal.test.png").getContentAsByteArray();var userMessage = new UserMessage( "Explain what do you see in this picture?", // content

  List.of(new Media(MimeTypeUtils.IMAGE_PNG, imageData))); // mediaChatResponse response = chatModel.call(new Prompt(List.of(userMessage)));

  提示可以帮助您使用应用程序所需的任何一致框架(例如具有变量插值的视图)来构建用户输入。乍一看,提示似乎很简单,但实际上可能会带来相当多的复杂性,包括构建内容和角色等上下文信息。

  StructuredOutput 接口有助于构建模型的输出;当将输出引导到另一个系统作为输入时尤其重要。

  人工智能开发的另一个有趣的方面是测试,其中使用模型(可能与主要模型不同)来评估响应是一种重要的方法。 Spring AI包含对此需求的支持。

  Spring AI应用示例

  我们可以看一下Spring AI Azure Workshop存储库中一个简单示例的工作原理。该存储库包含一些示例,但让我们看一下最简单的示例。这是一个 Maven 布局的项目,首先要注意的是application.resources文件,其中包含以下行:

  // src/main/resources/application.resources

  spring.ai.azure.openai.chat.options.deployment-name=gpt-35-turbo-16k

  这将创建一个值为gpt-turbo-16k的属性。名称 spring.ai.azure.openai.chat.options.deployment-name 很重要,因为它通过自动配置绑定到 Spring Bean 配置器,该配置器将使用该参数生成 ChatClient。 pom.xml中的以下依赖项提供了该客户端:

  <dependency>

  <groupId>org.springframework.ai</groupId>

  <artifactId>spring-ai-azure-openai-spring-boot-starter</artifactId></dependency>

  本质上,当 Spring 扫描项目寻找 ChatClient 时,它将使用该属性来使用openai启动项目中的命名约定来创建一个 ChatClient。在我们正在查看的简单helloworld示例中,控制器调用 ChatClient:

  package com.xkcd.ai.helloworld;import org.springframework.ai.chat.ChatClient;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;import java.util.Map;@RestControllerpublic class SimpleAiController { private final ChatClient chatClient; @Autowired

  public SimpleAiController(ChatClient chatClient) { this.chatClient = chatClient;

  } @GetMapping("/ai/simple")

  public MapString, <String> generation( @RequestParam(value = "message", defaultValue = "Tell me a joke") String message) { return Map.of("generation", chatClient.call(message));

  }

  }

  这是一个典型的 Spring REST 控制器,其中chatClient成员是注释为@Autowired的方法。然后,该 ChatClient 用于处理/ai/simple处的请求。 (方法上提供了请求参数默认值,因此不带参数的请求将被设置为“告诉我一个笑话。”)端点方法返回一个带有“ Generation”键的映射,其值为chatClient.call(message)的返回值chatClient.call(message) 。

  为了使这一切发挥作用,您需要一个 Azure 的 API 密钥。密钥设置为环境变量:

  export SPRING_AI_AZURE_OPENAI_API_KEY=<INSERT KEY HERE>

  您还需要告诉引擎 AI 端点所在的位置:

  export SPRING_AI_AZURE_OPENAI_ENDPOINT=<INSERT ENDPOINT URL HERE>

  所有这些元素就位后,您可以使用$ maven spring-boot:run运行项目。现在,如果您访问localhost:8080/ai/simple ,您应该会看到一个 AI 生成的笑话。

  Azure 存储库中的其他示例演示了如何在此基本框架上添加其他功能。例如,您可以轻松地将提示模板添加到示例应用程序:

  // src/main/resources/prompts/joke-prompt.stTell me a {adjective} joke about {topic}

  在控制器中使用如下:

  @Value("classpath:/prompts/joke-prompt.st")

  private Resource jokeResource;

  然后在端点中,您可以添加类似以下内容:

  PromptTemplate promptTemplate = new PromptTemplate(jokeResource);

  Spring AI 的案例

  在采用一项技术之前要问的一个重要问题是投资回报是否合理。换句话说,看看新技术带来的复杂性和工作量。像 Spring 这样的工具的主要价值主张是简化和降低复杂性。 Spring 力求使事情变得更加一致,然后在该框架之上提供额外的功能。

  如果您追求简单性,您可能会想首先集成您使用的 AI 提供商,例如从应用程序代码调用 OpenAI 或 Google API。这种方法有一个直接性。但如果您的项目已经在使用 Spring,那么采用 Spring AI 可能更有意义,尤其是从长远来看。您的 AI 用例越复杂、越雄心勃勃(AI 肯定会趋于复杂性),您就越会欣赏 Spring AI 中的结构、一致性和模板。

0
相关文章