OpenAIライブラリを1.8.0に更新したらコードが動かなくなった話

技術トライ系

OpenAIライブラリのバージョンを1.8.0に更新すると、過去に使っていたコードが動かなくなりました。あるあるです。

プログラムが動くようになる解決策と、なぜ動かないのかをChatGPT先生に聞いてみました。

エラーと解決策

Traceback (most recent call last):
File “C:\Users\Public\practice\230916_openAI\test91\c10_list_5_1_v7_modifiedv4_00.py”, line 113, in
access_openai(combined_content)
File “C:\Users\Public\practice\230916_openAI\test91\c10_list_5_1_v7_modifiedv4_00.py”, line 91, in access_openai
message = response[‘choices’][0][‘message’][‘content’]
TypeError: ‘ChatCompletion’ object is not subscriptable

結論から申し上げますと、以下のようにコードを修正すると動くようになりました。

左:1.8.0で動くように修正したコード 右:0.28で動いていたコード

Beyond Compareのスクショではよくわからないので、以下でコードそのものをお示しします。

before

  response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=messages,
  )
  message = response.choices[0].message
  messages.append(message)

  tokens_used = response['usage']['total_tokens']
  print(tokens_used)

  # Writing the AI response to a text file
  with open("dev0_section_0.txt", "a", encoding="utf-8") as file:
      file.write(message.content.strip())

after

  response = openai.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=messages,
  )
  message = response.choices[0].message.content
  messages.append(message)

  tokens_used = response.usage.total_tokens
  print(tokens_used)

  # Writing the AI response to a text file
  with open("dev0_section_0.txt", "a", encoding="utf-8") as file:
      file.write(message.strip())

1,5,8,13行目が変更されています。

何が悪かったのか?

OpenAIのAPIを動かすコードは、以下の書籍「Python / JavaScriptによるOpen AIプログラミング」で解説されていたものを使いました。

この本を購入したのが2023年9月で、当時はopenaiライブラリのバージョンは0.28でした。2024年1月末現在1.8.0がリリースされており、アップデートをしたところ、この本に掲載のコードが動かなくなりました。

コードを動くようにするために、ChatGPT先生に質問しながら修正をしていきました。動かない理由について、ChatGPT先生は以下のようにおっしゃっていました。

ChatCompletion オブジェクトは、通常の辞書のように添字でアクセスできないため、正しい属性やメソッドを使用して結果にアクセスする必要があります

OpenAIのAPIドキュメントによると、chat.completions.create メソッドは ChatCompletion オブジェクトを返します。このオブジェクトから必要な情報を取り出すためには、適切な属性やメソッドを使用する必要があります。例えば、応答内容にアクセスするためには、response.choices[0].message.content のように属性にアクセスする必要があります

ChatGPT先生

ちょっと何言ってるかわからないですね。

また、回答生成のために使用したトークン数の取得方法も良くなかったようです。

tokens_used = response['usage']['total_tokens']

response オブジェクトは ChatCompletion タイプで、通常の辞書のように添字でアクセスできないため、この行がエラーを引き起こしています。代わりに、正しい属性を使用してトークンの使用数を取得する必要があります。例えば、以下のように修正します:

tokens_used = response.usage.total_tokens
ChatGPT

ちょっと何言ってるかわからないですね。(2回目)

また、ファイル出力の方法にも問題があったようです。

file.write(message.content.strip())

この行で発生している AttributeError は、message が文字列(str)であり、content という属性が存在しないために起こっています。以前の修正で response.choices[0].message.contentmessage に割り当てましたが、この message は既に文字列型です。したがって、.content 属性にアクセスする必要はありません。

修正案は以下の通りです:

file.write(message.strip())

ChatGPT

これも何言ってるかわかりませんが、指示された通りにコードを修正すると動くようになりました。

(簡単に言うと、GPTで生成されたメッセージをファイルに保存する際に、メッセージをただのテキストとして扱う必要があるようです。前のバージョンのライブラリでは、生成メッセージは少し複雑な形(content)で保存されていたので、それをシンプルなテキスト(str)に変える必要があります。)

今後も、なんかよくわからないけどAIの言うとおりにコードを修正したら動くようになった、という現象が続きそうです。私のように趣味でしかプログラムを使わない人間は、わからないことはChatGPTに丸投げでも良いかもしれません。

関連記事

コメント

タイトルとURLをコピーしました