Kong GatewayのAI ProxyプラグインでAmazon Bedrockのモデルを実行してみる

Kong GatewayのAI ProxyプラグインでAmazon Bedrockのモデルを実行してみる

Clock Icon2024.12.12

生成AIを使って業務を効率化したい えがわ です。

本記事は「Kong Advent Calendar 2024」の12日目のエントリとして、Kong GatewayのAI Proxyプラグインを使用してBedrockでモデルを実行してみます。

KongといえばAPI Gatewayという方も多いと思いますが、生成AIの機能も非常に強力です。
今回はKong GatewayのAIプラグインを活用しAmazon Bedrockを使用して言語モデルを実行します。

Kongの説明は以下の記事をご確認ください。
https://dev.classmethod.jp/articles/kong-konnect-api-management/

構成図

今回の構成図はこちらです。

kong_aiproxy_bedrock_05.png

Kong Konnectを使用してEC2にKong Gatewayをデプロイし、AI ProxyプラグインでBedrockのモデルを実行します。
AWSのリソースにKong Gatewayをデプロイすることで、キーやシークレットが必要なくIAMロールで管理を行うことが可能です。

環境

  • Kong Konnect
  • Kong Gateway 3.8
  • EC2: Amazon Linux 2023

事前準備

EC2の起動および接続方法については本題から外れるため割愛します。
パブリックサブネットに配置、IPアドレスの付与、そして、以下のセキュリティグループの設定が必要です。

セキュリティグループの設定

Kong GatewayはデフォルトではTCP8000を使用しますので、セキュリティグループのインバウンドルールを許可しておきます。

kong_lambda_plugin_15

他の機能を使用する場合はそのポートも許可する必要があります。
kong_lambda_plugin_02.png
こちらより抜粋

IAMロールを作成

EC2からBedrock呼び出すため、EC2に付与するIAMロールを作成します。
IAMポリシーとしてbedrock:InvokeModelを許可します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "bedrock:InvokeModel"
            ],
            "Resource": "*"
        }
    ]
}

作成したロールをEC2に設定します。

kong_lambda_plugin_06.png
kong_aiproxy_bedrock_06

Dockerを起動

EC2に接続しDockerを起動します。

# システムの更新
sudo dnf update -y

# Dockerのインストール
sudo dnf install docker -y

# Dockerサービスの起動
sudo systemctl start docker

# システム起動時にDockerを自動起動する設定
sudo systemctl enable docker

# 現在のユーザー(ec2-user)をdockerグループに追加
sudo usermod -aG docker ec2-user

# Dockerバージョンの確認
docker --version

Kong Gatewayを起動

KonnectからKong Gatewayを作成していきます。

Gateway Manager -> New Gatewayを押下します。

kong_lambda_plugin_03.png

Self-Managed Hybridを選択し、Nameを入力します。

kong_lambda_plugin_04.png

PlatformでLinux (Docker)を選択し、Generate Certificateを押下します。

kong_lambda_plugin_05.png

表示されたdocker runコマンドを実行します。
※文頭にsudoを付与する必要があります。

EC2でKong Gatewayを起動できました。

やってみる

今回はBedrockのモデルとしてNova Liteを使用します。
BedrockのモデルIDはこちらから確認が可能です。
https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html

Serviceを作成

BedrockにアクセスするためのServiceを作成します。

項目
Name bedrock-service
Upstream URL https://bedrock-runtime.us-east-1.amazonaws.com

kong_aiproxy_bedrock_01.png

Routeを作成

BedrockにアクセスするためのRouteを作成します。

項目
Name nova-lite-route
Service 作成したService
Paths /bedrock/novalite

kong_aiproxy_bedrock_02.png

Routeが作成できました。

プラグインを作成

Bedrockを利用するため、RouteにAI Proxyプラグインを設定します。

kong_aiproxy_bedrock_03.png

AI Proxyプラグインを選択し、設定画面に遷移します。
Nova Liteを使用するため、Model.Nameにはamazon.nova-lite-v1:0を使用します。

項目
Model.Name amazon.nova-lite-v1:0
Model.Options.Bedrock.Aws Region us-east-1
Model.Provider bedrock
Route Type /llm/v1/chat

やってみる

