在本文中,探讨了如何将 OpenAI 的 ChatGPT API 与 Spring Boot 应用程序集成,并通过开源 API 网关 Apache APISIX 来管理 API。这种集成使得在 Spring Boot 应用程序中充分利用 ChatGPT 的强大功能成为可能,同时 APISIX 提供了一种健壮、可扩展且安全的 API 管理方式。
OpenAI ChatGPT API
OpenAI 的 ChatGPT API 是一个强大的工具,用于将 ChatGPT 模型的功能集成到应用程序或服务中。通过此 API,可以发送一系列消息,并通过 REST 接口接收 AI 模型生成的回复。API 提供了多种功能,包括在聊天机器人中生成文本回复、代码补全、生成图像或在对话界面中回答问题。在本教程中,将使用聊天完成 API 来生成对提示的响应(可以询问任何问题)。在开始之前,可以探索 API,以了解如何使用 API 密钥进行身份验证,以及 API 请求参数和响应的格式。
以下是一个对聊天完成 API 的 cURL 请求示例。在调用 API 时,请将 OPENAI_API_KEY
替换为自己的 API 密钥,并放置在 Authorization 头中。
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": "user", "content": "What is Apache APISIX?"}]
}'
以下是一个示例 JSON 响应:
{
"id": "chatcmpl-7PtycrYOTJGv4jw8FQPD7LCCw0tOE",
"object": "chat.completion",
"created": 1686407730,
"model": "gpt-3.5-turbo-0301",
"usage": {
"prompt_tokens": 15,
"completion_tokens": 104,
"total_tokens": 119
},
"choices": [
{
"message": {
"role": "assistant",
"content": "Apache APISIX is a dynamic, real-time, high-performance API gateway designed to facilitate the management and routing of microservices and APIs. It provides features such as load balancing, rate limiting, authentication, authorization, and traffic control, all of which help to simplify the management of microservices and APIs. Apache APISIX is built on top of the Nginx server and can support high levels of traffic with low latency and high availability. It is open source and released under the Apache 2.0 license."
},
"finish_reason": "stop",
"index": 0
}
]
}
项目代码示例
本教程分为两部分。第一部分讲解如何设置 Spring Boot 应用程序,并创建一个新的 API 端点,该端点能够通过编程方式处理对 ChatGPT API 的调用。第二部分则介绍如何利用 APISIX 的安全性、流量控制等功能来管理 Spring Boot API。本教程的完整代码示例可以在名为 apisix-java-chatgpt-openaiapi
的 GitHub 仓库中找到。
先决条件
在开始之前,请确保具备以下条件:
- 创建 OpenAI API 密钥:要访问 OpenAI API,需要创建一个 API 密钥。登录 OpenAI 网站并前往 API 密钥管理页面即可完成此操作。
- 在本地机器上安装 Docker,以便运行 APISIX 和 Spring Boot。
第 1 步:设置 Spring Boot 应用程序
首先,需要创建一个新的 Spring Boot 应用程序。可以使用 Spring Initializr 生成一个具有必要依赖项的 Maven 项目。在本教程中,将需要添加 Spring Boot Starter Web
依赖项。为了集成 ChatGPT API,可以使用 OpenAI Java 客户端库,这是一个开源的社区库,提供了在 Java 中创建和调用 OpenAI GPT API 的服务类。当然,也可以在 Spring 中编写自己的实现,以与 OpenAI API 进行交互。此外,还可以参考其他编程语言的客户端库。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.theokanning.openai-gpt3-java</groupId>
<artifactId>service</artifactId>
<version>0.12.0</version>
</dependency>
</dependencies>
第 2 步:创建 Controller 类
在 ChatCompletionController.java
类中,可以使用 OpenAI 服务向 ChatGPT API 发送请求。
import com.theokanning.openai.completion.chat.ChatCompletionChoice;
import com.theokanning.openai.completion.chat.ChatCompletionRequest;
import com.theokanning.openai.completion.chat.ChatMessage;
import com.theokanning.openai.completion.chat.ChatMessageRole;
import com.theokanning.openai.service.OpenAiService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
@RestController
public class ChatCompletionController {
@Value("${openai.model}")
private String model;
@Value("${openai.api.key}")
private String openaiApiKey;
@PostMapping("/ai-chat")
public String chat(@RequestBody String prompt) {
OpenAiService service = new OpenAiService(openaiApiKey);
final List<ChatMessage> messages = new ArrayList<>();
final ChatMessage systemMessage = new ChatMessage(
ChatMessageRole.USER.value(), prompt
);
messages.add(systemMessage);
ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
.model(model)
.messages(messages)
.maxTokens(250)
.build();
List<ChatCompletionChoice> choices = service.createChatCompletion(chatCompletionRequest).getChoices();
if (choices == null || choices.isEmpty()) {
return "No response";
}
return choices.get(0).getMessage().getContent();
}
}
聊天 API
端点处理 POST 请求,创建聊天请求,并将其发送到 OpenAI API。然后,返回 API 响应中的第一条消息。端点地址为 /ai-chat
。
第 3 步:定义应用程序属性
在 application.properties
文件中定义 API 属性,包括模型和 API 密钥:
openai.model=gpt-3.5-turbo
openai.api.key=YOUR_OPENAI_API_TOKEN
请将 YOUR_OPENAI_API_TOKEN
替换为实际的 OpenAI API 密钥。
第 4 步:运行 Spring Boot 应用程序
现在,可以运行 Application.java
并使用 Postman 或 cURL 命令对其进行测试。
运行 Application.java
后,使用 Postman 或 cURL 发送请求来测试应用程序。以下是 cURL 请求的示例:
curl -X POST http://localhost:8080/ai-chat
-H "Content-Type: application/json"
-d '{"prompt": "What is Apache APISIX?"}'
如上所示,应用程序将根据提示请求正文生成回答。
第 5 步:创建 Dockerfile
接下来,为了将 Spring Boot 应用程序容器化,可以创建一个 Dockerfile
,用于构建 JAR 文件并执行它。以下是一个示例 Dockerfile
:
# 使用官方 Java 运行时作为基础镜像
FROM openjdk:17-jdk-alpine
# 将 JAR 文件复制到容器中
COPY target/openaiapi.jar /app/openaiapi.jar
# 设置容器启动命令
ENTRYPOINT ["java", "-jar", "/app/openaiapi.jar"]
然后,在 docker-compose.yml
文件中注册服务,将应用程序与其他 APISIX 容器一起配置:
version: '3'
services:
openaiapi:
build: ./openaiapi
ports:
- "8080:8080"
networks:
- apisix
networks:
apisix:
这将构建 Spring Boot 应用程序的 Docker 镜像,并在 8080
端口上暴露它,使其可以与 APISIX 进行集成。
第 6 步:设置 Apache APISIX
要配置 Apache APISIX,只需运行以下命令,因为 docker-compose.yml
文件已定义了所需的服务。该文件配置了两个容器,一个用于 APISIX,另一个用于之前创建的 Spring Boot 应用。在本示例中,APISIX 以独立模式运行,其他安装选项和部署模式也可供选择。运行以下命令启动服务:
docker compose up
此时,APISIX 将作为一个单独的服务运行在 localhost:9080
上,而 Spring Boot 应用程序则在 localhost:8080
上运行。
第 7 步:使用 APISIX 保护 API
在设置完 APISIX 后,可以通过以下步骤为 Spring Boot API 添加安全功能,以确保只有授权的 API 消费者能够访问该 API。APISIX 提供了多种插件用于 API 保护,例如 jwt-auth
插件,可以要求所有请求必须使用 JWT 令牌。以下是如何在 apisix.yml
文件中配置带有上游服务和插件的路由示例:
upstreams:
- id: 1
type: roundrobin
nodes:
"openaiapi:8080": 1
routes:
- uri: /ask-me-anything
upstream_id: 1
plugins:
proxy-rewrite:
uri: /ai-chat
jwt-auth: {}
- uri: /login
plugins:
public-api:
uri: /apisix/plugin/jwt/sign
consumers:
- username: appsmithuser
plugins:
jwt-auth:
key: [email protected]
secret: my-secret-key
在 apisix.yml
文件中定义了上游服务、路由、消费者对象及其规则后,APISIX 将在 Docker 容器启动后立即加载这些配置文件。APISIX 会定期检测配置文件是否有更新,并在检测到变化时自动重新加载配置。
在此配置中,添加了一个上游服务、两个路由和一个消费者对象。第一个路由配置要求所有请求(自定义 URI 路径,可根据需要修改)必须在请求头中包含有效的 JWT 令牌。APISIX 使用 proxy-rewrite
插件将自定义的 URI 路径重写为实际的 API 路径,并将请求转发到运行在 localhost:8080
的 Spring Boot 应用程序。
如果尝试访问 APISIX 路由而未提供有效的 JWT 令牌,请求将被拒绝,返回授权错误:
curl -i http://localhost:9080/ask-me-anything -X POST -d '{"prompt":"What is Apache APISIX?"}'
响应示例:
HTTP/1.1 401 Unauthorized
{"message":"Missing JWT token in request"}
在第二个路由配置中,启用了 public-api
插件,以公开新的端点用于生成新的 JWT 令牌。APISIX 充当身份提供者,可以为 API 消费者或客户端应用程序生成和验证新令牌。请参阅第 8 步了解如何为 API 使用者生成新令牌:
- uri: /login
plugins:
public-api:
uri: /apisix/plugin/jwt/sign
此外,配置文件中注册了一个 API 消费者,允许用户使用其 secret
来声明 JWT 令牌,以访问 API:
consumers:
- username: appsmithuser
plugins:
jwt-auth:
key: [email protected]
secret: my-secret-key
第 8 步:领取新的 JWT 令牌
要为现有的 API 使用者获取新的 JWT 令牌,可以使用以下 cURL 命令。您需要替换 user-key
为实际的 API 使用者密钥:
curl -i http://127.0.0.1:9080/login?key=user-key
成功执行后,APISIX 将返回一个新的 JWT 令牌。响应示例如下:
HTTP/1.1 200 OK
Server: APISIX/3.0.0
Content-Type: application/json
{
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJrZXkiOiJ1c2VyLWtleSIsImV4cCI6MTY4NjU5MjE0NH0.4Kn9c2DBYKthyUx824Ah97-z0Eu2Ul9WGO2WB3IfURA"
}
您可以将返回的 JWT 令牌用于后续 API 请求。在请求中,您需要将此令牌放在 Authorization
头中,以便验证请求的合法性:
curl -i http://localhost:9080/ask-me-anything -X POST -H "Authorization: Bearer YOUR_NEW_JWT_TOKEN" -d '{"prompt":"What is Apache APISIX?"}'
这将确保只有持有有效 JWT 的请求才能访问受保护的 API 端点。
第 9 步:使用 JWT 令牌请求 API
最后,可以使用从上一步中获取的 JWT 令牌向 API 发送请求。以下是如何使用 cURL 命令进行请求的示例:
curl -i http://localhost:9080/ask-me-anything
-H 'Authorization: Bearer YOUR_JWT_TOKEN'
-X POST
-d '{ "prompt": "What is Apache APISIX?" }'
将 YOUR_JWT_TOKEN
替换为实际的 JWT 令牌。
此外,也可以使用 Postman 发送相同的请求。确保在请求头中添加 Authorization
,其值为 JWT 令牌。请求成功后,将从 APISIX 网关收到 AI 的响应。
结论
本教程介绍了如何利用 OpenAI ChatGPT API 生成对提示的响应。首先创建了一个 Spring Boot 应用程序,该应用程序通过调用 API 生成响应。随后,通过更新现有的 apisix.yml 文件,可以为集成引入其他功能。此外,还可以查看名为 with-frontend 的分支,并运行项目,以查看使用 Appsmith 构建的与 APISIX 配合使用的 UI 界面。
原文链接:Managing AI-Powered Java App With API Management
Keyword: 图和图谱有什么区别