前言
AI 大爆发后,人工智能已成为常态。Java 的 Spring 社区推出了 Spring AI 项目,该项目已集成 OpenAI 的 API,如此一来,无需开发者自行实现向 OpenAI 发送请求与接收响应的交互程序,只需调用 Spring AI 提供的接口即可。 然而,OpenAI 的 key 并非免费,且其为国外服务,在使用时速度会受到一定影响。鉴于此,可选择使Spring AI Alibaba 是基于 Spring AI 构建的开源项目,是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践。基于此,为了实现一个基于 Spring Boot 和 OpenAI API 的简易聊天机器人,我们将设计一个能够理解用户文本输入并给出相应回答的客服工具。这个聊天机器人可以通过 RESTful API 接口与用户进行交互,并利用 OpenAI GPT 模型 来生成智能回答。
1. 技术栈
- Spring Boot:用来搭建后端应用,处理 API 请求和服务逻辑。
- OpenAI API:用来生成智能的聊天响应。
- Spring Web:处理 RESTful API 请求和响应。
- Spring Boot DevTools:用于热部署,提升开发效率。
2. 功能概述
- 提供一个 RESTful API 接口,用户可以通过 HTTP 请求发送问题。
- 机器人会根据问题通过 OpenAI API 获取回答。
- 可以配置一些预定义的常见问题及答案,用户如果输入这些问题时可以直接返回预设答案。
3. 项目结构
我们将实现以下主要模块:
- Controller:接收用户请求并返回响应。
- Service:调用 OpenAI API 或处理业务逻辑。
- Configuration:配置 OpenAI API 密钥。
- Model:定义聊天消息结构和响应结构。
4. 代码实现
4.1 创建 Spring Boot 项目
使用 Spring Initializr 创建一个 Maven 项目,选择以下配置:
- Project: Maven Project
- Language: Java
- Spring Boot: 2.7.x 或 3.x.x
- Dependencies: Spring Web, Spring Boot DevTools (可选),Lombok(可选)
4.2 配置 OpenAI API 密钥
首先,你需要去 OpenAI 官网 注册并获取你的 API 密钥。将密钥放在 application.properties
文件中:
propertiesCopy Code
# OpenAI API key
openai.api.key=your-openai-api-key
4.3 创建 Controller 类
javaCopy Code
package com.example.chatbot.controller;
import com.example.chatbot.service.ChatbotService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/chat")
public class ChatbotController {
@Autowired
private ChatbotService chatbotService;
@PostMapping("/message")
public String chat(@RequestBody String userMessage) {
return chatbotService.generateResponse(userMessage);
}
}
说明:
@RestController
:标注该类为 RESTful 控制器,接收并处理 HTTP 请求。@RequestMapping("/api/chat")
:所有请求的 URL 前缀。@PostMapping("/message")
:定义一个 POST 接口,接收用户发送的消息。
4.4 创建 Service 类
ChatbotService
负责与 OpenAI API 进行交互,生成响应。
javaCopy Code
package com.example.chatbot.service;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class ChatbotService {
@Value("${openai.api.key}")
private String apiKey;
private static final String OPENAI_API_URL = "https://api.openai.com/v1/completions";
public String generateResponse(String userMessage) {
RestTemplate restTemplate = new RestTemplate();
// 设置请求头
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer " + apiKey);
headers.set("Content-Type", "application/json");
// 构建请求体
String requestBody = String.format("{\n" +
" "model": "text-davinci-003",\n" +
" "prompt": "%s",\n" +
" "max_tokens": 150,\n" +
" "temperature": 0.7\n" +
"}", userMessage);
HttpEntity<String> entity = new HttpEntity<>(requestBody, headers);
// 发送请求并获取响应
ResponseEntity<String> response = restTemplate.exchange(
OPENAI_API_URL,
HttpMethod.POST,
entity,
String.class
);
// 解析返回的响应
if (response.getStatusCode() == HttpStatus.OK) {
String responseBody = response.getBody();
return extractAnswerFromResponse(responseBody);
} else {
return "抱歉,我没有理解您的问题。";
}
}
// 从 OpenAI 的响应中提取模型生成的回答
private String extractAnswerFromResponse(String responseBody) {
// 解析 JSON 响应,这里仅简单提取文本
// 在实际项目中,可以使用 JSON 库(如 Jackson 或 Gson)来解析返回内容
String responseText = responseBody.split(""text":"")[1].split(""")[0];
return responseText;
}
}
说明:
RestTemplate
:用于发送 HTTP 请求。HttpHeaders
:设置请求头部,包含 API 密钥。HttpEntity
:包含请求体和请求头。responseBody.split(...)
:简易地从 JSON 响应中提取生成的文本。实际项目中可以使用Jackson
或Gson
进行更为精确的 JSON 解析。
4.5 配置日志(可选)
propertiesCopy Code
# application.properties
logging.level.org.springframework.web=DEBUG
logging.level.com.example.chatbot=DEBUG
4.6 启动 Spring Boot 应用
运行 ChatbotApplication.java
(Spring Boot 启动类),确保应用能够成功启动。
javaCopy Code
package com.example.chatbot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ChatbotApplication {
public static void main(String[] args) {
SpringApplication.run(ChatbotApplication.class, args);
}
}
5. 测试聊天机器人
- 启动 Spring Boot 应用。
- 使用 Postman 或任何其他 HTTP 客户端工具,向
http://localhost:8080/api/chat/message
发送 POST 请求,请求体示例如下:
jsonCopy Code
{
"message": "你好,ChatGPT!"
}
响应示例:
jsonCopy Code
{
"message": "你好!有什么我可以帮助你的吗?"
}
你可以将这个简单的聊天机器人扩展到其他领域,例如:
- 增加常见问题(FAQ)的预设回答。
- 使用 WebSocket 实现实时聊天。
- 存储聊天记录并在后续对话中提供上下文。
6. 总结
通过以上步骤,我们实现了一个简单的基于 Spring Boot 和 OpenAI GPT 的聊天机器人应用。该应用可以处理用户通过 HTTP 请求发送的消息,调用 OpenAI API 生成聊天回应,并返回给用户。你可以根据需要进行功能扩展,例如添加自定义逻辑、增加用户验证等功能。