見出し画像

碇シンジの疑似人格をGPT Indexで作れるか? (第2回目)

前回は、GPT Indexを使用して、エヴァンゲリオンのアニメのセリフを取り込み、Index化して対応してみました。前回は、以下に乗せておきます。

今回は、2023/03/01にChatGPT APIが出たり、GPT IndexがChatGPT APIにも対応したという記事がありましたので、そちらの方を試そうかと考えましたが、入力ファイルの工夫でどういう結果が出るかを見てみたいと思います。

前回:アニメのセリフをそのままテキストファイル化
今回:前回のファイルをChatGPTに小説風に書き換えさせて、テキストファイル化


今回もセリフは下記を利用させていただきます。


ChatGPTに小説風に修正してもらうと、どうなるか一部を紹介します。

ChatGPTへの入力


ChatGPTからの回答


人物まわりの描写があり、イメージがわきやすいような描写になっております。

これをエヴァンゲリオンのアニメのセリフを24話分を小説風に書き換えますが、ウェブ上のChatGPTだと恐らく途切れてしまうので、ChatGPT APIを使用して書き換えます。


次のプログラムが、ChatGPT APIを利用して、エヴァンゲリオンのアニメのセリフを小説風に書き換えてくれて、結果ファイルを保存してくれます。

・Your-API-Keyは、OpenAIで自分で取得したAPIキーに変更してください。
・エヴァンゲリオンのセリフファイル(serifu.txt)は、Google Colabの/content/testフォルダの配下に配置して下さい。
・結果ファイルは、Google Colabの/content/testフォルダにkekka.txtとして出力されます。

!pip install openai

# Note: you need to be using OpenAI Python v0.27.0 for the code below to work
import openai
openai.api_key = "Your-API-Key"


# ファイルからテキストを読み込む
with open("/content/test/testdata.txt", "r") as f:
    text = f.read()

# チャット形式のテキストに変換する
response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
      messages=[
        {"role":"system","content": "あなたは小説家である。"},
        {"role":"user","content":"次の文章を小説風にせよ。"f"{text}"}
    ]
)

# 結果を表示する
print(response["choices"][0]["message"]["content"])

# ファイルに結果を保存する
file_path = "/content/test/kekka.txt"
with open(file_path, "w") as f:
    f.write(response["choices"][0]["message"]["content"])


上記がシンプルなコードなので掲載しましたが、ChatGPT APIの入力トークン数の上限4096に抵触するので、下記のようにファイルを1024文字ごとにファイルを分割して、各々小説風に出力してもらうように変更いたします。

!pip install openai

# Note: you need to be using OpenAI Python v0.27.0 for the code below to work
import openai
openai.api_key = "Your-API-Key"

max_context_length = 4000

# ファイルからテキストを読み込む
with open("/content/test/serifu.txt", "r") as f:
    text = f.read()

# テキストを1024文字ずつのリストに分割する
input_token_lists = [text[i:i+1024] for i in range(0, len(text), 1024)]
print(len(input_token_lists))

i=0
for token_list in input_token_lists:
  print(len(token_list))
# チャット形式のテキストに変換する
  response = openai.ChatCompletion.create(
      model="gpt-3.5-turbo",
      messages=[
        {"role":"system","content": "あなたは小説家である。"},
        {"role":"user","content":"次の文章を小説風にせよ。"f"{token_list}"}
    ]
  )
  # ファイルに結果を保存する
  file_path = f"/content/test/kekka_{i}.txt"
  with open(file_path, "w") as f:
    f.write(response["choices"][0]["message"]["content"])
  i=i+1

出力結果の一部は、以下のようになります。66と表示されているのは、serifu.txtファイルが66個に分割されていることを意味しております。

Successfully installed openai-0.27.0
66
1024
1024

分割されたファイルは、Google Colabの/content/testに以下のように作成されます。


分割されて小説風にされたファイル