準備ができたので、作成したルートにアクセスしてみます。
EC2のグローバルIP宛にリクエストします。

request
curl -i -X POST http://{xxx.xxx.xxx.xxx}:8000/bedrock/novalite \
-H 'Content-Type: application/json' \
--data-raw '{ "messages": [ { "role": "system", "content": "あなたは数学者です" }, { "role": "user", "content": "1 + 1はなんですか?"} ] }'
response
HTTP/1.1 200 OK
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
Date: Mon, 09 Dec 2024 05:55:06 GMT
x-amzn-RequestId: 031e9356-d759-498f-9345-891c4861b152
X-Kong-LLM-Model: bedrock/amazon.nova-lite-v1:0
X-Kong-Upstream-Latency: 249
X-Kong-Proxy-Latency: 1
Via: 1.1 kong/3.8.0.0-enterprise-edition
Server: kong/3.8.0.0-enterprise-edition
X-Kong-Request-Id: 7287413cabbf3741d1eaa03dab06216b

{
	"object": "chat.completion",
	"model": "amazon.nova-lite-v1:0",
	"usage": {
		"prompt_tokens": 14,
		"total_tokens": 71,
		"completion_tokens": 57
	},
	"choices": [
		{
			"finish_reason": "end_turn",
			"message": {
				"content": "1 + 1は2です。これは基本的な加算の法則に基づくもので、2つの1を合計すると2になります。数学では、このような基本的な演算は非常に重要で、より複雑な計算や理論の基礎となります。",
				"role": "assistant"
			},
			"index": 0
		}
	]
}

AI Proxyプラグインを使用してBedrockへアクセスすることができました。

AI Prompt Guardプラグイン

AI Prompt Guardはプロンプトを精査し、リクエストを制御することが可能です。

  • If any deny expressions are set, and the request matches any regex pattern in the deny list, the caller receives a 400 response.
  • If any allow expressions are set, but the request matches none of the allowed expressions, the caller also receives a 400 response.
  • If any allow expressions are set, and the request matches one of the allow expressions, the request passes through to the LLM.
  • If there are both deny and allow expressions set, the deny condition takes precedence over allow. Any request that matches an entry in the deny list will return a 400 response, even if it also matches an expression in the allow list. If the request does not match an expression in the deny list, then it must match an expression in the allow list to be passed through to the LLM
    こちらから抜粋

文章問題のように感じますが、要約すると以下となります。

  • 拒否リストに設定された文字列は拒否
  • 許可リストが設定されており、その文字列を含んでいなければ拒否

許可リストに挨拶を設定し、挨拶ができない人は回答を得られないようにしてみます。

kong_aiproxy_bedrock_04.png

挨拶なしでリクエストしてみます。

request
curl -i -X POST http://{xxx.xxx.xxx.xxx}:8000/bedrock/novalite \
-H 'Content-Type: application/json' \
--data-raw '{ "messages": [ { "role": "system", "content": "あなたは数学者です" }, { "role": "user", "content": "1 + 1はなんですか?"} ] }'
response
HTTP/1.1 400 Bad Request
Date: Mon, 09 Dec 2024 06:39:47 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Content-Length: 35
X-Kong-Response-Latency: 1
Server: kong/3.8.0.0-enterprise-edition
X-Kong-Request-Id: 8d470f3ff7bf486f03b6e443f17b4e1c

{"error":{"message":"bad request"}}

挨拶ができないので、回答を得られません。

プロンプトに挨拶を含めます。

request
curl -i -X POST http://{xxx.xxx.xxx.xxx}:8000/bedrock/novalite \
-H 'Content-Type: application/json' \
--data-raw '{ "messages": [ { "role": "system", "content": "あなたは数学者です" }, { "role": "user", "content": "こんにちは、1 + 1はなんですか?"} ] }'
response
{
	"object": "chat.completion",
	"model": "amazon.nova-lite-v1:0",
	"usage": {
		"prompt_tokens": 16,
		"total_tokens": 45,
		"completion_tokens": 29
	},
	"choices": [
		{
			"finish_reason": "end_turn",
			"message": {
				"content": "こんにちは、1 + 1 は 2 です。もっと複雑な計算や数学に関する質問があれば、いつでも聞いてください。",
				"role": "assistant"
			},
			"index": 0
		}
	]
}

