小説の場面をGPTに書かせる試み 3/100
前回の失敗:Roleというものをよくわかっていない
ってことで、今回はRoleを使う練習です。
実際のコード
!pip install openai
import openai
import json
GPT_KEY = "YOUR_API_KEY"
def gpt3(system_content, user_content, assistant_content):
openai.api_key = GPT_KEY
response = openai.ChatCompletion.create(
model = "gpt-3.5-turbo",
messages = [
{"role": "system",
"content": system_content},
{"role": "assistant",
"content": assistant_content},
{"role": "user",
"content": user_content},
],
n = 1
)
return response
def gpt3_list(system_content, user_content_list, assistant_content_list, n):
openai.api_key = GPT_KEY
messages = [{"role": "system", "content": system_content},]
list_length = max(len(assistant_content_list), len(user_content_list))
for i in range(0, list_length):
if i < len(user_content_list):
messages.append({"role": "user", "content": user_content_list[i]})
if i < len(assistant_content_list):
messages.append({"role": "assistant", "content": assistant_content_list[i]})
response = openai.ChatCompletion.create(
model = "gpt-3.5-turbo",
messages = messages,
n = n
)
return response
system_content = """
入力された情報をもとに、物語の登場人物の行動をJSONで返してください。
"""
melos_content_1= """
{"主体":"メロス","対象":"セリヌンティウス", "行動":"殴る", "発言":"「俺の味噌汁を返せ!」"}
"""
selinun_content_1 = """
{"主体":"セリヌンティウス","対象":"メロス", "行動":"殴り返す", "発言":"「お前だって俺のたくあん漬けを取っただろ!」"}
"""
melos_content_2 = """
{"主体":"メロス","対象":"セリヌンティウス", "行動":"憤慨する", "発言":"「お前に貸した10円をまだ返してもらってない!」"}
"""
melos_content_list = [melos_content_1, melos_content_2]
selinun_content_list = [selinun_content_1]
history = []
for i in range(5):
response_from_selinun_to_melos = gpt3_list(system_content, melos_content_list, selinun_content_list, n = 1)
json_object = json.loads(response_from_selinun_to_melos.choices[0]["message"]["content"])
if list(json_object.keys())[0] == "主体" and json_object["主体"] == "メロス":
melos_content_list.append(response_from_selinun_to_melos.choices[0]["message"]["content"])
if list(json_object.keys())[0] == "主体" and json_object["主体"] == "セリヌンティウス":
selinun_content_list.append(response_from_selinun_to_melos.choices[0]["message"]["content"])
history.append(response_from_selinun_to_melos.choices[0]["message"]["content"])
response_from_melos_to_selinun = gpt3_list(system_content, selinun_content_list, melos_content_list, n = 1)
json_object = json.loads(response_from_melos_to_selinun.choices[0]["message"]["content"])
if list(json_object.keys())[0] == "主体" and json_object["主体"] == "メロス":
melos_content_list.append(response_from_melos_to_selinun.choices[0]["message"]["content"])
if list(json_object.keys())[0] == "主体" and json_object["主体"] == "セリヌンティウス":
selinun_content_list.append(response_from_melos_to_selinun.choices[0]["message"]["content"])
history.append(response_from_melos_to_selinun.choices[0]["message"]["content"])
for item in history:
print(item)
結果その1
返り値が必ずしもJSONにできるとは限らないので、エラーになることがある。
---------------------------------------------------------------------------
JSONDecodeError Traceback (most recent call last)
<ipython-input-40-f8313f126c4d> in <cell line: 21>()
30
31 response_from_melos_to_selinun = gpt3_list(system_content, selinun_content_list, melos_content_list, n = 1)
---> 32 json_object = json.loads(response_from_melos_to_selinun.choices[0]["message"]["content"])
33 if list(json_object.keys())[0] == "主体" and json_object["主体"] == "メロス":
34 melos_content_list.append(response_from_melos_to_selinun.choices[0]["message"]["content"])
2 frames
/usr/lib/python3.10/json/decoder.py in raw_decode(self, s, idx)
353 obj, end = self.scan_once(s, idx)
354 except StopIteration as err:
--> 355 raise JSONDecodeError("Expecting value", s, err.value) from None
356 return obj, end
JSONDecodeError: Expecting value: line 1 column 1 (char 0)
結果その2
うまく行ったときは、こんな感じ
{"主体":"セリヌンティウス","対象":"メロス", "行動":"謝る", "発言":"「すみません、まだ返していなかったでした。今すぐ返します。」"}
{"主体":"セリヌンティウス","対象":"メロス", "行動":"笑いながら謝る", "発言":"「ごめんね、忘れてたよ。今から返すからね。でも10円ってすごいくだらないことで怒るね。」"}
{"主体":"メロス","対象":"セリヌンティウス", "行動":"笑いながら許す", "発言":"「いや、俺もくだらなかったわ。これからは気にしないでいいよ。」"}
今回の失敗
返り値が必ずしもJSONにパースできるとは限らない。
ここから先は
0字
¥ 300
この記事が気に入ったらサポートをしてみませんか?