碇シンジの疑似人格をGPT Indexで作れるか? (第2回目)
前回は、GPT Indexを使用して、エヴァンゲリオンのアニメのセリフを取り込み、Index化して対応してみました。前回は、以下に乗せておきます。
今回は、2023/03/01にChatGPT APIが出たり、GPT IndexがChatGPT APIにも対応したという記事がありましたので、そちらの方を試そうかと考えましたが、入力ファイルの工夫でどういう結果が出るかを見てみたいと思います。
前回:アニメのセリフをそのままテキストファイル化
今回:前回のファイルを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を見てみると下記のようになっております。
次に、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)
response = index.query("シンジとして答えよ。エヴァンゲリオンとは何なのですか?")
print(response)
response = index.query("あなたはシンジである。エヴァンゲリオンに乗りたいですか?")
print(response)
response = index.query("あなたはシンジである。アスカとの想い出に残るエピソードはありますか?")
print(response)
最後のオキナワのエピソードとは何だったのかと気になりました。アニメでそんなエピソードなかったような気がします。
今回は思ったような結果が残せませんでした。第一人称として、シンジが周りの人達をどう思うか知りたかったし、回答が、私の思った回答と違う世界観を表しているように見えました。
次回は、ChatGPT APIのGPT Indexを使用したもので分析してみます。