挨拶ができたので、回答を得ることができました。

別のLLMにアクセスしてみる(オプション)

AI Proxyプラグインは同じリクエストパラメータで別のモデルを利用することが可能です。
そのため、簡単にモデルを切り替えることが可能です。
Bedrockに限らず、OpenAI社のモデルなど別のモデルにアクセスする際も同様です。
以下の設定でルートとプラグインを設定します。

ルート

項目
Name claude-haiku-3-route
Service 作成したService
Paths /bedrock/haiku

AI Proxyプラグイン

項目
Model.Name anthropic.claude-3-haiku-20240307-v1:0
Model.Options.Bedrock.Aws Region us-east-1
Model.Provider bedrock
Route Type /llm/v1/chat
request
curl -i -X POST http://{xxx.xxx.xxx.xxx}:8000/bedrock/haiku \
-H 'Content-Type: application/json' \
--data-raw '{ "messages": [ { "role": "system", "content": "あなたは数学者です" }, { "role": "user", "content": "1 + 1はなんですか?"} ] }'
response
HTTP/1.1 200 OK
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
Date: Mon, 09 Dec 2024 06:06:08 GMT
x-amzn-RequestId: 2042351d-2100-4059-b6be-333d278f9aee
X-Kong-LLM-Model: bedrock/anthropic.claude-3-haiku-20240307-v1:0
X-Kong-Upstream-Latency: 432
X-Kong-Proxy-Latency: 2
Via: 1.1 kong/3.8.0.0-enterprise-edition
Server: kong/3.8.0.0-enterprise-edition
X-Kong-Request-Id: 0ef399731b1f2659c759542a7144e172

{
	"object": "chat.completion",
	"model": "anthropic.claude-3-haiku-20240307-v1:0",
	"usage": {
		"prompt_tokens": 27,
		"total_tokens": 43,
		"completion_tokens": 16
	},
	"choices": [
		{
			"finish_reason": "end_turn",
			"message": {
				"content": "1 + 1 は 2 です。",
				"role": "assistant"
			},
			"index": 0
		}
	]
}

サポートされていないモデルの場合

サポートされていないモデルも存在します。
以下の設定でAI Proxyプラグインを設定し、アクセスしてみます。

項目
Model.Name anthropic.claude-3-5-haiku-20241022-v1:0
Model.Options.Bedrock.Aws Region us-east-1
Model.Provider bedrock
Route Type /llm/v1/chat
request
curl -i -X POST http://{xxx.xxx.xxx.xxx}:8000/bedrock/haiku
-H 'Content-Type: application/json' \
--data-raw '{ "messages": [ { "role": "system", "content": "あなたは数学者です" }, { "role": "user", "content": "1 + 1はなんですか?"} ] }'
response
HTTP/1.1 400 Bad Request
Content-Type: application/json
Connection: keep-alive
Date: Mon, 09 Dec 2024 06:01:27 GMT
x-amzn-RequestId: 42436ca7-795e-4a31-b789-d2342510ffac
x-amzn-ErrorType: ValidationException:http://internal.amazon.com/coral/com.amazon.bedrock/
Content-Length: 210
X-Kong-Upstream-Latency: 30
X-Kong-Proxy-Latency: 3
Via: 1.1 kong/3.8.0.0-enterprise-edition
Server: kong/3.8.0.0-enterprise-edition
X-Kong-Request-Id: d59e1b24f6d59e04a9c7543f83ee3714

{
	"message": "Invocation of model ID anthropic.claude-3-5-haiku-20241022-v1:0 with on-demand throughput isn’t supported. Retry your request with the ID or ARN of an inference profile that contains this model."
}

2024/12/09現在、Claude 3.5 Haikuはサポートされていないといったメッセージが返ってきます。

さいごに

Kong GatewayのAI Proxyプラグインを使用してBedrockのモデルを実行してみました。
今回はAI ProxyAI Prompt Guardを使用していますが、トークンでの流量制限など、生成AI専用のプラグインも多数存在します。
Kong Gatewayでプラグインを活用し、セキュアな生成AIアプリケーションを作成してみてはいかがでしょうか。
この記事がどなたかの参考になれば幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.