Skip to content

ClasCat® AI Research

クラスキャット – 生成 AI, AI エージェント, MCP

Menu
  • ホーム
    • ClassCat® AI Research ホーム
    • クラスキャット・ホーム
  • OpenAI API
    • OpenAI Python ライブラリ 1.x : 概要
    • OpenAI ブログ
      • GPT の紹介
      • GPT ストアの紹介
      • ChatGPT Team の紹介
    • OpenAI platform 1.x
      • Get Started : イントロダクション
      • Get Started : クイックスタート (Python)
      • Get Started : クイックスタート (Node.js)
      • Get Started : モデル
      • 機能 : 埋め込み
      • 機能 : 埋め込み (ユースケース)
      • ChatGPT : アクション – イントロダクション
      • ChatGPT : アクション – Getting started
      • ChatGPT : アクション – アクション認証
    • OpenAI ヘルプ : ChatGPT
      • ChatGPTとは何ですか?
      • ChatGPT は真実を語っていますか?
      • GPT の作成
      • GPT FAQ
      • GPT vs アシスタント
      • GPT ビルダー
    • OpenAI ヘルプ : ChatGPT > メモリ
      • FAQ
    • OpenAI ヘルプ : GPT ストア
      • 貴方の GPT をフィーチャーする
    • OpenAI Python ライブラリ 0.27 : 概要
    • OpenAI platform
      • Get Started : イントロダクション
      • Get Started : クイックスタート
      • Get Started : モデル
      • ガイド : GPT モデル
      • ガイド : 画像生成 (DALL·E)
      • ガイド : GPT-3.5 Turbo 対応 微調整
      • ガイド : 微調整 1.イントロダクション
      • ガイド : 微調整 2. データセットの準備 / ケーススタディ
      • ガイド : 埋め込み
      • ガイド : 音声テキスト変換
      • ガイド : モデレーション
      • ChatGPT プラグイン : イントロダクション
    • OpenAI Cookbook
      • 概要
      • API 使用方法 : レート制限の操作
      • API 使用方法 : tiktoken でトークンを数える方法
      • GPT : ChatGPT モデルへの入力をフォーマットする方法
      • GPT : 補完をストリームする方法
      • GPT : 大規模言語モデルを扱う方法
      • 埋め込み : 埋め込みの取得
      • GPT-3 の微調整 : 分類サンプルの微調整
      • DALL-E : DALL·E で 画像を生成して編集する方法
      • DALL·E と Segment Anything で動的マスクを作成する方法
      • Whisper プロンプティング・ガイド
  • Gemini API
    • Tutorials : クイックスタート with Python (1) テキスト-to-テキスト生成
    • (2) マルチモーダル入力 / 日本語チャット
    • (3) 埋め込みの使用
    • (4) 高度なユースケース
    • クイックスタート with Node.js
    • クイックスタート with Dart or Flutter (1) 日本語動作確認
    • Gemma
      • 概要 (README)
      • Tutorials : サンプリング
      • Tutorials : KerasNLP による Getting Started
  • Keras 3
    • 新しいマルチバックエンド Keras
    • Keras 3 について
    • Getting Started : エンジニアのための Keras 入門
    • Google Colab 上のインストールと Stable Diffusion デモ
    • コンピュータビジョン – ゼロからの画像分類
    • コンピュータビジョン – 単純な MNIST convnet
    • コンピュータビジョン – EfficientNet を使用した微調整による画像分類
    • コンピュータビジョン – Vision Transformer による画像分類
    • コンピュータビジョン – 最新の MLPモデルによる画像分類
    • コンピュータビジョン – コンパクトな畳込み Transformer
    • Keras Core
      • Keras Core 0.1
        • 新しいマルチバックエンド Keras (README)
        • Keras for TensorFlow, JAX, & PyTorch
        • 開発者ガイド : Getting started with Keras Core
        • 開発者ガイド : 関数型 API
        • 開発者ガイド : シーケンシャル・モデル
        • 開発者ガイド : サブクラス化で新しい層とモデルを作成する
        • 開発者ガイド : 独自のコールバックを書く
      • Keras Core 0.1.1 & 0.1.2 : リリースノート
      • 開発者ガイド
      • Code examples
      • Keras Stable Diffusion
        • 概要
        • 基本的な使い方 (テキスト-to-画像 / 画像-to-画像変換)
        • 混合精度のパフォーマンス
        • インペインティングの簡易アプリケーション
        • (参考) KerasCV – Stable Diffusion を使用した高性能画像生成
  • TensorFlow
    • TF 2 : 初級チュートリアル
    • TF 2 : 上級チュートリアル
    • TF 2 : ガイド
    • TF 1 : チュートリアル
    • TF 1 : ガイド
  • その他
    • 🦜️🔗 LangChain ドキュメント / ユースケース
    • Stable Diffusion WebUI
      • Google Colab で Stable Diffusion WebUI 入門
      • HuggingFace モデル / VAE の導入
      • LoRA の利用
    • Diffusion Models / 拡散モデル
  • クラスキャット
    • 会社案内
    • お問合せ
    • Facebook
    • ClassCat® Blog
