Spring AI 参考指南 :Java Spring + AI!Java也可以轻松实现AI!

人工智能
后台-插件-广告管理-内容页头部广告(手机)
 

在生成式人工智能的浪潮中,每个人都希望在一定程度上利用人工智能工具的能力。从这个前景出发,Spring 社区挺身而出,提供了一个名为“Spring AI”的模块,以便与 AI 工具交互并获得期望的结果。Spring AI 旨在简化集成人工智能功能的应用程序的开发,避免不必要的复杂性。

Spring AI 提供了作为开发 AI 应用程序基础的抽象。这些抽象有多种实现,可以通过最少的代码更改轻松进行组件交换。例如,Spring AI 引入了 ChatClient 接口以及 OpenAI 和 Azure OpenAI 的实现。

在本篇 Spring AI 介绍中,我们将讨论如何在基于 Spring 的应用程序中添加 AI 以及相关概念。

使用 Spring AI Reference 的前提条件

1)你是一名 Spring 开发者,想要学习 Spring AI

2) 希望将 AI 合并到现有应用程序中

3) ChatGPT 或任何其他类似工具中使用的提示的基本知识

什么是生成人工智能中的提示?

在生成人工智能中,“提示(prompt)”是指提供给语言模型以生成响应或输出的输入。提示充当我们用来生成文本的起点或查询。它可以是一个句子、一个段落,甚至是一系列指令,指导我们生成有意义且上下文相关的内容。提示引导人工智能模型产生特定的输出。编写有效的提示对于提高结果输出至关重要。

什么是提示模板?

“提示模板(Prompt templates)”是指生成人工智能中的提示的预定义或可重用结构。这些模板提供了标准化格式或指令集,用户可以遵循这些格式或指令来有效地与语言模型进行交互。这些模板通常包含占位符或插槽,用户可以在其中插入与其任务相关的特定信息。为此,Spring AI 使用 OSS 库 StringTemplate。

例如,考虑简单的提示模板:

将以下英文文本翻译成汉语:“{text}”

在此模板中,{text} 是一个占位符,用户可以将其替换为他们想要翻译的实际文本。

给我讲一个关于{content}的{adjective}笑话。

在此模板中,{adjective} 和 {content} 是占位符,用户可以将其替换为实际文本以获得所需的结果。

在Spring AI中,提示模板可以比作Spring MVC架构中的“视图(View)”。提供模型对象(通常是 java.util.Map)来填充模板内的占位符。“rendered”字符串成为提供给 AI 模型的提示内容。

Spring AI 中的 ChatClient 是什么?

ChatClient 是一个功能接口,简化了与AI 模型的交互。它有助于连接到可能具有不同工作方式的不同人工智能模型。该界面目前仅适用于文本输入和输出,但我们应该期待将来有更多类型。请记住,某些类和接口可能会在后期发生变化。ChatClient接口结构如下:

@FunctionalInterfacepublic interface ChatClient {    default String generate(String message) {        // implementation omitted    }    ChatResponse generate(Prompt prompt);}

ChatClient 接口的主要目标是:

可移植性:它可以轻松地与不同的人工智能模型集成。开发人员可以在模型之间切换,而无需更改大量代码。这非常符合 Spring 模块化且易于切换部件的理念。

简单性: ChatClient 界面使用 Prompt 等帮助器类进行输入,ChatResponse 进行输出。这使得与人工智能模型的对话变得更加容易。它处理准备请求和理解响应的复杂部分。总的来说,它提供了一种与人工智能模型交互的直接方式。

Spring AI 中的 ChatResponse 是什么?

它保存 AI 模型返回的内容,并且每个 Generation 实例都有单个提示的可能输出之一。ChatResponse 类的结构如下:

public class ChatResponse{      private final List<Generation> generations;    // other methods omitted }

ChatResponse 类还有一个带有 key-value 映射 的一个 Map。该 Map 提供了有关 AI 模型响应的额外信息。但是,此功能仍在开发中,官方文档中没有详细说明。

如何在应用程序中使用 Spring AI 模块

以下是将 Spring AI 合并到我们现有的基于 Spring 的应用程序中的简单步骤:

1) 使用 IDE 创建一个项目

2) 添加依赖项以使用 Spring AI 的功能

3) 在 application.xml 或 application.yml 文件中添加 openAI 键值属性

4) 创建 RestController

在应用程序中添加 OpenAI 依赖项

有两种流行的方法可以在我们现有的应用程序中包含启动器(依赖组件):

1)使用Spring初始化器

2)使用IDE

由于 Spring AI 还处于不成熟的版本。无法使用 Spring Initializer 或 IDE 将其添加到新创建的项目中。以下是我们需要添加的依赖项:

