借用Spring AI Alibaba 快速搭建ChatGPT应用--聊天机器人

219 阅读4分钟

前言

AI 大爆发后,人工智能已成为常态。Java 的 Spring 社区推出了 Spring AI 项目,该项目已集成 OpenAI 的 API,如此一来,无需开发者自行实现向 OpenAI 发送请求与接收响应的交互程序,只需调用 Spring AI 提供的接口即可。 然而,OpenAI 的 key 并非免费,且其为国外服务,在使用时速度会受到一定影响。鉴于此,可选择使Spring AI Alibaba 是基于 Spring AI 构建的开源项目,是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践。基于此,为了实现一个基于 Spring BootOpenAI 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. 测试聊天机器人

  1. 启动 Spring Boot 应用。
  2. 使用 Postman 或任何其他 HTTP 客户端工具,向 http://localhost:8080/api/chat/message 发送 POST 请求,请求体示例如下:
jsonCopy Code
{
    "message": "你好,ChatGPT!"
}

响应示例:

jsonCopy Code
{
    "message": "你好!有什么我可以帮助你的吗?"
}

你可以将这个简单的聊天机器人扩展到其他领域,例如:

  • 增加常见问题(FAQ)的预设回答。
  • 使用 WebSocket 实现实时聊天。
  • 存储聊天记录并在后续对话中提供上下文。

6. 总结

通过以上步骤,我们实现了一个简单的基于 Spring BootOpenAI GPT 的聊天机器人应用。该应用可以处理用户通过 HTTP 请求发送的消息,调用 OpenAI API 生成聊天回应,并返回给用户。你可以根据需要进行功能扩展,例如添加自定义逻辑、增加用户验证等功能。