Menu

OpenAI Cookbook : API 使用方法 : レート制限の操作

Posted on 08/09/2023 by Sales Information

OpenAI Cookbook examples : API 使用方法 : レート制限の操作 (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 08/09/2023

* 本ページは、OpenAI Cookbook レポジトリの以下のドキュメントを翻訳した上で適宜、補足説明したものです:

  • examples : How to handle rate limits

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

クラスキャット 人工知能 研究開発支援サービス

◆ クラスキャット は人工知能・テレワークに関する各種サービスを提供しています。お気軽にご相談ください :

  • 人工知能研究開発支援
    1. 人工知能研修サービス(経営者層向けオンサイト研修)
    2. テクニカルコンサルティングサービス
    3. 実証実験(プロトタイプ構築)
    4. アプリケーションへの実装

  • 人工知能研修サービス

  • PoC(概念実証)を失敗させないための支援
◆ 人工知能とビジネスをテーマに WEB セミナーを定期的に開催しています。スケジュール。
  • お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。

◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。

  • 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
  • sales-info@classcat.com  ;  Web: www.classcat.com  ;   ClassCatJP

 

OpenAI Cookbook : API 使用方法 : レート制限の操作

OpenAI API を繰り返し呼び出すとき、”429: ‘Too Many Requests'” または “RateLimitError” というエラーメッセージに遭遇するかもしれません。これらのエラーメッセージは API のレート制限を超えたことに由来します。

このガイドはレート制限エラーを回避して処理するためのヒントを共有します。

レート制限エラーを回避するために並列リクエストをスロットルで調整するサンプルスクリプトを見るには、api_request_parallel_processor.py をご覧ください。

 

何故レート制限があるのでしょう?

レート制限は API のための一般的なプラクティスで、それらは幾つかの異なる理由で導入されています。

  • まず、それらは API の悪用や誤用に対して保護するのに役立ちます。例えば、悪意あるアクターは、API をオーバロードさせたりサービスの崩壊を引き起こそうとしてリクエストにより API を送り続けることができるでしょう。レート制限を設定することで、OpenAI はこの種類のアクティビティを防ぐことができます。

  • 2 番目に、レート制限は誰もが API への公平なアクセスを持つことを保証することに役立ちます。一人の人や一つの組織が過剰なリクエストを行なう場合、それは他の人すべてに対して API をダウンさせてしまう可能性があります。単一ユーザが行なうことができるリクエスト数をスロットルで調整することにより、OpenAI はすべての人がスローダウンを経験することなく API を使用する機会を持つことを保証します。

  • 最後に、レート制限は OpenAI がインフラへの合計ロードを管理することを支援できます。API へのリクエストが劇的に増加する場合、サーバに重い負荷をかけて、パフォーマンス問題を引き起こす可能性があります。レート制限を設定することにより、OpenAI はすべてのユーザへのスムースで一貫したエクスペリエンスを維持することを支援できます。

レート制限に到達することはフラストレーションになる可能性はありますが、レート制限はユーザに対する API の信頼性の高い操作を保護するために存在します。

 

デフォルトのレート制限

2023年1月現在、デフォルトのレート制限は :

参考まで、1,000 トークンはおよそ 1 ページのテキストです。

 

他のレート制限リソース

OpenAI のレート制限についてこれらの他のリソースで更に読んでください :

  • ガイド: レート制限
  • ヘルプセンター: Is API usage subject to any rate limits?
  • ヘルプセンター: How can I solve 429: ‘Too Many Requests’ errors?

 

レート制限の増加のリクエスト

貴方の組織のレート制限を増やしたい場合には、次のフォームに記入してください :

  • OpenAI レート制限 Increase リクエストフォーム

 

レート制限エラーの例

API リクエストが素早く送られすぎるとレート制限エラーが発生します。OpenAI Python ライブラリを使用する場合、それらは以下のようなものです :

RateLimitError: Rate limit reached for default-codex in organization org-{id} on requests per min. Limit: 20.000000 / min. Current: 24.000000 / min. Contact support@openai.com if you continue to have issues or if you’d like to request an increase.

以下はレート制限エラーをトリガーするサンプルコードです。

import openai  # for making OpenAI API requests

# request a bunch of completions in a loop
for _ in range(100):
    openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=[{"role": "user", "content": "Hello"}],
        max_tokens=10,
    )

 