<dependency>    <groupId>org.springframework.ai</groupId>    <artifactId>spring-ai-openai-spring-boot-starter</artifactId>    <version>0.8.0-SNAPSHOT</version></dependency>

在下面的demo中,我们使用“0.8.0-SNAPSHOT”。也可以尝试使用 openAI 依赖项的最新可用版本。

现有的存储库可能无法下载上述依赖项,因此需要添加一个附加存储库才能下载它:

<repositories>   <repository>      <id>spring-snapshots</id>      <name>Spring Snapshots</name>      <url>https://repo.spring.io/snapshot</url>      <releases>        <enabled>false</enabled>      </releases>   </repository></repositories>

获取OpenAI秘钥

 

获取密钥在 application.properties 文件中添加“spring.ai.openai.api-key”的值。

参考:使用 Spring Boot 创建自己的 ChatGPT 应用程序

使用 Spring AI 实现 Hello World 示例

让我们使用 Spring AI 实现第一个“Hello World”示例。

注意: Spring AI 处于开发阶段,尚未达到成熟状态。因此,我们有可能在未来的版本中看到频繁的 API 更改。因此,建议在使用前查看API文档是否有最新变更。

步骤#1:创建 Spring Boot 入门项目

我们使用 IDE 来开发这个示例。在创建项目时添加 2 个 boot 模块 “Spring Web”和“Spring Boot DevTools”。

步骤#2:在 pom.xml 中添加 OpenAI 依赖项

按照本文上面提到的方式添加依赖项。

步骤#3:在 application.xml 中添加 OpenAI 密钥值

添加 OpenAI 密钥值,如下所示。

spring.ai.openai.api-key= 你的 OpenAI 密钥

步骤#4:创建 RestController

让我们创建第一个与 OpenAI 交互的示例。

import org.springframework.ai.chat.ChatClient;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestController@RequestMapping("/prompt")public class AIPromptController {   private final ChatClient chatClient;   public AIPromptController(ChatClient chatClient) {      this.chatClient= chatClient;   }   @GetMapping("/hello")   public String testAiPrompt() {      String prompt= "Hello! What is Spring Boot?";      return chatClient.generate(prompt);   }}

使用 Spring AI 的另一个示例

让我们使用占位符开发另一个示例来避免硬编码值。

import org.springframework.ai.chat.ChatClient;import org.springframework.ai.chat.ChatResponse;import org.springframework.ai.parser.BeanOutputParser;import org.springframework.ai.prompt.Prompt;import org.springframework.ai.prompt.PromptTemplate;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import com.example.spring.ai.test.entity.TopLanguage;@RestController @RequestMapping("/prompt")public class AIPromptController {        private final ChatClient chatClient;      public AIPromptController(ChatClient chatClient) {       this.chatClient= chatClient;     }      @GetMapping("/learn/{topic}")   public String getTopic(@PathVariable("topic") String topic) {            //'topic'是提示中的占位符      PromptTemplate promptTemplate = new PromptTemplate("""        I just started learning Spring. Can you provide me         fundamentals of {topic} to get started?        Please provide me short and concise details in simple language.      """);      promptTemplate.add("topic", topic);      return this.chatClient.generate(promptTemplate.create()).getGeneration().getContent();   }   @GetMapping("/getLanguage/{year}")   public TopLanguage getTopLanguage(@PathVariable("year") int year) {      BeanOutputParser<TopLanguage> parser = new BeanOutputParser<>(TopLanguage.class);      //'year' 是提示符中的占位符      String prompt= """        Which is the top programming Language in the year {year}?        {format}      """;      PromptTemplate template = new PromptTemplate(prompt);      template.add("year", year);      template.add("format", parser.getFormat());      template.setOutputParser(parser);      System.out.println("Format String: "+parser.getFormat());      Prompt promt= template.create();      ChatResponse chatResponse= chatClient.generate(promt);      String text= chatResponse.getGeneration().getContent();      return parser.parse(text);   } }

让我们创建 TopLanguage 作为记录:

public record TopLanguage(String language, int year, int percentage) {}

如何测试输出?

为了测试我们示例的输出使用 Postman 测试。

1) 点击 URL https://localhost:8080/prompt/hello 查看第一个方法的预期输出。

2) 点击 URL https://localhost:8080/prompt/learn/spring core 来测试第二种方法的预期输出。

3)点击 URL https://localhost:8080/prompt/getLanguage/2020 来测试第三种方法的输出。在此方法中,我们使用了格式,因此输出应为 json 形式,如下所示:

{"language": "Java","percentage": 75.8,"year": 2020}

参考


使用 Spring Boot 创建自己的 ChatGPT 应用程序

https://docs.spring.io/spring-ai/reference/index.html

后台-插件-广告管理-内容页尾部广告(手机)
标签:

评论留言

我要留言

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。