openai.nibo.sh
OpenAIのAPIをいい感じにCDNキャッシュするproxy いい感じとは
embeddingするinputをバッチで(配列で)与えた際に、それぞれのembeddings vectorをキャッシュします
2回目以降はキャッシュされていないinputだけをOpenAI APIに投げることで、トークン数削減と高速化を実現します
今のところ、/v1/embeddingsにのみ対応しています
modelはtext-embedding-ada-002にだけ対応しています(他のモデルで動かすことないよね?)
https://gyazo.com/06752638701893d4b28a53d4f27f90ee
使い方
code: curl.sh
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"input": "Your text string goes here",
"model": "text-embedding-ada-002"
}'
ドメインをopenai.nibo.shに変更するだけで使えます
code: curl.sh
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"input": "Your text string goes here",
"model": "text-embedding-ada-002"
}'
メリット
一度embedした文字はキャッシュされるので、消費するtoken数が減ります
以下の理由により、レスポンスが早くなります
キャッシュをエッジから返す
必要な文字だけをembedするので、OpenAIのembeddings APIのレスポンスが早くなる
使用上の注意
利用すると、niboshi.iconが管理するCloudflare WorkerにOPENAI_API_KEYが送信されます
もちろん閲覧や保存はしませんが、第三者がその気になればAPIを取得できる環境である前提で利用してください
inputは平文がキャッシュされることがあります
メンテナンスのためにうっかり見てしまうかもしれないので、見られて困るinputは送らないでください
ヘッダ
OpenAI APIのヘッダ
すべてのinputがキャッシュ済みである場合、OpenAI APIにはリクエストが送信されないので、これらのヘッダも付与されません
(proxyの動作環境である)Cloudflareのヘッダ
proxy-cache-hit-num: キャッシュから返されたembeddings vectorの数
例えばinputを5つ与えた時のレスポンスヘッダがproxy-cache-hit-num: 3の場合、3つのinputはキャッシュから返され、2つのinputがOpenAI APIへPOSTされたことを表します
トークン数
OpenAI APIのembeddings APIは、レスポンスボディに消費したトークン数が含まれています
code: res.json
{
...
"usage": {
"prompt_tokens": 5,
"total_tokens": 5,
}
}
inputのいくつかがキャッシュされた場合、usageには実際にOpenAI APIへ送信された分だけのトークン数が含まれます
ベンチマーク
code: bechmark1.json
{
"template": "ダミーテキスト_79564867",
"inputsNum": 1, // input数1
"tryNum": 5, // 5回実行して平均を取る
"avgs": {
"noProxy": 393.2268000125885, // OpenAIのAPIを直接叩いた場合(input数1/単位はms。以下も同様)
"noCache": 251.60879158973694, // proxy経由(input数1/キャッシュなし)
"allCached": 33.09122500419617, // proxy経由(input数1/キャッシュあり)
"oneNoCache": 204.15476660728456 // proxy経由(input数2/1つはキャッシュあり)
}
}
なぜかnoCacheの場合でもnoProxyより早くなってますが、流石にそうはならないはずなので誤差の範疇だと思います
実装
TODO
1KBを超えるinputが正しくキャッシュされません