見出し画像

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

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