Closed5

Cloudflare AI Gatewayを試す

kun432kun432

AI Gatewayの作成

CloudflareのコンソールからAI Gatewayを作成する

サクッと作成される。

AI Gatewayにアクセスしてみる

右上の「API Endpoints」をクリック

APIエンドポイント URLが表示され、下にサンプルコードが用意されている。

OpenAI向けのサンプルコードを試してみる。ドロップダウンからOpenAIを選択。

サンプルコードをコピーする。

実際のサンプルコードはこんな感じ。

$ curl -X POST https://gateway.ai.cloudflare.com/v1/XXXXXXXXXXXXXXXXXXXXXXXXX/kun-432-test/openai/chat/completions \
  -H 'Authorization: Bearer XXX' \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "gpt-3.5-turbo",
    "messages": [
      {
        "role": "user",
         "content": "What is Cloudflare?"
      }
    ]
  }
  '

'Authorization: Bearer XXX' に OpenAIのAPIキーをセットして実行してみると、こんな感じでレスポンスが返ってくる。

{
  "id": "chatcmpl-8AWTnb4pNSJ3R3IH53QePLOO8a7F8",
  "object": "chat.completion",
  "created": 1697518823,
  "model": "gpt-3.5-turbo-0613",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "Cloudflare is a global cloud-based network services provider that offers website security, content delivery, and distributed domain name server (DNS) services. It acts as a protective shield between websites and the internet, helping to enhance security, improve website performance, and protect against DDoS attacks. Cloudflare's services include DNS management, website optimization, load balancing, caching, and firewall protection. It serves as a middleman between website visitors and the website's hosting server, helping to speed up website loading times and provide additional layers of security."
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 12,
    "completion_tokens": 107,
    "total_tokens": 119
  }
}

アクセスログとアナリティクス

AI Gatewayのタブでそれぞれ確認できる。

なお、アナリティクスはプロバイダーごとに絞り込みができる。ここにはAzureも見えるけど、10/17時点ではドキュメントにも記載はないし、どうやらまだ対応していない様子。

kun432kun432

Universal Endpoint

一番興味があったのがこれ

https://developers.cloudflare.com/ai-gateway/providers/universal/

ざっとドキュメント見た感じ、

  • 複数のプロバイダーを一つのエンドポイントで集約する
  • プロバイダーごとにスキーマを設定
  • Act/Standby的に、失敗したら別のプロバイダーを呼び出す

ように読めるけれども、Round Robinができたらいいなー、という思い

kun432kun432

Caching

キャッシュを有効化できる。AI GatewayのSettingsから有効にする。

キャッシュ時間は1分〜1年で選択できる。

実際にアクセスしてみる。わかりやすいようにGPT−4を使ってみる。

$ time curl -X POST https://gateway.ai.cloudflare.com/v1/XXXXXXXXXXXXXXXXXXXXXXXXX/kun-432-test/openai/chat/completions \
  -H 'Authorization: Bearer XXX' \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "gpt-4",
    "messages": [
      {
        "role": "user",
         "content": "What is Cloudflare?"
      }
    ]
  }
  '
{
  "id": "chatcmpl-8AXHzekC3GrNFKX9CGjA1hqfJpBtx",
  "object": "chat.completion",
  "created": 1697521935,
  "model": "gpt-4-0613",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "Cloudflare is a web infrastructure and website security company, providing content delivery network services, DDoS mitigation, Internet security, and distributed domain name server services. Cloudflare's services protect and accelerate any Internet service online."
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 12,
    "completion_tokens": 44,
    "total_tokens": 56
  }
}
real	0m4.599s
user	0m0.057s
sys	0m0.009s

再度実行

{
  "id": "chatcmpl-8AXHzekC3GrNFKX9CGjA1hqfJpBtx",
  "object": "chat.completion",
  "created": 1697521935,
  "model": "gpt-4-0613",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "Cloudflare is a web infrastructure and website security company, providing content delivery network services, DDoS mitigation, Internet security, and distributed domain name server services. Cloudflare's services protect and accelerate any Internet service online."
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 12,
    "completion_tokens": 44,
    "total_tokens": 56
  }
}
real	0m0.719s
user	0m0.055s
sys	0m0.008s

1回目と同じ内容でレスポンスが返ってきて、実行時間が短くなっていることから、キャッシュの回答であることがわかる。

