OpenAI Python 1.x : 概要 (翻訳/解説)
翻訳 : クラスキャット セールスインフォメーション
作成日時 : 11/11/2023 (v1.2.3)
* 本ページは、OpenAI Python Library レポジトリの以下のドキュメントを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
- 人工知能研究開発支援
- 人工知能研修サービス(経営者層向けオンサイト研修)
- テクニカルコンサルティングサービス
- 実証実験(プロトタイプ構築)
- アプリケーションへの実装
- 人工知能研修サービス
- PoC(概念実証)を失敗させないための支援
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
- クラスキャット セールス・マーケティング本部 セールス・インフォメーション
- sales-info@classcat.com ; Website: www.classcat.com ; ClassCatJP
OpenAI Python ライブラリ 1.x : 概要
OpenAI Python ライブラリは Python 3.7+ アプリケーションから OpenAI REST API への便利なアクセスを提供します。このライブラリはすべてのリクエスト・パラメータとレスポンス・フィールドの型定義を含み、httpx により支援された同期と非同期の両方のクライアントを提供します。
それは Stainless を使用した OpenAPI 仕様 から生成されます。
ドキュメント
API ドキュメントは ここ にあります。
インストール
重要 : SDK は 2023年11月6日 にリリースされた v1 で書き直されました。v1 移行ガイド をご覧ください、これは貴方のコードを自動的に更新するスクリプトを含みます。
pip install openai
使用方法
このライブラリの完全な API は api.md にあります。
from openai import OpenAI
client = OpenAI(
# defaults to os.environ.get("OPENAI_API_KEY")
api_key="My API Key",
)
chat_completion = client.chat.completions.create(
messages=[
{
"role": "user",
"content": "Say this is a test",
}
],
model="gpt-3.5-turbo",
)
api_key キーワード引数を提供できますが、貴方の API キーがソース管理にストアされないように、
python-dotenv を使用して OPENAI_API_KEY=”My API Key” を .env ファイルに追加することを勧めます。
非同期 (Async) の使用方法
単純に OpenAI の代わりに AsyncOpenAI をインポートして各 API 呼び出しで await を使用します :
import asyncio
from openai import AsyncOpenAI
client = AsyncOpenAI(
# defaults to os.environ.get("OPENAI_API_KEY")
api_key="My API Key",
)
async def main() -> None:
chat_completion = await client.chat.completions.create(
messages=[
{
"role": "user",
"content": "Say this is a test",
}
],
model="gpt-3.5-turbo",
)
asyncio.run(main())
それ以外は同期と非同期クライアント間の機能は同一です。
ストリーミング・レスポンス
サーバ・サイド・イベント (SSE) を使用してストリーミング・レスポンスのサポートを提供します。
from openai import OpenAI
client = OpenAI()
stream = client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": "Say this is a test"}],
stream=True,
)
for part in stream:
print(part.choices[0].delta.content or "")
非同期クライアントは正確に同じインターフェイスを使用します。
from openai import AsyncOpenAI
client = AsyncOpenAI()
stream = await client.chat.completions.create(
prompt="Say this is a test",
messages=[{"role": "user", "content": "Say this is a test"}],
stream=True,
)
async for part in stream:
print(part.choices[0].delta.content or "")
モジュールレベルのクライアント
重要 : グローバルなクライアントに依存する代わりに、クライアントインスタンスをインスタンス化することを強く勧めます。
また、v1 以前のバージョンに類似した流儀でアクセス可能なグローバルなクライアントインスタンスも公開しています。
import openai
# optional; defaults to `os.environ['OPENAI_API_KEY']`
openai.api_key = '...'
# all client options can be configured just like the `OpenAI` instantiation counterpart
openai.base_url = "https://..."
openai.default_headers = {"x-foo": "true"}
completion = openai.chat.completions.create(
model="gpt-4",
messages=[
{
"role": "user",
"content": "How do I output all files in a directory using Python?",
},
],
)
print(completion.choices[0].message.content)
この API は標準クライアントインスタンスベースの API と正確に同じです。
これはアプリケーションのコードでは なく、高速な反復のために REPL やノートブック内で使用されることを目的としています。
以下の理由で、クライアントを常にインスタンス化する (e.g., with client = OpenAI()) ことを勧めます :
- どこでクライアントのオプションが設定されているかを推論するのが難しい可能性があります。
- 特定のクライアントオプションを潜在的に競合状態を引き起こすことなく変更するのは不可能です。
- テスト目的で失敗させる (mock) ことが難しくなります。
- ネットワーク接続のクリーンアップを制御することは不可能です。
型の使用
ネストされたリクエスト・パラメータは TypedDicts です。レスポンスは Pydantic モデル で、これは JSON (v1, v2) にシリアライズし戻すようなことのためのヘルパーメソッドを提供します。辞書を取得するには、model.model_dump() を呼び出します。
型付きリクエストとレスポンスはエディター内で自動補完とドキュメントを提供します。バグを早期に捕捉するのに役立つように VS Code で型エラーを見たいならば、python.analysis.typeCheckingMode を basic に設定します。
ページネーション (Pagination)
OpenAI API の List メソッドはページ分割されます (paginated)。
このライブラリは各リストレスポンスを含む自動ページ分割イテレータを提供しますので、後続のページを手動でリクエストする必要はありません :
import openai
client = OpenAI()
all_jobs = []
# Automatically fetches more pages as needed.
for job in client.fine_tuning.jobs.list(
limit=20,
):
# Do something with job here
all_jobs.append(job)
print(all_jobs)
Or, asynchronously:
import asyncio
import openai
client = AsyncOpenAI()
async def main() -> None:
all_jobs = []
# Iterate through items across all pages, issuing requests as needed.
async for job in client.fine_tuning.jobs.list(
limit=20,
):
all_jobs.append(job)
print(all_jobs)
asyncio.run(main())
代わりに、ページ操作のよりきめ細かい制御をする .has_next_page(), .next_page_info(), or .get_next_page() メソッドを使用することができます :
first_page = await client.fine_tuning.jobs.list(
limit=20,
)
if first_page.has_next_page():
print(f"will fetch next page using these details: {first_page.next_page_info()}")
next_page = await first_page.get_next_page()
print(f"number of items we just fetched: {len(next_page.data)}")
# Remove `await` for non-async usage.
Or just work directly with the returned data:
first_page = await client.fine_tuning.jobs.list(
limit=20,
)
print(f"next page cursor: {first_page.after}") # => "next page cursor: ..."
for job in first_page.data:
print(job.id)
# Remove `await` for non-async usage.
ネストされたパラメータ
ネストされたパラメータは TypedDict を使用した型付きの辞書で、例えば :
from openai import OpenAI
client = OpenAI()
completion = client.chat.completions.create(
messages=[
{
"role": "user",
"content": "Can you generate an example json object describing a fruit?",
}
],
model="gpt-3.5-turbo",
response_format={"type": "json_object"},
)
ファイルのアップロード
ファイルのアップロードに対応するリクエストパラメータはバイト、PathLike インスタンスまたは (filename, contents, media type) のタプルとして渡すことができます。
from pathlib import Path
from openai import OpenAI
client = OpenAI()
client.files.create(
file=Path("input.jsonl"),
purpose="fine-tune",
)
非同期クライアントはまったく同じインターフェイスを使用します。PathLike インスタンスを渡す場合、ファイルのコンテンツは自動的に非同期に読まれます。
エラー処理
ライブラリは (例えば、ネットワーク接続の問題やタイムアウトにより) API に接続できないとき、openai.APIConnectionError のサブクラスが上げられます。
API が non-success (非成功) ステータスコード (つまり、4xx or 5xx レスポンス) を返すとき、status_code とレスポンス・プロパティを含む openai.APIStatusError のサブクラスが上げられます。
すべてのエラーは openai.APIError から継承されます。
import openai
from openai import OpenAI
client = OpenAI()
try:
client.fine_tunes.create(
training_file="file-XGinujblHPwGLSztz8cPS8XY",
)
except openai.APIConnectionError as e:
print("The server could not be reached")
print(e.__cause__) # an underlying Exception, likely raised within httpx.
except openai.RateLimitError as e:
print("A 429 status code was received; we should back off a bit.")
except openai.APIStatusError as e:
print("Another non-200-range status code was received")
print(e.status_code)
print(e.response)
エラーコードは以下のようなものです :
リトライ
特定のエラーはデフォルトで自動的に短いエクスポネンシャル (指数関数的) バックオフで 2 回リトライされます。
(例えば、ネットワーク接続性の問題による) 接続エラー 、408 リクエストタイムアウト、409 Conflict (競合), 429 レート制限、そして >=500 内部エラーはすべてデフォルトでリトライされます。
max_retries オプションを使用してリトライの設定を構成したり無効にすることができます :
from openai import OpenAI
# Configure the default for all requests:
client = OpenAI(
# default is 2
max_retries=0,
)
# Or, configure per-request:
client.with_options(max_retries=5).chat.completions.create(
messages=[
{
"role": "user",
"content": "How can I get the name of the current day in Node.js?",
}
],
model="gpt-3.5-turbo",
)
タイムアウト
デフォルトではリクエストは 10 分後にタイムアウトします。float または httpx.Timeout オブジェクトを受け取る timeout オプションでこれを設定できます :
from openai import OpenAI
# Configure the default for all requests:
client = OpenAI(
# default is 60s
timeout=20.0,
)
# More granular control:
client = OpenAI(
timeout=httpx.Timeout(60.0, read=5.0, write=10.0, connect=2.0),
)
# Override per-request:
client.with_options(timeout=5 * 1000).chat.completions.create(
messages=[
{
"role": "user",
"content": "How can I list all files in a directory using Python?",
}
],
model="gpt-3.5-turbo",
)
タイムアウト時、APITimeoutError が投げられます。
タイムアウトしたリクエストは デフォルトで 2 回リトライ されることに注意してください。
以上