GPTで長文を要約する
こんにちは。けいすけです。
GPTはテキストを入力としてテキストを出力するシステムですが、要約にはものすごーーーく長けております。
しかし、その中でも弱点があり、それは長文の要約が難しいということです。
現在主流のGPT3.5では取り扱えるトークンが4097です。
これは日本語に換算すると約3000字程度です。
入力文と出力文合わせて3000字ですので、要約に使うとすると、入力2000文字、出力500文字くらいがいいところですね。
と言うことで素のGPTだと要約が全然できないので、何回かに分けて要約をすることになります。
ちなみに、要約についてはこのyoutubeが詳しいですね。
今回僕が採用したのは、上記の動画で言うところのRefineという仕組みです。(Refineと全く同一の仕組みかどうかまでは検証していません)
pythonでこのようなコードです。
contentsという引数に要約元の文章をうれると、1000文字ずつに区切って、前回の要約+新しい1000文字の要約を作ります。
これを繰り返すわけですね。
ソースコードはこちらです。pythonです。ライブラリのインポートなどは省略しているので必要なものはimportしてください。
def summarize_text(contents):
modelCode = "gpt-3.5-turbo"
youyaku = ""
position = 0
step = 1000
while True:
youyaku += "\n\n{本文}\n"
youyaku += contents[position:position+step]
with open("template/summarize.txt", "r") as f:
order = f.read()
order = order.replace("{input}" , youyaku)
chat_log = [{"role": "user", "content": order}]
response = openai.ChatCompletion.create(
model = modelCode,
temperature = 0.5,
messages= chat_log
)
youyaku = "{すでに要約されている文}\n"
youyaku += response["choices"][0]["message"]["content"]
print("===============================")
print(youyaku)
position += step
if len(contents) < position:
break
youyaku = response["choices"][0]["message"]["content"]
return youyaku
ちなみに、プロンプトとしてはsummarize.txtにこのように記述してあります。
#指令
文章中の重要なキーワードを使って、以下の入力文を日本語で要約せよ。
#入力文
{input}
#出力文
プロンプトはもっと改良の余地はありそうですが、とりあえずコレでなんとかなっています。
さて、気になる結果ですが、まずは自分のyoutube動画を文字起こしして、全て突っ込んでみます。そうすると、
お!なかなか良いでは無いか。
次に、冒頭のにゃんたさんの動画を文字起こしして入れてみます。
なかなか良いですね。
では最後に、太宰治の走れメロスを全文要約してみます。
ここの文章を使わせて頂きました。
原文は9896字ありましたが、結果はこのようになりました。
👀これは走れメロスの終盤と所が要約されていますね。最初の文章を最後まで残すのは、今の仕様ではちょっと難しそうです。
これは今後の課題ですね。
と言うことで今日はここまで。
ChatGPTやStable DiffusionなどのAIについて語るライングループを作りました。
興味がある方はぜひご参加ください(無料)
プロンプトの秘密基地
https://line.me/ti/g2/QwHQIm1GcUd8I6wFSWLnnPchsVpTK_eMjaJEpQ