少しだけ変えて再実行してみる

(snip)
         "content": "What is Cloudflare???"
(snip)
{
  "id": "chatcmpl-8AXIFKA4wXCauadi2HIGjLnwvbeJR",
  "object": "chat.completion",
  "created": 1697521951,
  "model": "gpt-4-0613",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "Cloudflare is an American company that provides content delivery network services, DDoS mitigation, Internet security, and distributed domain name server services. Its services protect and accelerate any website online. Essentially, it makes websites more secure and helps them load faster."
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 12,
    "completion_tokens": 50,
    "total_tokens": 62
  }
}
real	0m4.235s
user	0m0.051s
sys	0m0.012s

単純にリクエストの内容を元にして、レスポンスをキャッシュしている様子。

あと、気になったので適当なカスタムヘッダをつけて内容を変えて何度か送信してみたけど、キャッシュされたレスポンスが返ってくるようなので、ボディを見てるっぽい。

$ time curl -X POST https://gateway.ai.cloudflare.com/v1/XXXXXXXXXXXXXXXXXXXXXXXXX/kun-432-test/openai/chat/completions \
  -H 'X-TEST-ID: foo' \
  -H 'Authorization: Bearer XXX' \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "gpt-4",
    "messages": [
      {
        "role": "user",
         "content": "What is Cloudflare?"
      }
    ]
  }
  '
(snip)
real	0m0.606s
user	0m0.051s
sys	0m0.012s
$ time curl -X POST https://gateway.ai.cloudflare.com/v1/XXXXXXXXXXXXXXXXXXXXXXXXX/kun-432-test/openai/chat/completions \
  -H 'X-TEST-ID: bar' \
  -H 'Authorization: Bearer XXX' \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "gpt-4",
    "messages": [
      {
        "role": "user",
         "content": "What is Cloudflare?"
      }
    ]
  }
  '
(snip)
real	0m0.137s
user	0m0.048s
sys	0m0.016s

サービスで使うならばユーザーごとにレスポンスキャッシュは分けたいよねーと思っていたら、OpenAI Chat Completion APIのリクエストボディにuserというのがある。

https://platform.openai.com/docs/api-reference/chat/create#chat/create-user

user string Optional
A unique identifier representing your end-user, which can help OpenAI to monitor and detect abuse. Learn more.

試してみた。

$ time curl -X POST https://gateway.ai.cloudflare.com/v1/XXXXXXXXXXXXXXXXXXXXXXXXX/kun-432-test/openai/chat/completions \
  -H 'Authorization: Bearer XXX' \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "gpt-4",
    "messages": [
      {
        "role": "user",
         "content": "What is Cloudflare?"
      }
    ],
    "user": "001"
  }
  '
(snip)
real	0m4.621s
user	0m0.052s
sys	0m0.009s
  
  $ time curl -X POST https://gateway.ai.cloudflare.com/v1/XXXXXXXXXXXXXXXXXXXXXXXXX/kun-432-test/openai/chat/completions \
  -H 'Authorization: Bearer XXX' \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "gpt-4",
    "messages": [
      {
        "role": "user",
         "content": "What is Cloudflare?"
      }
    ],
    "user": "002"
  }
  '
  (snip)
real	0m6.453s
user	0m0.058s
sys	0m0.004s

なるほど。上には書いてないけど、もう一度リクエストするとそれぞれ高速にレスポンスが返ってきた=キャッシュレスポンスだったので、リクエストボディ単位でキャッシュは管理されているで良さそう。

ただしあまりキャッシュを細かく管理するようなインタフェースはない(世の中一般的にキャッシュ管理するようなものでそういうインタフェースがあるのか知らない)

kun432kun432

とりあえず自分的には

  • Azureまだサポートされていない(すぐにサポートされそう)
  • Universal Endpointは耐障害性にはよさそうだけど負荷分散にはならなさそう
  • キャッシュは(多分)リクエストボディを見てる。OpenAI Chat Completion使うならリクエストボディでuser指定すればユーザーごとにキャッシュもたせられる。
  • キャッシュを管理できるインタフェースはない
  • できればPythonで書きたい

この辺が改善されたらという感じだけど、めちゃめちゃ簡単に使えるのは良き

このスクラップは2023/10/17にクローズされました