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
結論から申し上げますと、以下のようにコードを修正すると動くようになりました。
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ドキュメントによると、
ChatGPT先生chat.completions.create
メソッドはChatCompletion
オブジェクトを返します。このオブジェクトから必要な情報を取り出すためには、適切な属性やメソッドを使用する必要があります。例えば、応答内容にアクセスするためには、response.choices[0].message.content
のように属性にアクセスする必要があります。
ちょっと何言ってるかわからないですね。
また、回答生成のために使用したトークン数の取得方法も良くなかったようです。
tokens_used = response['usage']['total_tokens']
response
オブジェクトはChatCompletion
タイプで、通常の辞書のように添字でアクセスできないため、この行がエラーを引き起こしています。代わりに、正しい属性を使用してトークンの使用数を取得する必要があります。例えば、以下のように修正します:ChatGPTtokens_used = response.usage.total_tokens
ちょっと何言ってるかわからないですね。(2回目)
また、ファイル出力の方法にも問題があったようです。
file.write(message.content.strip())
この行で発生している
AttributeError
は、message
が文字列(str
)であり、content
という属性が存在しないために起こっています。以前の修正でresponse.choices[0].message.content
をmessage
に割り当てましたが、このmessage
は既に文字列型です。したがって、.content
属性にアクセスする必要はありません。修正案は以下の通りです:
ChatGPTfile.write(message.strip())
これも何言ってるかわかりませんが、指示された通りにコードを修正すると動くようになりました。
(簡単に言うと、GPTで生成されたメッセージをファイルに保存する際に、メッセージをただのテキストとして扱う必要があるようです。前のバージョンのライブラリでは、生成メッセージは少し複雑な形(content)で保存されていたので、それをシンプルなテキスト(str)に変える必要があります。)
今後も、なんかよくわからないけどAIの言うとおりにコードを修正したら動くようになった、という現象が続きそうです。私のように趣味でしかプログラムを使わない人間は、わからないことはChatGPTに丸投げでも良いかもしれません。
関連記事
コメント