AIに問い合わせをする際、AIの回答の精度の都合上色んなAIに聞いて答えを比較したいことがあると思う。
その際、それぞれに毎回URLやリクエストを変えて聞くのはちょっと面倒である。
Kong Gatewayを使うとアクセス先を変えずにヘッダ情報だけ変えて、例えばllm: openai
と指定したらOpenAI(ChatGPT)、llm: cohere
と指定したらCohereに問い合わせるようなことが出来るので、これの設定手順を確認する。
検証の前提
以下が揃ってるものとする。
- Kong Gateway
- deck CLI
Kong Gatewayの構築手順は過去にKubernetesではcert-managerでTLS化したKong Gatewayを構築する、DockerではローカルPC+GitHubActionsでAPIOpsを実装するなどの記事で紹介しているので、必要であればそちらを参照して欲しい。
私個人はMac上にMicrok8sでK8sクラスタを構築し、その上にKong Gatewayを立てて検証した。
なお、設定にはdeck
を使うが、deck
を使わずWebUI(Kong Manager)から設定することも出来るが今回は割愛する。
Kong Gatewayの前提知識
Kong GatewayではServiceとRouteという概念があり、すごくざっくり言うとServiceは外部のサービス(例えばChatGPT)を定義したもので、RouteはそのServiceにアクセスするための条件(パス、認証、etc)を定義したものとなる。
ServiceとRouteは1対多の関係となっており、Routeに関しては同じパスでも条件を変えることで同じServiceに対していくつか定義する事ができる。
例えば、パスが/common-ai
で、ヘッダがllm: openai
の時、OpenAI向けの設定をしたAI Proxy Pluginを使い、同じパスでヘッダがllm: cohere
の場合はCohere向けの設定をしたAI Proxy Pluginを使うようなことが出来る。
この仕組みを使ってヘッダで宛先を切り替える。
設定
deck
に読ませるKong Gatewayの設定ファイル(common-ai.yaml
)を生成する。
cat << E0F > ./common-ai.yaml
services:
- name: common-ai
host: localhost
port: 8000
routes:
- name: openai
headers:
llm:
- openai
paths:
- "~/common-ai$"
methods:
- POST
plugins:
- name: ai-proxy
config:
route_type: "llm/v1/chat"
auth:
header_name: "Authorization"
header_value: "Bearer sk-proj-MMHxxxxx"
model:
provider: "openai"
name: "gpt-3.5-turbo"
options:
max_tokens: 512
temperature: 1.0
- name: cohere
headers:
llm:
- cohere
paths:
- "~/common-ai$"
methods:
- POST
plugins:
- name: ai-proxy
config:
route_type: "llm/v1/chat"
auth:
header_name: "Authorization"
header_value: "Bearer pasczxxxxxxx"
model:
provider: "cohere"
name: "command"
options:
max_tokens: 512
temperature: 1.0
EOF
ポイントだけ簡単に説明する。
services:
- name: common-ai
host: localhost
port: 8000
通常ここはアクセス先となるエンドポイント(ChatGPTなど)を指定するのだが、AI Proxy Pluginを使う場合はここの設定は見ずにプラグイン内で持っているAIのエンドポイントを直接叩きに行くのでこのような設定で問題ない。
routes:
- name: openai
headers:
llm:
- openai
上記でRouteに対して有効なヘッダを設定している。
これを設定することで、単にRouteのパスにアクセスしても"no Route matched with those values"
が返ってきて有効なRouteと見なされない。
同様の設定をCohereのRouteにも設定することで、同じパスでもRouteを切り替えるようにしている。
plugins:
- name: ai-proxy
config:
上記でAI Proxy Pluginを有効にし、AIへのアクセスを設定する。
今回ConfigはOpenAIとCohere向けに設定しているが、ここの設定を変えればMistral、LlaMA等別のAIも利用可能である。
auth:
header_name: "Authorization"
header_value: "Bearer pasczxxxxxxx"
上記は認証用トークンであるため、各自でトークンを発行して変更すること。
設定ファイルを作成したら、deck
を使って現在の設定に追記する形で適用する。
deck
を使うために環境変数を設定する。
export DECK_KONG_ADDR=https://admin.kong.192.168.64.201.sslip.io/api
export DECK_TLS_SKIP_VERIFY=true
DECK_KONG_ADDR
にAdmin APIのアドレスを設定する。
dockerであればおそらくhttp://localhost:8001
となる。
また自環境では自己署名証明書を使って構築していたため、証明書の検証をスキップするためにDECK_TLS_SKIP_VERIFY
も設定した。
次に現在のKong Gatewayの設定を出力する。
deck gateway dump -o /tmp/dump.yaml
作成した設定ファイルを含めてKong Gatewayに設定を反映する。
deck gateway sync ./common-ai.yaml /tmp/dump.yaml
設定が反映されると、以下のようにKong Managerから確認することが出来る。
動作確認
ProxyのURLを環境変数に設定する。dockerであればおそらくhttp://localhost:8000
となる
PROXY=https://192.168.64.202
最初にヘッダなしでアクセスしてみる。
curl -k --http1.1 -X POST $PROXY/common-ai \
-H "Content-Type: application/json" \
-d '{
"messages": [{
"role": "user",
"content": "Who are you?"
}] }'
ヘッダが足りないので、Routeが見つからず出力は以下のようになる。
{
"message":"no Route matched with those values",
"request_id":"715c010ee6634610991c806806307b4d"
}
ヘッダを付与してみる。最初にOpenAIから試してみる。
curl -k --http1.1 -X POST $PROXY/common-ai \
-H "llm: openai" \
-H "Content-Type: application/json" \
-d '{
"messages": [{
"role": "user",
"content": "Who are you?"
}] }' | jq .
すると以下のような出力が得られる。
:(省略)
"content": "I am a language model AI created by OpenAI. My purpose is to assist and provide information to the best of my abilities. How can I help you today?"
:(省略)
OpenAIということが確認できた。
次にCohereで試してみる。
curl -k --http1.1 -X POST $PROXY/common-ai \
-H "llm: cohere" \
-H "Content-Type: application/json" \
-d '{
"messages": [{
"role": "user",
"content": "Who are you?"
}] }' | jq .
こちらでは以下のような出力が得られる。
:(省略)
"content": "I am your friendly AI-assistant chatbot created by the company Cohere. My name is Coral! I am trained to be helpful, polite, and inclusive in our conversation. Do feel free to ask me anything you like, and I will do my best to respond to your queries. \n\nIt is worthwhile to note that my knowledge till date is only up to June 12, 2024, meaning I am not aware of any events or information that has occurred post this date.",
:(省略)
ということで、アクセス先を変えずにヘッダだけで簡単にAIを切り替えることが出来た。
こんな感じでKong Gatewayを上手く使えば、AIによる回答比較なども簡単に出来そうだ。
AWSのBedrockでも同じような事は出来そうだが、動作環境を問わない点から制限された環境での選択肢としては頭の隅に置いておくとよさそう。