試しに、kekka_21.txtを見てみると下記のようになっております。

リツコは慌てて特殊ベークライトを探し始めた。「急いで!特殊ベークライトを持って来て!」と彼女は叫んだ。ゲンドウもあわててレイを呼びかけた。しかし、レイは無反応だった。

BGMが停止し、ゲンドウは苦しみ始めた。「ぐわっ!ぐぅううう!」と彼は苦痛の表情を浮かべた。レイの様子を見て、ゲンドウは心配そうに「レイ、大丈夫か?レイ!」と叫んだが、レイはまったく反応しなかった。

リツコはレイについての報告書を読み上げ始めた。「綾波レイ、14歳。マルドゥックの報告書によって選ばれた最初の被験者、ファーストチルドレン。エヴァンゲリオン試作零号機専属操縦者。過去の経歴は白紙、全て抹消済み。」

ミサトは実験の事故原因について尋ねた。

kekka_21.txt


次に、Google Colabの/content/test/にあるserifu.txtを削除しましょう。今回は、小説風のkekka_xx.txtを利用してGPT Index化するのが目的だからです。


さて、ここからが今回のメインとなります。下記のコードで、Google Colabの/content/test/kekka_xx.txt(xxは数字)をGPT Index化してみます。
今回使用するコードは以下となります。

!pip install gpt_index
import openai
import os

os.environ["OPENAI_API_KEY"] = "Your-API-Key"
from gpt_index import GPTSimpleVectorIndex, SimpleDirectoryReader, Document

documents = SimpleDirectoryReader(r'/content/test').load_data()
index = GPTSimpleVectorIndex(documents)
index.save_to_disk('eva.json')

index = GPTSimpleVectorIndex.load_from_disk('eva.json')
response = index.query("シンジとして答えよ。ミサト、アスカ、レイのことをどう思っているか?")
print(response)

シンジはミサト、アスカ、レイを大切な友人として思っています。彼らは彼を支えてくれ、彼が自分を信じることができるようにしてくれました。彼らと一緒にいると、彼は安心して、自分を信じることができるようになりました。彼らは彼の未来を変える力を持っていると信じています。

残念です。第三者目線で回答しており、第一人称で回答出来なかった。
他の質問もしてみたいと思います。

response = index.query("あなたは碇シンジである。ゲンドウのことどう思いますか?")
print(response)

ゲンドウのことを考えると、彼は私を信頼しているように思えます。彼は私にEVAに戻るように指示してくれたし、他の人間に任せるように言ってくれました。私は彼に感謝しています。

response = index.query("シンジとして答えよ。エヴァンゲリオンとは何なのですか?")
print(response)

エヴァンゲリオンとは、人類が作り出した巨大なロボットです。私たちは、このロボットを操縦して、宇宙からの脅威を防ぐための任務を遂行しています。

response = index.query("あなたはシンジである。エヴァンゲリオンに乗りたいですか?")
print(response)

はい、エヴァンゲリオンに乗りたいです。私たちが敵と戦うために、エヴァンゲリオンを使うことができるので、私はそれを活用したいと思っています。

response = index.query("あなたはシンジである。アスカとの想い出に残るエピソードはありますか?")
print(response)

はい、あります。シンジとアスカは、小さな窓から差し込む月明かりを頼りに勉強を続けたことで、オキナワでの想い出を築くことができました。また、朝日に目が覚めた時には、彼らは再び使徒に立ち向かう気持ちを新たにしていました。これらのエピソードは、シンジとアスカの想い出に残るものです。

最後のオキナワのエピソードとは何だったのかと気になりました。アニメでそんなエピソードなかったような気がします。

今回は思ったような結果が残せませんでした。第一人称として、シンジが周りの人達をどう思うか知りたかったし、回答が、私の思った回答と違う世界観を表しているように見えました。

次回は、ChatGPT APIのGPT Indexを使用したもので分析してみます。

いいなと思ったら応援しよう!