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レスポンスです:

{  
"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のmodelAPIキーのプロパティを指定します:

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!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

データサイエンス

Zipperを使用してサーバーレスアプリを高速に構築:TypeScriptで記述し、その他のすべてをオフロードする

「Ruby on Railsの良い思い出を振り返った後、私はZipperプラットフォームを発見し、どれだけ速く価値あるものを作れるかを試...

機械学習

ビッグテックと生成AI:ビッグテックが生成AIを制御するのか?

「ビッグテックと生成AIの深まる関係を探求する:これらの巨人はセクターを支配するのか、それともバランスの取れたAIの景観...

データサイエンス

「AIと倫理の架け橋:医療実施における包括的な解決策」

「この記事では、AIの倫理的な考慮事項について掘り下げ、医療の分野でAIの力を責任を持ってかつ公正に活用する方法について...

人工知能

なぜBankrateはAI生成記事を諦めたのか

1月に、Bankrateとその姉妹サイトであるCNETがAIによって生成された数百の記事を公開することで話題となりました彼らは慎重に...

AIニュース

OpenAIはGPT-4をターボチャージしています:高速かつ手頃な価格で生成型AIを革命化

ジェネレーティブAIの世界は、OpenAIが最新のブレイクスルー、GPT-4 Turboを発表すると大いに盛り上がっています。この革命的...

データサイエンス

「LangChain、Activeloop、およびDeepInfraを使用したTwitterアルゴリズムのリバースエンジニアリングのためのプレーンな英語ガイド」

このガイドでは、Twitterの推奨アルゴリズムを逆解析して、コードベースをより理解し、より良いコンテンツを作成するための洞...