KonnectのAI ManagerでLLMの利用状況を可視化する

先月末にKong KonnectにAI Managerという機能が[実装された](https://konghq.com/blog/product-releases/kong-ai-manager)。
この機能の特長として以下が挙げられる。
- AIポリシーの管理
- LLMカタログの可視化
- LLMの利用者の可視化
- LLMのトラフィックや使用量の分析

要はAPI GatewayであるKong Gatewayを利用してのLLMアクセスが簡単に設定でき、可視化・分析が簡単に行えるようになる機能と思ったら良さそう。
どんな感じで設定でき、どんな感じでLLMの利用状況が見れるのか実際に触ってみる。

### 検証の前提
今回は以下の環境で確認する。

- 構成はHybridモードとし、Data PlaneをローカルPCにDockerで展開済み
- LLMはOpenAIとCohereを利用

## AI Managerの利用
### 設定
LLMの設定はControl Planeに紐づくのだが、AI ManagerはControl Planeに紐づかず独立して存在している。
なので機能を利用する際は左サイドバーでControl Planeを選択せずに`AI Manager`をクリックして利用する。
![Pasted image 20250602112130.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/45398328-7b89-4da5-ae4c-edc905906775.png)

`Expose LLM`をクリックするとLLMの登録画面になる。
ここでは以下の情報を選択・入力出来る。
- General Information：追加するLLM provider(OpenAI等)とモデル(`gpt-4`等)を選択・入力することが出来る
- Authentication：認証方法をクライアント側で指定するか（Authorizationヘッダに足すか）、Kong Gateway側に保存するかを指定する。
- Route：Gateway経由でLLMにアクセスする方法を指定する。ここはKong GatewayのRoute設定と同じ。
- Control Plane：紐づけるControl Planeを指定する

今回の検証では最初に以下のように設定した。
- LLM provider：`OpenAI`
	- Specific model：`gpt-4`
- Authentication：Provided by the AI gateway
	- API key：`sk-sv...` (OpenAIのトークン)
- Route：Basic
	- Path：`/openai`
- Control Plane：`ai-gateway` (検証用に作成していたCPを指定)

保存するとLLMがカタログ的に表示される。
同じ要領でCohereの情報も登録する。
- LLM provider：`Cohere`
	- Specific model：`gpt-4`
- Authentication：Provided by the AI gateway
	- API key：`NZv9...` (Cohereのトークン)
- Route：Basic
	- Path：`/cohere`
- Control Plane：`ai-gateway` 

2つ登録した後のAI Managerの画面は以下となる。
![Pasted image 20250602114100.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/4e75b28d-2899-466b-b107-a229f5cb66c7.png)

それぞれのトークン数、エラー率、レイテンシや利用者(agent)数が読み取れそうなことが確認できる。
ちなみにこの時にControl Planeの中を見るとService/Route/Pluginが設定されていることが確認できる。
![Pasted image 20250602114338.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/e5e2a91b-01c2-4459-ad6d-e3dcfa67277c.png)

![Pasted image 20250602114354.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/37cd8e24-2565-48c0-b36b-734ce6edccd1.png)

勿論これらはdeckコマンドによりバックアップ・リストアも簡単に実行できる。

AI Managerの1つの機能はこのように、設定を簡略化出来る点がある。
従来だとAI Proxyの設定は項目が多くて尻込みする要素があったが、AI Managerを使うと非常に簡単に設定できることが確認できた。
ただ、今時点だと作成後に設定を変更する手段がAI Managerから提供されていないように見える。
設定変更については作成されたService/Route/Pluginを手動で変更する必要がありそうだ。
（将来的には改善されるんじゃないかなと思う）
### メトリクスの確認
Kong Gateway経由でそれぞれ名前を聞いてみる。
まずはOpenAIから。
```bash
curl -k --compressed -X POST localhost:8000/openai \
  -H "Content-Type: application/json" -d '{
    "messages": [{
    "role": "user",
    "content": "あなたの名前を教えてもらっていいですか?"
  }] }' | jq .
```
実行した結果、以下の回答が得られた。
```json
 "content": "私の名前はOpenAIです。あなたの質問に答えるためにプログラムされた人工知能です。",
```

次にCohereに対して実行してみる。
```bash
curl -k -X POST localhost:8000/cohere \
  -H "Content-Type: application/json" -d '{
    "messages": [{
    "role": "user",
    "content": "あなたの名前を教えてもらっていいですか?"
  }] }' | jq .
}
```
実行した結果、以下の回答が得られた。
```json
        "content": "はい、もちろんです！私の名前は「ココア」です。皆さんに楽しいお話を提供できるよう頑張りますね。よろしくお願いします！",
```
それぞれ正常にアクセスできるようだ。
実行後、AI Managerの画面を再度見てみる。
![Pasted image 20250602120051.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/73c14c52-4251-4a63-a51d-74af1c23f60f.png)

それぞれのモデルへアクセスした時の情報（トークン数、レイテンシ等）が確認できる。
ここで詳細を見るためにLLM名(ここではCohere）をクリックする。
すると以下のようにリクエスト数や接続元agentの情報などが表示されるようになった。
![Pasted image 20250602120159.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/5a8a7c36-2bfa-4bb9-9283-985acb12ecbe.png)

今はConsumerを設定していなかったのでAnonymousになった。
試しにConsumerを設定してみる。
対象ServiceにKey Auth Pluginを設定し、`yamada`というConsumerにキー(`yamada-key`)を割り当てて再度アクセスしてみる。（設定方法の説明は割愛）
最初に鍵無しでアクセスする。
```json
{
  "message": "No API key found in request",
  "request_id": "9bf61175706b8d523ecbf1428a67f87e"
}
```
エラーとなった。
なお、[Plugin execution order](https://docs.konghq.com/konnect/reference/plugins/)を見るとai-proxyの優先度が770でkey-authが1250となっており、Key Auth Pluginでエラーとなった場合はAI Proxy Pluginまで行かずにエラーとなるため、AI側のメトリクスにはエラーはカウントされない。

次に`-H "apikey:yamada-key"`をつけて再度アクセスする。
```bash
curl -k -X POST  localhost:8000/cohere -H "apikey:yamada-key"  -H "Content-Type: application/json" -d '{
    "messages": [{
    "role": "user",
    "content": "あなたの名前を教えてもらっていいですか?"
  }] }' | jq .
```
今度は問題なくアクセスできる。
AI Managerのダッシュボードを見るとアクセスしたConsumerが確認できｒ。
![Pasted image 20250602133520.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/fb6319e5-ada6-4311-8549-dd9af30dce13.png)

次に左サイドバーの`Go to LLM analytics`をクリックして詳細を確認する。
デフォルトでは以下のようにリクエストカウントが表示される。
![Pasted image 20250602133639.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/1c0a9465-41e9-4f9d-9783-289112af8c81.png)

せっかくなのでConsumerを確認してみる。
`by`のところをConsumerに変更する。
![Pasted image 20250602133744.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/c942fd4a-6c63-46fe-b1bc-bfd5b70a98e8.png)

すると誰がいつリクエストを発行したかが確認できる。
![Pasted image 20250602133814.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/f71be051-417d-419b-bbdb-b81ebf04b88d.png)

`filter`でモデルを指定したり、`with`で単位をリクエスト数からトークン数に変えたりすることも出来る。

![Pasted image 20250602134149.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/fe942edf-c9cc-48c5-a021-bce0aeedc11b.png)

LLMの利用状況を追うのに便利そう。

## まとめ
AI Managerを使うことで、LLMへのトラフィックを簡単に設定・可視化することが出来た。
最近はEconomic DoSによるAI破産のような話もあり、LLMの利用を適切に管理・監視する重要性が高まっているが、そのようなガバナンスを聞かせたLLMの利用という点でAI Managerは活躍の場が結構ありそうだと思う。