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