我用 Spring AI 集成 OpenAI ChatGPT API 创建了一个 Spring Boot 小程序

将 OpenAI 的 ChatGPT API 与 Spring Boot 中的 Spring AI 相集成

在 Spring Boot Java 框架中集成 OpenAI 的 ChatGPT API 和 Spring AI.

目标:

我在今天的文章中将探讨如何在 Spring Boot 应用程序中集成 OpenAI ChatGPT API 和 Spring AI. 我们的目标是创建一个 Spring Boot 应用程序, 该应用程序可以使用 OpenAI ChatGPT API 和 Spring AI 生成对所提供 Prompt 的响应.

什么是 ChatGPT?

ChatGPT 是生成式AI的一种形式, 用户可以输入 Prompt , 并收到由AI创建的类人的图像, 文本或视频形式的输出.

ChatGPT 是 OpenAI 的一部分, 它利用 GPT-3.5, GPT-4 等各种模型来根据给定的 Prompt 生成回复.

什么是 ChatGPT 中的 Prompt ?

ChatGPT Prompt 是你输入 AI 界面以获取回复的指令或询问. Prompt 由关键字和短语组成, 旨在引发回复.

例如, 如果你向 ChatGPT 提出一个问题或指令, 它就会像对话一样做出回应.

让我们来探索一下 OpenAI ChatGTP API:

我们将利用聊天补全创建API (POST api.openai.com/v1/chat/com...)根据给定的 Prompt 生成回复.

在 上面的链接中, 你可以看到 CURL API URL 和 API 输入.

下面是我提出的问题 Spring Boot 是什么?

arduino 复制代码
curl https://api.openai.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "model": "gpt-3.5-turbo",
    "messages": [
      {
        "role": "system",
        "content": "What is springboot?"
      }
    ],
    "temperature": 1
    "max_tokens" :256
  }'

分析该 API 的基本请求参数:

  • model: 该参数指定了接收请求的模型版本. 有不同的模型版本可供选择, 在本任务中, 我们将使用gpt-3.5-turbo模型, 这是公众可访问的最新版本.

  • messages: 每条消息都有两个重要部分: rolecontent. role 说明信息是来自用户还是助手. content 是实际的信息文本.

  • temperature: 默认设置为 1, 范围从 0 到 2. 数值越大, 响应越随机, 数值越小, 响应越集中, 可预测.

  • max_tokens: 通常没有限制, 但你可以使用此设置来决定回复中单词或符号的最大数量. 这有助于管理超长的响应并控制成本.

如果在没有将 OpenAI API Key 作为 bearer token 的情况下尝试 Postman 中前面提到的请求, 就会遇到验证失败. 要验证对 OpenAI ChatGPT 补全 API 的访问, 将 OpenAI API Key 作为 bearer token 至关重要.

创建 OpenAI Key:

登录你的 ChatGPT 账户并创建 OpenAI API Key, 可以点击这里深度.

创建 OpenAI Key

将 OpenAI ChatGTP API 与 Spring Boot 集成:

这里是我的项目的结构:

项目结构

这里是使用的依赖关系:

maven 依赖项

创建 ChatRequest, ChatResponse 和 Message 类:

java 复制代码
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ChatRequest {

 private String model;
 private List<Message> messages;
 private int n;
 private double temperature;
}

---------------------------------------------------------------------------

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ChatResponse {
 
 private List<Choice> choices;

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static class Choice {
        private int index;
        private Message message;
    }
}

---------------------------------------------------------------------------

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Message {
 
    private String role;
    private String content;

}

将这些配置添加到 application.properties 文件中:

ini 复制代码
spring.application.name=openai-java
server.servlet.context-path=/openai

#OpenAI
openai.model=gpt-3.5-turbo
openai.api.key=REPLACE_YOUR_KEY
openai.api.url=https://api.openai.com/v1/chat/completions
openai.max-completions=1
openai.temperature=0

RestTemplate 配置:

在配置包中建立一个名为 ChatGPTConfiguration 的类:

kotlin 复制代码
@Configuration
public class ChatGPTConfiguration {

 @Value("${openai.api.key}")
 private String apiKey;

 @Bean
 RestTemplate restTemplate() {

  RestTemplate restTemplate = new RestTemplate();

  restTemplate.getInterceptors().add((request, body, execution) -> {
   request.getHeaders().add("Authorization", "Bearer " + apiKey);
   return execution.execute(request, body);
  });

  return restTemplate;
 }
}

@Value("${openai.api.key}") 注解从应用程序的属性文件中获取信息. 具体来说, 它会从文件中获取 OpenAI API Key.

RestTemplate 数据类定义了一个用 Java 发出 HTTP 请求的工具. 它为 RestTemplate 配置了拦截器. 基本上, 每当 RestTemplate 发送请求时, 拦截器都会用Authorization header 对其进行补充. 该标头包括一个从apiKey变量中获取的 bearer token. 通常, 这种设置用于验证对需要 token 才能访问的应用程序接口的请求.