レート制限エラーを回避する方法

指数バックオフで再試行する

レート制限エラーを回避する一つの簡単な方法は、ランダムな指数 (関数的) バックオフを使用してリクエストを自動的に再試行することです。指数バックオフによる再試行は、レート制限エラーに遭遇したとき短いスリープを実行してから、失敗に終わったリクエストを再試行することを意味します。リクエストが依然として失敗する場合は、スリープする長さが増やされてこのプロセスが繰り返されます。これはリクエストが成功するか、再試行の最大数に到達するまで続きます。

このアプローチは多くの利点があります :

  • 自動再試行は、データを破壊したり欠落することなくレート制限エラーからリカバーできることを意味します。

  • 指数バックオフは、最初の再試行を素早く試すことができる一方で、最初の幾つかの再試行が失敗した場合でも依然としてより長い遅延からでも恩恵を受けることを意味します。

  • 遅延へのランダムな jitter の追加はすべてが同時にヒットすることから再試行を支援します。

失敗したリクエストは毎分あたりの制限に関与しますので、連続したリクエストの再送は動作しないことに注意してください。

以下は幾つかのサンプルソリューションです。

 
Example #1: Tenacity ライブラリの使用

Tenacity は、Python で書かれた、Apache 2.0 ライセンスの汎用目的の再試行ライブラリで、殆ど何にでも動作の再試行を追加するタスクを単純化します。

指数バックオフをリクエストに追加するため、tenacity.retry デコレータ を使用できます。以下のサンプルは、ランダムな指数バックオフをリクエストに追加するために tenacity.wait_random_exponential 関数を使用しています。

Tenacity ライブラリはサードパーティのツールであり、OpenAI はその信頼性やセキュリティについて保証しないことに注意してください。

import openai  # for OpenAI API calls
from tenacity import (
    retry,
    stop_after_attempt,
    wait_random_exponential,
)  # for exponential backoff


@retry(wait=wait_random_exponential(min=1, max=60), stop=stop_after_attempt(6))
def completion_with_backoff(**kwargs):
    return openai.Completion.create(**kwargs)


