LoginSignup
0
0
お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

Kong Gatewayを使ってAIの問い合わせ先を簡単に切り替える

Last updated at Posted at 2024-06-12

AIに問い合わせをする際、AIの回答の精度の都合上色んなAIに聞いて答えを比較したいことがあると思う。
その際、それぞれに毎回URLやリクエストを変えて聞くのはちょっと面倒である。
Kong Gatewayを使うとアクセス先を変えずにヘッダ情報だけ変えて、例えばllm: openaiと指定したらOpenAI(ChatGPT)llm: cohereと指定したらCohereに問い合わせるようなことが出来るので、これの設定手順を確認する。

検証の前提

以下が揃ってるものとする。

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を使うようなことが出来る。
20240612160221.png

この仕組みを使ってヘッダで宛先を切り替える。

設定

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から確認することが出来る。
20240612163808.png

動作確認

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でも同じような事は出来そうだが、動作環境を問わない点から制限された環境での選択肢としては頭の隅に置いておくとよさそう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0