Cloudflare AI Gatewayを試す
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時点ではドキュメントにも記載はないし、どうやらまだ対応していない様子。
Universal Endpoint
一番興味があったのがこれ
ざっとドキュメント見た感じ、
- 複数のプロバイダーを一つのエンドポイントで集約する
- プロバイダーごとにスキーマを設定
- Act/Standby的に、失敗したら別のプロバイダーを呼び出す
ように読めるけれども、Round Robinができたらいいなー、という思い
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というのがある。
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
なるほど。上には書いてないけど、もう一度リクエストするとそれぞれ高速にレスポンスが返ってきた=キャッシュレスポンスだったので、リクエストボディ単位でキャッシュは管理されているで良さそう。
ただしあまりキャッシュを細かく管理するようなインタフェースはない(世の中一般的にキャッシュ管理するようなものでそういうインタフェースがあるのか知らない)
とりあえず自分的には
- Azureまだサポートされていない(すぐにサポートされそう)
- Universal Endpointは耐障害性にはよさそうだけど負荷分散にはならなさそう
- キャッシュは(多分)リクエストボディを見てる。OpenAI Chat Completion使うならリクエストボディでuser指定すればユーザーごとにキャッシュもたせられる。
- キャッシュを管理できるインタフェースはない
- できればPythonで書きたい
この辺が改善されたらという感じだけど、めちゃめちゃ簡単に使えるのは良き