completion_with_backoff(model="text-davinci-002", prompt="Once upon a time,")
<OpenAIObject text_completion id=cmpl-5oowO391reUW8RGVfFyzBM1uBs4A5 at 0x10d8cae00> JSON: {
  "choices": [
    {
      "finish_reason": "length",
      "index": 0,
      "logprobs": null,
      "text": " a little girl dreamed of becoming a model.\n\nNowadays, that dream"
    }
  ],
  "created": 1662793900,
  "id": "cmpl-5oowO391reUW8RGVfFyzBM1uBs4A5",
  "model": "text-davinci-002",
  "object": "text_completion",
  "usage": {
    "completion_tokens": 16,
    "prompt_tokens": 5,
    "total_tokens": 21
  }
}

 
Example #2: バックオフ・ライブラリの使用

バックオフと再試行のための関数デコレータを提供するもう一つのライブラリは backoff です。

Tenacity のように、backoff ライブラリはサードパーティのツールで、OpenAI はその信頼性やセキュリティについて保証しません。

import backoff  # for exponential backoff
import openai  # for OpenAI API calls


@backoff.on_exception(backoff.expo, openai.error.RateLimitError)
def completions_with_backoff(**kwargs):
    return openai.Completion.create(**kwargs)


completions_with_backoff(model="text-davinci-002", prompt="Once upon a time,")
<OpenAIObject text_completion id=cmpl-5oowPhIdUvshEsF1rBhhwE9KFfI3M at 0x111043680> JSON: {
  "choices": [
    {
      "finish_reason": "length",
      "index": 0,
      "logprobs": null,
      "text": " two children lived in a poor country village. In the winter, the temperature would"
    }
  ],
  "created": 1662793901,
  "id": "cmpl-5oowPhIdUvshEsF1rBhhwE9KFfI3M",
  "model": "text-davinci-002",
  "object": "text_completion",
  "usage": {
    "completion_tokens": 16,
    "prompt_tokens": 5,
    "total_tokens": 21
  }
}

 
Example 3: 手動のバックオフ実装

サードパーティのライブラリを使用したくないのであれば、独自のバックオフロジックを実装することができます。

# imports
import random
import time

import openai

# define a retry decorator
def retry_with_exponential_backoff(
    func,
    initial_delay: float = 1,
    exponential_base: float = 2,
    jitter: bool = True,
    max_retries: int = 10,
    errors: tuple = (openai.error.RateLimitError,),
):
    """Retry a function with exponential backoff."""

    def wrapper(*args, **kwargs):
        # Initialize variables
        num_retries = 0
        delay = initial_delay

        # Loop until a successful response or max_retries is hit or an exception is raised
        while True:
            try:
                return func(*args, **kwargs)

            # Retry on specified errors
            except errors as e:
                # Increment retries
                num_retries += 1

                # Check if max retries has been reached
                if num_retries > max_retries:
                    raise Exception(
                        f"Maximum number of retries ({max_retries}) exceeded."
                    )

                # Increment the delay
                delay *= exponential_base * (1 + jitter * random.random())

                # Sleep for the delay
                time.sleep(delay)

            # Raise exceptions for any errors not specified
            except Exception as e:
                raise e

    return wrapper


@retry_with_exponential_backoff
def completions_with_backoff(**kwargs):
    return openai.Completion.create(**kwargs)


completions_with_backoff(model="text-davinci-002", prompt="Once upon a time,")
<OpenAIObject text_completion id=cmpl-5oowRsCXv3AkUgVJyyo3TQrVq7hIT at 0x111024220> JSON: {
  "choices": [
    {
      "finish_reason": "length",
      "index": 0,
      "logprobs": null,
      "text": " a man decided to greatly improve his karma by turning his life around.\n\n"
    }
  ],
  "created": 1662793903,
  "id": "cmpl-5oowRsCXv3AkUgVJyyo3TQrVq7hIT",
  "model": "text-davinci-002",
  "object": "text_completion",
  "usage": {
    "completion_tokens": 16,
    "prompt_tokens": 5,
    "total_tokens": 21
  }
}

 

レート制限を前提にバッチ処理のスループットを最大化する方法

ユーザからのリアルタイムのリクエストを処理している場合、バックオフと再試行はレート制限エラーを回避しながら遅延を最小化する素晴らしいストラテジーです。

