小説の場面を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

この記事が気に入ったらサポートをしてみませんか?