Kong Gateway(OSS)を用いた実践例(2)
統一的なセキュリティ対策を実装する
続いて、統一的なセキュリティ対策を実装してみましょう。
ご自身のブラウザでPythonの実行環境であるJupyter Notebookにアクセスします。URL は、http://localhost:8080です。次に、03_prompt_guard.ipynbを開き以下のコードを実行します。
import os from openai import OpenAI client = OpenAI( api_key="dummy", base_url=os.getenv("GATEWAY_PROXY_ENDPOINT", "http://localhost:8000") + "/chat" ) stream = client.chat.completions.create( model="gpt-4o-mini", messages=[ {"role": "system", "content": "あなたは優秀なアシスタントです"}, {"role": "user", "content": "この時期、登山におすすめの山はどこですか?"} ], max_tokens=1024, temperature=0.7, stream=True ) for chunk in stream: print(chunk.choices[0].delta.content, end="")
実行後、問題なく応答が返ってくることを確認してください。ここから、Kong GatewayでPrompt Guardというプラグインを設定し、特定の内容が含まれるリクエストをブロックする設定を行います。まずは、Kong Managerの画面を開き、サイドバーからGateway Servicesを選択し、先ほど作成したchat-serviceを選択します。
次に、Pluginsタブを選択し、+ New Pluginボタンをクリックし、検索窓で Prompt Guardを入力し、表示されたプラグインを選択してください。
以下のように入力し、プラグインを設定してください。(指示のない箇所は、デフォルト値のまま進めてください。)
-
Deny Patterns:
.*登山.*
Prompt Guardプラグインは、プロンプトに含まれる文字列を検査し、指定された正規表現パターンによってコンテンツを許可/拒否することができるプラグインです。今回は、プロンプトに登山という文字列が含まれている場合にリクエストを拒否するような設定を加えています。先ほどと同様に03_prompt_guard.ipynbのコードを実行してみてください。今回は、プロンプトに「登山」という文字列が含まれているため、Prompt Guardプラグインによってリクエストが拒否され、エラーメッセージが返ってくることを確認できます。
# ... omit ... BadRequestError: Error code: 400 - {'error': {'message': 'bad request'}}
効率的なオブザーバビリティの実現
ご自身のブラウザでPythonの実行環境であるJupyter Notebookにアクセスします。URL は、http://localhost:8080です。次に、04_metrics.ipynbを開き以下のコードを実行します。
import requests, os response = requests.get( os.getenv("GATEWAY_STATUS_ENDPOINT", "http://localhost:8100") + "/metrics" ) print(response.text)
こちらのコードはKong Gatewayから公開されているStatus APIを呼び出し、メトリクス情報を取得する例です。実行すると、以下のようにPrometheus形式のメトリクスを取得することができます。
# HELP kong_datastore_reachable Datastore reachable from Kong, 0 is unreachable
# TYPE kong_datastore_reachable gauge
kong_datastore_reachable 1
# HELP kong_memory_lua_shared_dict_bytes Allocated slabs in bytes in a shared_dict
# TYPE kong_memory_lua_shared_dict_bytes gauge
kong_memory_lua_shared_dict_bytes{node_id="4c586433-4ca8-478f-b4c9-695078562a14",shared_dict="kong",kong_subsystem="http"} 45056
# ... 省略 ...
公開されているメトリクス情報には、AI関連のメトリクスが含まれていないことが確認できます。Kong Gatewayでは、これを有効化するためにPrometheusプラグインを利用します。Kong Managerの画面を開き、サイドバーからGateway Servicesを選択し、先ほど作成したchat-serviceを選択します。
次に、Pluginsタブを選択し、+ New Pluginボタンをクリックし、検索窓で Prometheusを入力し、表示されたプラグインを選択してください。
以下のように入力し、プラグインを設定してください。指示のない箇所は、デフォルト値のまま進めてください。
-
Advanced Parameters
- Ai Metrics:チェックを入れる
この状態で、02_openai_with_kong_gateway.ipynbのコードを何回か実行し、Kong Gateway経由でOpenAIのAPIを呼び出してみてください。再度、04_metrics.ipynbのコードを実行すると、以下のようにAI関連のメトリクスが取得できることが確認できます。
# ... 省略 ...
# HELP kong_ai_llm_tokens_total AI requests cost per ai_provider/cache in Kong
# TYPE kong_ai_llm_tokens_total counter
kong_ai_llm_tokens_total{ai_provider="openai",ai_model="gpt-4o-mini",cache_status="",vector_db="",embeddings_provider="",embeddings_model="",token_type="completion_tokens",workspace="default"} 59
kong_ai_llm_tokens_total{ai_provider="openai",ai_model="gpt-4o-mini",cache_status="",vector_db="",embeddings_provider="",embeddings_model="",token_type="prompt_tokens",workspace="default"} 4
kong_ai_llm_tokens_total{ai_provider="openai",ai_model="gpt-4o-mini",cache_status="",vector_db="",embeddings_provider="",embeddings_model="",token_type="total_tokens",workspace="default"} 63
# ... 省略 ...
API Gatewayをより広範なユースケースに用いたい方へ
今回は、Kong Gateway(OSS)を用いてハンズオンを実施しましたが、Kong Gateway(Enterprise)を利用することで、さらに多くのユースケースに対応することができます。以下は、対応可能なユースケースの一例です。
- セマンティック・キャッシュ:意味的に近い問い合わせをLLM APIへ問い合わせることなく、キャッシュ・サーバーから応答を返すことが可能です。これにより、トークン使用量の削減や応答時間の短縮が期待できます。
- RAGパイプラインの構築:ベクトルデータベース(pgvector, Redis)と組み合わせることで、RAGのパイプライン作成が可能です。これにより、外部知識を活用した応答生成が可能になります。
- MCP Serverの公開:REST APIで作成されているAPIをプラグインを用いることで、MCP Serverとして公開することが可能です。
まとめ
本記事では、LLMアプリケーションにおけるAPI/AI Gatewayの活用方法について説明しました。具体的には、Kong Gateway(OSS)を用いたハンズオンを通じて、API Keyや推論パラメータ、プロンプトの中央管理、統一的なセキュリティ対策、効率的なオブザーバビリティの実現について紹介しました。特に複数のLLMアプリケーションを開発・運用する場合、統一的なポリシーを効かせるためにAPI Gatewayが有効的に使えることが確認できたかと思います。この記事が、LLMアプリケーションの開発・運用に携わる方々の一助になれば幸いです。