けれども、遅延よりもスループットが重要であるような巨大ボリュームのバッチデータを処理している場合は、バックオフと再試行に加えて貴方ができる幾つかの他のことがあります。

 

積極的に (先を見越して) リクエスト間の遅延を追加する

繰り返しレート制限に到達し、バックオフし、再度レート制限に達し、そして再度バックオフするような場合、リクエストのバジェットのかなりの部分は再試行される必要があるリクエストで「浪費」される可能性があります。固定レート制限の前提では、これは処理スループットを制限します。

ここで、一つの可能性あるソリューションは、レート制限を計算してその逆数に等しい遅延を追加することです (例えば、レート制限が毎分 20 リクエストである場合、各リクエストに 3-6秒の遅延を追加します)。これは、レート制限に達して無駄なリクエストを発生させることなく、レート制限の上限の近くで操作するのに役立ちます。

リクエストに遅延を追加するサンプル

# imports
import time
import openai

# Define a function that adds a delay to a Completion API call
def delayed_completion(delay_in_seconds: float = 1, **kwargs):
    """Delay a completion by a specified amount of time."""

    # Sleep for the delay
    time.sleep(delay_in_seconds)

    # Call the Completion API and return the result
    return openai.Completion.create(**kwargs)


# Calculate the delay based on your rate limit
rate_limit_per_minute = 20
delay = 60.0 / rate_limit_per_minute

delayed_completion(
    delay_in_seconds=delay,
    model="text-davinci-002",
    prompt="Once upon a time,"
)
<OpenAIObject text_completion id=cmpl-5oowVVZnAzdCPtUJ0rifeamtLcZRp at 0x11b2c7680> JSON: {
  "choices": [
    {
      "finish_reason": "length",
      "index": 0,
      "logprobs": null,
      "text": " there was an idyllic little farm that sat by a babbling brook"
    }
  ],
  "created": 1662793907,
  "id": "cmpl-5oowVVZnAzdCPtUJ0rifeamtLcZRp",
  "model": "text-davinci-002",
  "object": "text_completion",
  "usage": {
    "completion_tokens": 16,
    "prompt_tokens": 5,
    "total_tokens": 21
  }
}

 

リクエストのバッチ処理

OpenAI API は毎分のリクエストと毎分のトークンに対して個別の制限があります。

毎分のリクエストの制限に達していて毎分のトークンには余裕がある場合、複数のタスクを各リクエストにバッチ化することでスループットを増大させることができます。これは、特に小さいモデルで、毎分により多くのトークンを処理することを可能にします。

プロンプトのバッチの送信は通常の API 呼び出しと正確に同じに動作します、単一文字列の代わりに文字列のリストを prompt パラメータに渡すことを除いて。

Warning: response オブジェクトはプロンプトの順序で補完を返さない場合がありますので、index フィールドを使用してレスポンスをプロンプトと一致させることを常に忘れないでください。 

 
バッチ処理なしのサンプル

import openai  # for making OpenAI API requests


num_stories = 10
prompt = "Once upon a time,"

# serial example, with one story completion per request
for _ in range(num_stories):
    response = openai.Completion.create(
        model="curie",
        prompt=prompt,
        max_tokens=20,
    )

    # print story
    print(prompt + response.choices[0].text)
Once upon a time, before there were grandiloquent tales of the massacre at Fort Mims, there were stories of
Once upon a time, a full-sized search and rescue was created. However, CIDIs are the addition of requiring
Once upon a time, Schubert was hot with the films. “Schubert sings of honey, flowers,
Once upon a time, you could watch these films on your VCR, sometimes years after their initial theatrical release, and there
Once upon a time, there was a forest. In that forest, the forest animals ruled. The forest animals had their homes
Once upon a time, there were two programs that complained about false positive scans. Peacock and Midnight Manager alike, only
Once upon a time, a long, long time ago, tragedy struck. it was the darkest of nights, and there was
Once upon a time, when Adam was a perfect little gentleman, he was presented at Court as a guarantee of good character.
Once upon a time, Adam and Eve made a mistake. They ate the fruit from the tree of immortality and split the consequences
Once upon a time, there was a set of programming fundamental principles known as the "X model." This is a set of

 
バッチ処理によるサンプル

