API管理を使用してAIパワードJavaアプリを管理する
Use API management to manage AI-powered Java applications.
この記事では、Spring BootアプリケーションにOpenAIのChatGPT 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を試してみることができます。
チャット補完APIへのサンプルcURLリクエストは次のようになります。呼び出し時にAuthorizationヘッダに自分自身のAPIキーを指定し、OPENAI_API_KEY
を置き換えてください。
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": "Apache APISIXとは何ですか?"}]
}'
以下はサンプルのJSONレスポンスです:
- LangFlow | LLMを使用してアプリケーションを開発するためのLangChainのUI
- ProFusion における AI 非正則化フレームワーク テキストから画像合成における詳細保存に向けて
- Amazon SageMaker Canvasを使用して、ノーコードの機械学習を活用して、公衆衛生の洞察をより迅速にキャプチャーしましょう
{
"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は、マイクロサービスとAPIの管理とルーティングを容易にするために設計された動的でリアルタイムで高性能なAPIゲートウェイです。負荷分散、レート制限、認証、承認、トラフィック制御などの機能を提供し、マイクロサービスとAPIの管理を簡素化します。Apache APISIXはNginxサーバの上に構築され、低遅延と高可用性で高トラフィックをサポートできます。オープンソースであり、Apache 2.0ライセンスでリリースされています。" }, "finish_reason": "stop", "index": 0 } ]
}
プロジェクトコードの例
このチュートリアルは2つのパートで構成されています。最初のパートでは、Spring Bootアプリケーションの設定と、チャット補完APIへのAPI呼び出しをプログラムで処理できる新しいAPIエンドポイントの作成方法をカバーします。2番目のパートでは、APISIXのセキュリティやトラフィック制御などの機能をSpring Boot APIに導入します。このチュートリアルのための全コード例は、apisix-java-chatgpt-openaiapiというGitHubリポジトリで利用できます。
前提条件
始める前に、以下のものを準備してください:
- OpenAI APIキーを作成する:OpenAI APIにアクセスするためには、APIキーを作成する必要があります。OpenAIのウェブサイトにログインし、APIキー管理ページに移動してこれを行うことができます。
- APISIXとSpring Bootを実行するために、Dockerがマシンにインストールされていることを確認してください。
ステップ1:Spring Bootアプリケーションの設定
まず、新しいSpring Bootアプリケーションを設定する必要があります。Spring Initializrを使用して、必要な依存関係を持つ新しいMavenプロジェクトを生成することができます。このチュートリアルでは、Spring Boot Starter Webの依存関係が必要です。ChatGPT APIを統合するために、OpenAIのJavaクライアントを使用します。オープンソースのコミュニティ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:コントローラークラスの作成
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();
}
}
Chat APIのエンドポイント/ai-chat
はPOSTリクエストを処理し、チャットリクエストを作成してOpenAI APIに送信します。そして、APIのレスポンスから最初のメッセージを返します。
ステップ3:アプリケーションのプロパティを定義する
次に、application.propertiesファイルにAPIのmodel
とAPIキー
のプロパティを指定します:
openai.model=gpt-3.5-turbo
openai.api.key=YOUR_OPENAI_API_TOKEN
ステップ4:Spring Bootアプリを実行する
Application.javaを実行し、PostmanやcURLコマンドでテストすることができます。
見ての通り、アプリケーションはプロンプトのリクエストボディに対して質問に対する応答を生成しました。
ステップ5:Dockerfileの作成
Spring BootアプリをDockerコンテナにラップし、docker-compose.ymlの他のAPISIXコンテナと共に使用するために、JARをビルドして実行するDockerfileを作成できます。Spring BootアプリをDocker化する方法については、Dockerize Spring Boot appチュートリアルを参照してください。そして、docker-compose.ymlファイルでサービスを登録します。
openaiapi:
build: openaiapi
ports:
- "8080:8080"
networks: apisix:
ステップ6:Apache APISIXのセットアップ
APISIXをセットアップするには、docker compose up
コマンドを実行するだけです。なぜなら、docker-compose.ymlに必要なすべてのサービスを既に定義しているからです。このファイルでは、APISIXと前のステップで実装したSpring Bootアプリの2つのコンテナのみを定義しています。このサンプルプロジェクトでは、APISIXをスタンドアロンモードで実行しています。他のAPISIXのインストールオプションや展開モードもあります。これで、APISIXは別のサービスとしてlocalhost:9080
で実行され、Spring Bootアプリはlocalhost:8080
で実行されます。
ステップ7: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: [email protected]
secret: my-secret-key
APISIXの設定でアップストリーム、ルート、およびコンシューマオブジェクトとルーティングルールを指定した後、APISIXノードサービスがDockerで起動した直後に設定ファイルが即座にメモリにロードされます。APISIXは定期的にファイルの更新を検出しようと試みますが、更新があった場合はリロードして自動的に変更します。
この設定では、1つのアップストリーム、2つのルート、および1つのコンシューマオブジェクトを追加しました。最初のルートでは、/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"}
2番目のルート設定では、public-apiプラグインを有効にして新しいエンドポイント/login
を公開しています。なぜなら、APISIXはAPIコンシューマまたはクライアントアプリから新しいトークンを生成および検証するためのアイデンティティプロバイダとして機能することができるからです。APIコンシューマに新しいトークンを要求する方法については、ステップ8を参照してください。
- uri: /login
plugins:
public-api:
uri: /apisix/plugin/jwt/sign
もし気づいたかもしれませんが、同じ設定ファイルで、APIコンシューマを登録して/ask-me-anything
のAIパワードAPIを使用し、ユーザーは自分のシークレットを使用してAPISIXを要求し、APIにアクセスするためのJWTトークンを生成することができます:
consumers:
- username: appsmithuser
plugins:
jwt-auth:
key: [email protected]
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
ステップ9: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":"Apache APISIXとは何ですか?"
}'
または、Postmanを使用して、AIの応答を取得しますが、この場合、応答はAPISIXゲートウェイを通じて送信されます。
結論
このチュートリアルでは、OpenAI ChatGPT APIを使用してプロンプトに対する応答を生成する方法を探求しました。APIを呼び出してプロンプトに対する応答を生成するSpring Bootアプリケーションを作成しました。次に、既存のapisix.ymlファイルを更新して、統合に追加の機能を導入することができます。また、with-frontendというブランチ名をチェックアウトし、APISIXと連携するAppsmithを使用して構築されたUIインターフェースを実行してみることもできます。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- フィールドからフォークへ:スタートアップが食品業界にAIのスモーガスボードを提供
- 誰が雨を止めるのか? 科学者が気候協力を呼びかける
- このスペースを見る:AIを使用してリスクを推定し、資産を監視し、クレームを分析する新しい空間金融の分野
- TaatikNet(ターティクネット):ヘブライ語の翻字のためのシーケンス・トゥ・シーケンス学習
- Meet ChatGLM2-6B:オープンソースのバイリンガル(中国語-英語)チャットモデルChatGLM-6Bの第2世代バージョンです
- 専門AIトレーニングの変革- LMFlowの紹介:優れたパフォーマンスのために大規模な基盤モデルを効率的に微調整し、個別化するための有望なツールキット
- プロンプトエンジニアリングへの紹介