API Controller:

现在, 我们可以继续制作 REST 控制器. 它将使用我们在 RestTemplate 中完成的设置, 向 API 发送请求并管理我们得到的响应.

controller 包下创建一个类 ChatAPIController:

less 复制代码
@RestController
@RequestMapping("/api/vi")
@Slf4j
public class ChatAPIController {

 @Autowired
 private RestTemplate restTemplate;

 @Value("${openai.model}")
 private String model;

 @Value("${openai.max-completions}")
 private int maxCompletions;

 @Value("${openai.temperature}")
 private double temperature;

 @Value("${openai.api.url}")
 private String apiUrl;

 @PostMapping("/chat")
 public ChatResponse chat(@RequestParam("prompt") String prompt) {
  
  ChatResponse chatResponse=null;
  List<Message> ChatMessages = new ArrayList<>();
  ChatRequestBuilder request = ChatRequest.builder();
  try {
   
   ChatMessages.add(new Message("user", prompt));
   
   request
   .model(model)
   .messages(ChatMessages)
   .n(maxCompletions)
   .temperature(temperature);

   
   chatResponse = restTemplate.postForObject(apiUrl, request.build(), ChatResponse.class);
  }catch(Exception e) {
   log.error("error : "+e.getMessage());
  }
  return chatResponse;
 }
}

编码部分已经完成. 现在, 我们将着手测试应用程序.

Postman 中的 api 测试

现在, 你可以看到我从 OpenAI API 收到了对我所提问题的回复.

使用 OpenAI ChatGPT 补全 API 有哪些可能性?

以下是使用 OpenAI 补全 API 和 ChatGPT 等模型可以完成的一些任务:

  • 创建聊天机器人: 制作能像人类一样交谈的聊天机器人. 它们可以自然地回答问题或与用户聊天.

  • 帮助客户支持: 建立自动帮助客户的系统, 使支持更快, 更高效.

  • 自动生成内容: 自动撰写文章, 故事或产品说明, 为内容创建者节省时间.

  • 翻译语言: 制作可在不同语言间翻译文本的工具, 帮助人们在全球范围内进行交流.

  • 创建个人助理: 创建虚拟助理来设置提醒事项, 安排约会或回答问题.

  • 教育工具: 协助学生完成家庭作业或讲解, 使学习更加个性化.

  • 管理内容: 自动过滤网站或社交媒体上的不当内容.

  • 市场研究: 分析大量文本数据, 为企业寻找趋势或见解.

以上是你可以使用 OpenAI 补全 API 和 ChatGPT 等模型所做的一些示例. 这些模型在教育, 医疗保健, 客户服务和写作等许多领域都很有用. 请记住, 它们生成的文本质量会根据你使用它们的目的和你提供给它们的信息而有所不同.

使用 Spring AI 将生成式AI集成到 Spring Boot 应用程序中:

Spring AI:将 AiClient 与 Spring Boot 应用程序相结合

Spring AI 计划, 其目标是简化创建具有AI功能的应用程序的过程, 消除 Spring Boot java 中不必要的复杂性.

Spring AI 提供以下功能

  • 支持领先的AI模型提供商, 包括 OpenAI, 微软, 亚马逊, 谷歌和 Huggingface.
  • Spring AI 支持聊天和文本生成图像等不同类型的模型. 更多类型的模型正在开发中.
  • 针对聊天和嵌入模型, 为各种AI提供商提供了通用的 API. 你可以选择同步和流 API 选项. 此外, 访问特定模型的功能也很方便.
  • 将AI模型输出映射到 POJO 中.
  • 支持所有主要的矢量数据库提供商, 如 Azure Vector Search, Chroma, Milvus, Neo4j, PostgreSQL/PGVector, PineCone, Qdrant, Redis 和 Weaviate.
  • 针对 AI 模型和矢量存储的 Spring Boot 自动配置和启动器.

注意:

  • Spring-AI 非常新, 目前还没有稳定版本, 最新版本为为v1.0.0-M3. 不过, 预计将来会发布稳定版本.
  • Spring AI 引入了 AiClient 接口, 并实现了 OpenAI 和 Azure 的 OpenAI.

让我们开始编码...

pom.xml 中需要的依赖项:

要使用 Spring AI, 请添加以下资源库. 请注意, 这是一个实验项目, 目前只能访问 SNAPSHOT 版本.

OpenAI 的 SNAPSHOT 仓库

要集成 OpenAI, 可添加以下依赖关系:

maven 依赖项

你也可以选择使用 Azure OpenAI, 而不是 OpenAI, 方法是加入以下依赖关系:

xml 复制代码
<dependency>
   <groupId>org.springframework.experimental.ai</groupId>
   <artifactId>spring-ai-azure-openai-spring-boot-starter</artifactId>
   <version>0.2.0-SNAPSHOT</version>
</dependency>

在这篇文章中, 我使用了OpenAI.

将这些配置添加到 application.properties 文件中:

ini 复制代码
#SpringAI
spring.ai.openai.api-key=REPLACE_WITH_YOUR_API_KEY

在 service 包中创建 AIServiceHelper:

typescript 复制代码
@Service
@Slf4j
public class AIServiceHelper {

 @Autowired
 AiClient aiClient;

 @Value("${spring.ai.openai.api-key}")
 private String apiKey;

 public String chat(String question){
  
  PromptTemplate promptTemplate = null;
  try {
   
   promptTemplate = new PromptTemplate(question);
  }catch(Exception e) {
   log.error("error : "+e.getMessage());
  }
  
  return this.aiClient.generate(promptTemplate.create()).getGeneration().getText();
 }

 public String generateDocument(String topic) {
  
  PromptTemplate promptTemplate =null;
  try {

   
   promptTemplate = new PromptTemplate("""
     Generate document content for a {topic}. 
     It should be at least two pages long and include comprehensive information covering all aspects of the topic, 
     including background information, current trends or developments, relevant statistics or data, key concepts or 
     theories, potential challenges, and future outlook. The document should be well-structured with clear headings
     and sub-headings, and it should provide an in-depth analysis that offers insights and engages the reader effectively.
           """);

   
   promptTemplate.add("topic", topic);
  }catch(Exception e) {
   log.error("error : "+e.getMessage());
  }
  
  return this.aiClient.generate(promptTemplate.create()).getGeneration().getText();
 }

让我们一步步地分析一下代码.

  • DI: 该类使用 @Autowired 注解引入了 AiClient 接口的实例. AiClient 是与 OpenAI 服务对话的一种方式.

  • chat 方法: 该方法用于使用AI模型为给定问题生成回复. 它首先使用提供的问题创建一个 Prompt 模板. 然后, 利用AI客户端根据 Prompt 模板生成回复. 最后, 它会返回生成的回复文本. Prompt 模板创建过程中出现的任何错误都会被记录下来.

  • generateDocument 方法: 该方法使用AI模型为给定话题生成文档内容. 它会创建一个带有话题占位符和文档内容说明的 Prompt 模板. 然后, 它将占位符 {topic} 替换为实际提供的话题. 最后, 它利用AI客户端根据 Prompt 模板生成文档内容, 并返回生成内容的文本. Prompt 模板创建过程中出现的任何错误都会被记录下来.

在 controller 包内创建 SpringAIController:

less 复制代码
@RestController
@RequestMapping("/api/v1")
public class SpringAIController {

 @Autowired
 AIServiceHelper aiService;

 @GetMapping("/qa")
 public String chat(@RequestParam String question) {
  return aiService.chat(question);
 }

 @GetMapping("/docuGenAI")
 public String generateDocument(@RequestParam String topic) {
  return aiService.generateDocument(topic);
 }

编码部分已经完成. 现在, 我们将着手测试应用程序.

在 controller 器类中, 我定义了两个 API:

  • API api/v1/qa: 通过提供AI服务生成的响应来处理问答请求.
  • API api/v1/docuGenAI: 使用AI服务根据提供的话题生成文档内容.

大家可以看到, 我在 url 中通过输入了一些英文或者中文问题, 搭建的应用程序成功的给予了我返回, 简直太完美了!

总结一下

在今天的文章中, 主要通过 Spring Boot 推荐了一个十分简易的应用程序, 通过目前尚未正式发版的 Spring AI 集成了 OpenAI 的 ChatGPT API, 搭建了一个智能问答小程序. 通过该小程序, 探索了 Spring AI 推荐 AI 应用的无限可能! 当然, 能够接入的 AI API 包括但不限于 OpenAI 的 ChatGPT API.

好的, 今天的内容就到这里啦!

一家之言, 欢迎斧正!

Happy Coding! Stay GOLDEN!

相关推荐
苹果醋31 小时前
2020重新出发,MySql基础,MySql表数据操作
java·运维·spring boot·mysql·nginx
小蜗牛慢慢爬行1 小时前
如何在 Spring Boot 微服务中设置和管理多个数据库
java·数据库·spring boot·后端·微服务·架构·hibernate
azhou的代码园1 小时前
基于JAVA+SpringBoot+Vue的制造装备物联及生产管理ERP系统
java·spring boot·制造
wm10432 小时前
java web springboot
java·spring boot·后端
路在脚下@9 小时前
spring boot的配置文件属性注入到类的静态属性
java·spring boot·sql
啦啦右一9 小时前
Spring Boot | (一)Spring开发环境构建
spring boot·后端·spring
森屿Serien9 小时前
Spring Boot常用注解
java·spring boot·后端
苹果醋310 小时前
React源码02 - 基础知识 React API 一览
java·运维·spring boot·mysql·nginx
荆州克莱12 小时前
mysql中局部变量_MySQL中变量的总结
spring boot·spring·spring cloud·css3·技术
武昌库里写JAVA13 小时前
Java成长之路(一)--SpringBoot基础学习--SpringBoot代码测试
java·开发语言·spring boot·学习·课程设计