import openai  # for making OpenAI API requests


num_stories = 10
prompts = ["Once upon a time,"] * num_stories

# batched example, with 10 stories completions per request
response = openai.Completion.create(
    model="curie",
    prompt=prompts,
    max_tokens=20,
)

# match completions to prompts by index
stories = [""] * len(prompts)
for choice in response.choices:
    stories[choice.index] = prompts[choice.index] + choice.text

# print stories
for story in stories:
    print(story)
Once upon a time, there were two sisters, Eliza Pickering and Ariana 'Ari' Lucas. When these lovely
Once upon a time, Keene was stung by a worm — actually, probably a python — snaking through his leg
Once upon a time, there was a professor of physics during the depression. It was difficult, during this time, to get
Once upon a time, before you got sick, you told stories to all and sundry, and your listeners believed in you
Once upon a time, there was one very old nice donkey. He was incredibly smart, in a very old, kind of
Once upon a time, the property of a common lodging house was a common cup for all the inhabitants. Betimes a constant
Once upon a time, in an unspecified country, there was a witch who had an illegal product. It was highly effective,
Once upon a time, a long time ago, I turned 13, my beautiful dog Duncan swept me up into his jaws like
Once upon a time, as a thoroughly reformed creature from an army of Nazis, he took On Judgement Day myself and his
Once upon a time, Capcom made a game for the Atari VCS called Missile Command. While it was innovative at the time

 

以上



クラスキャット

最近の投稿

  • LangGraph on Colab : マルチエージェント・スーパーバイザー
  • LangGraph on Colab : エージェント型 RAG
  • LangGraph : 例題 : エージェント型 RAG
  • LangGraph Platform : Get started : クイックスタート
  • LangGraph Platform : 概要

タグ

AutoGen (13) ClassCat Press Release (20) ClassCat TF/ONNX Hub (11) DGL 0.5 (14) Eager Execution (7) Edward (17) FLUX.1 (16) Gemini (20) HuggingFace Transformers 4.5 (10) HuggingFace Transformers 4.6 (7) HuggingFace Transformers 4.29 (9) Keras 2 Examples (98) Keras 2 Guide (16) Keras 3 (10) Keras Release Note (17) Kubeflow 1.0 (10) LangChain (45) LangGraph (23) MediaPipe 0.8 (11) Model Context Protocol (16) NNI 1.5 (16) OpenAI Agents SDK (8) OpenAI Cookbook (13) OpenAI platform (10) OpenAI platform 1.x (10) OpenAI ヘルプ (8) TensorFlow 2.0 Advanced Tutorials (33) TensorFlow 2.0 Advanced Tutorials (Alpha) (15) TensorFlow 2.0 Advanced Tutorials (Beta) (16) TensorFlow 2.0 Guide (10) TensorFlow 2.0 Guide (Alpha) (16) TensorFlow 2.0 Guide (Beta) (9) TensorFlow 2.0 Release Note (12) TensorFlow 2.0 Tutorials (20) TensorFlow 2.0 Tutorials (Alpha) (14) TensorFlow 2.0 Tutorials (Beta) (12) TensorFlow 2.4 Guide (24) TensorFlow Deploy (8) TensorFlow Get Started (7) TensorFlow Graphics (7) TensorFlow Probability (9) TensorFlow Programmer's Guide (22) TensorFlow Release Note (18) TensorFlow Tutorials (33) TF-Agents 0.4 (11)
2023年8月
月 火 水 木 金 土 日
 123456
78910111213
14151617181920
21222324252627
28293031  
« 7月   9月 »
© 2025 ClasCat® AI Research | Powered by Minimalist Blog WordPress Theme