使用API管理管理基于人工智能的Java应用程序
在本文中,我们将探讨如何将OpenAI的ChatGPT API与Spring Boot应用集成,并使用Apache APISIX(开源API网关)管理API。这种集成将允许我们在Spring Boot应用程序中利用OpenAI开发的最先进的语言模型ChatGPT的能力,而APISIX将提供一种强大、可扩展且安全的方式来管理API。
OpenAI ChatGPT APIs OpenAI ChatGPT APIs
OpenAI的ChatGPT API是一个强大的工具,我们可以使用它将ChatGPT模型的功能集成到我们自己的应用程序或服务中。该API允许我们通过REST发送一系列消息,并接收AI模型生成的响应消息。它提供了许多API,可以在聊天机器人、代码完成、生成图像或在对话界面中回答问题时创建文本响应。在本教程中,我们将使用聊天完成API来生成对提示的响应(基本上我们可以询问任何问题)。在开始教程之前,您可以探索API,以了解如何使用API密钥进行身份验证,API请求参数和响应的外观。
一个调用聊天完成 API 的 cURL 请求示例如下。您需要将 OPENAI_API_KEY 替换为您自己的 API 密钥,并在调用 API 时将其放在授权标头中。
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端点,可以以编程方式处理我们对聊天完成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库。它提供创建和调用Java中OpenAI's 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>
第二步:创建控制器类
在 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端点/ai-chat处理POST请求,创建聊天请求,并将其发送到OpenAI API。然后,它返回API响应的第一条消息。
第三步: 定义应用程序属性
接下来,在application.properties文件中为API提供模型和API密钥等属性:
openai.model=gpt-3.5-turbo
openai.api.key=YOUR_OPENAI_API_TOKEN
步骤4:运行Spring Boot应用程序。
我们现在可以运行Application.java并使用Postman或cURL命令进行测试。
正如我们所看到的,该应用程序在提示请求体中对我们的问题生成了响应。
步骤5:创建Dockerfile。
我们使用一个Docker容器来封装我们的Spring Boot应用,并与其他APISIX容器一起使用在docker-compose.yml中。为此,我们可以创建一个Dockerfile来构建JAR并执行它。请参见如何dockerize Spring Boot应用教程。然后,在docker-compose yaml文件中注册服务。
openaiapi:
build: openaiapi
ports:
- "8080:8080"
networks:
apisix:
第六步:设置Apache APISIX
为了设置APISIX,我们只需运行docker compose up命令。因为我们已经在docker-compose.yml中定义了所有必要的服务。该文件仅定义了两个容器,一个用于APISIX,另一个用于我们在之前步骤中实现的Spring Boot应用程序。在这个示例项目中,我们以独立模式运行APISIX。还有其他APISIX安装选项和部署模式。现在,APISIX作为一个单独的服务在localhost:9080上运行,Spring Boot应用程序在localhost:8080上运行。
步骤七:使用APISIX保护API
一旦设置了APISIX,我们就可以为现有的Spring boot API /ai-chat添加安全功能,以便只有允许的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: appsmithuser@gmail.com
secret: my-secret-key
在 APISIX 配置中指定上游、路由和消费者对象以及路由规则后,配置文件在 APISIX 节点服务在 Docker 中启动后立即加载到内存中。 APISIX 定期尝试检测文件内容是否有更新,如果有更新,它会自动重新加载更改。
使用此配置,我们添加了一个上游、两个路由和一个消费者对象。在第一条路由中,所有到 /ask-me-anything 的请求(这是一个自定义 URI 路径,您可以定义任何 URI)必须在头部包含 Authorization: JWT_TOKEN。然后,APISIX 使用代理重写插件自动将自定义 URI 路径重写为实际的 API /ai-chat,并将请求转发到运行在 localhost:8080 上的 Spring Boot 应用程序。
如果您尝试请求APISIX路由,它会通过返回未授权错误来拒绝我们的请求:
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插件来公开一个新的端点/login以签署新的JWT令牌。因为APISIX可以作为身份提供者从API消费者或客户端应用程序生成和验证新令牌。请参见第8步,了解如何为我们的API消费者声明新令牌。
- uri: /login
plugins:
public-api:
uri: /apisix/plugin/jwt/sign
如果您注意到在同一个配置文件中,我们注册了一个API消费者来使用/ask-me-anything的人工智能API,我们的用户可以使用他们的秘钥来生成JWT令牌来访问API。
consumers:
- username: appsmithuser
plugins:
jwt-auth:
key: appsmithuser@gmail.com
secret: my-secret-key
步骤8:请求一个新的JWT令牌。
现在我们可以使用密钥为现有API消费者声明新的JWT令牌:
curl -i http://127.0.0.1:9080/login?key=user-key -i
我们将从APISIX获得新的令牌作为响应:
Server: APISIX/3.0.0
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJrZXkiOiJ1c2VyLWtleSIsImV4cCI6MTY4NjU5MjE0NH0.4Kn9c2DBYKthyUx824Ah97-z0Eu2Ul9WGO2WB3IfURA
第九步:使用JWT令牌请求API。
最后,我们可以在头部使用之前获得的JWT令牌,向API /ask-me-anything 发送请求。
curl -i http://localhost:9080/ask-me-anything -H 'Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXkiOiJ1c2VyLWtleSIsImV4cCI6MTY4NjU5Mjk4N30.lhom9db3XMkcVd86ScpM6s4eP1_YzR-tfmXPckszsYo' -X POST -d '
{
"prompt":"What is Apache APISIX?"
}'
或者使用Postman,我们将得到一个AI响应,但这次响应是通过APISIX网关传输的:
结论
在本教程中,我们探讨了OpenAI ChatGPT API生成响应提示的方法。我们创建了一个Spring Boot应用程序,调用API生成响应提示。接下来,您可以通过更新现有的apisix.yml文件引入其他特性来集成。此外,您可以检查名为with-frontend的分支名称并运行该项目,以查看使用与APISIX配合使用的Appsmith构建的UI界面。
相关资源
- OpenAI API Java库
- OpenAI聊天完成API
推荐内容
- 使用Apache APISIX和OpenAI API强化人工智能功能
- 为什么 Apache APISIX 是最好的 API 网关?
社区
? 加入Apache APISIX社区? 在Twitter上关注我们? 在Slack上找到我们? 如何做贡献页面
关于作者
访问我的博客:www.iambobur.com