こんにちは!データサイエンティストの青木和也(https://twitter.com/kaizen_oni)です!
この記事では、openai.error import OpenAIErrorを実行した時にModuleNotFoundErrorが出てしまった時の対処法をご紹介いたします!
大規模言語モデル入門を読み進めている方は、普通に進めてしまうと引っかかってしまうエラーなので、ぜひ本記事を参考にエラーを解消していただけると幸いです!
エラーの内容
本エラーはopenai.error import OpenAIErrorを実行するとModuleNotFoundErrorとして、「openai.errorなんてモジュール見つかりません」というエラーが出てしまうというものです。
このエラーが出てしまう元となったコードは「大規模言語モデル入門」という書籍の第9章質問応答のP263に登場する以下のコードです。
import asyncio
from typing import Awaitable, Callable, TypeVar
from openai.error import OpenAIError
T = TypeVar('T')
async def retry_on_error(
openai_call: Callable[[], Awaitable[T]],
max_num_trials: int = 5,
first_wait_time: int = 10
) -> Awaitable[T]:
for i in range(max_num_trials):
try:
return await openai_call()
except OpenAIError as e:
if i == max_num_trials - 1:
raise
print(f'エラーを受け取りました:{e}')
wait_time_seconds = first_wait_time * (2**i)
print(f"{wait_time_seconds}")
await asyncio.sleep(wait_time_seconds)
解決策
上記エラーはopenaiライブラリの仕様変更に伴うものです。
元々openai.errorのOpenAIErrorというクラスを使用しようとしていた動機は、非同期処理を行う際にRateLimitErrorのような待機時間が必要なエラーが発生した時のハンドリングなので、以下openaiライブラリのエラーハンドリングのクラスから直接RateLimitErrorのクラスを引っ張ってくることにより解決することができます。
import asyncio
from typing import Awaitable, Callable, TypeVar
from openai import RateLimitError
T = TypeVar('T')
async def retry_on_error(
openai_call: Callable[[], Awaitable[T]],
max_num_trials: int = 5,
first_wait_time: int = 10
) -> Awaitable[T]:
for i in range(max_num_trials):
try:
return await openai_call()
except RateLimitError as e:
if i == max_num_trials - 1:
raise
print(f'エラーを受け取りました:{e}')
wait_time_seconds = first_wait_time * (2**i)
print(f"{wait_time_seconds}")
await asyncio.sleep(wait_time_seconds)
まとめ
今回の記事では、openai.error import OpenAIErrorを実行した時にModuleNotFoundErrorが出てしまった時の対処法を紹介しました。
本エラーは大規模言語モデル入門を進めていると直面してしまうエラーですが、openaiライブラリの仕様変更に伴うエラーなので、インポートするクラスを変更するだけの軽微な修正で解決することができます。
同様のエラーが発生した場合には本記事を参考に修正いただけると幸いです!
コメント