在天生式人工智能的浪潮中,每个人都希望在一定程度上利用人工智能工具的能力。
从这个前景出发,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

Spring AI 参考指南 Java Spring  AIJava也可以轻松实现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