LangChainのSummarizationについて調べたまとめ

LangChainの中身がどうなっているのか気になっている今日このごろ。

今回はLangChainのテキストをまとめるSummarizationまわりについて調べたのでそのまとめになります。

LangChainって何?ってなった方はこちらに紹介の記事がありますので、ご覧ください。

LangChainのSummarizationとは?

LangChainのSummarizationとは与えられたテキストデータから要約されたテキストを作る機能になります。

LangChainにはChatGPTのようなサンプル以外にも様々な例が紹介されています。その中の一つがSummarizationです。

Summarizationは他の機能よりも説明が少なく、また、少し長い論文の要約をさせようとすると動かないことがあるので、どのような処理をさせているのか?を理解したくて調査しました。

ちなみに参考にしたのはこのnotebookです。

https://python.langchain.com/en/latest/modules/chains/index_examples/summarize.html

ここから基本的には要約したいDocumentのリストを引数にとるload_summarize_chain()を使って実行した場合の例について説明していきます。

load_summarize_chainによるSummarizationの3つの方法

load_summarize_chain()Summarizationとして以下の3つがあります。

  1. stuff
  2. map_reduce
  3. refine 

それぞれについて説明していきます。

stuff

おそらくSummarizationという機能から一番最初に想像するのがこれです。与えられたDocumentのリストを受け取って、すべてつなげた一つのテキストにします。それをLLMに投げて要約させます。defaultのPromptのテンプレートとしては以下のようなものになっています。

"""Write a concise summary of the following:


"{text}"


CONCISE SUMMARY:"""

ここで、{text}のところに1つにつなげたテキストに置き換えてLLMに入力します。LLMはCONCISE SUMMARY:の続きを生成するので、{text}の部分に基づいて要約した文章を生成することになります。

CONCISE SUMMARY: から先はLLMに生成させるようにすることで要約をえることができるようになっています。

ただ、これの問題点としては与えrるDocumentのリストの合計のテキストの長さが長すぎるとLLMのコンテキストサイズを超えて実行できないケースが発生するので注意してください。

map_reduce

次にmap_reduce に関してです。名前の通りで、リストで与えられたDocumentを一度要約し、その要約されたものを組み合わせてさらに要約するというのを繰り返し行い、最終的な要約を得るものになります。

最初の要約の部分とその後の要約されたものからさらに要約をする部分の2種類のステップがありますが、どちらもデフォルトでは以下のpromptのテンプレートを使います。

"""Write a concise summary of the following:


"{text}"


CONCISE SUMMARY:"""

いろいろ試しましたが、特に論文のような長い文章の場合はこれが一番まともな要約をしてくれる印象でした。

refine

最後にrefine です。これも名前の通りですが、与えられたDocumentのリストの最初の要約を作り、そのごその要約と次のDocumentの要約を作ります。これを繰り返して最終的な要約を得ます。

これは二種類のプロンプトを使い分けて実行されます。まず最初の要約を作る部分は今までと同じように以下のプロンプトが使われます。

"""Write a concise summary of the following:


"{text}"


CONCISE SUMMARY:"""

そして、それまでの要約と新しいDocumentを組み合わせて新しい要約を作る部分のプロンプトは以下のようになります。

    "Your job is to produce a final summary\n"
    "We have provided an existing summary up to a certain point: {existing_answer}\n"
    "We have the opportunity to refine the existing summary"
    "(only if needed) with some more context below.\n"
    "------------\n"
    "{text}\n"
    "------------\n"
    "Given the new context, refine the original summary"
    "If the context isn't useful, return the original summary."

refine を使ってみた感想としては最後のほうのDocumentに影響されて、それほど情報量のないにも関わらず、最後のほうのDocumentの内容が要約に含まれていました。このため、要約の品質としてはmap_reduce のほうがよいかもしれないと思っています。

終わりに

今回はLangChainのSummarizationについて調べたのでまとめを書きました。

長い文章の要約に使えないか?と思って調べたのですが、実際にやってみると期待したほどすごい要約がでてくるという感じではない印象です。

このため、個人的には使いどころが悩ましいなぁというと思っています。

ただ、いろいろ工夫すればいいものができそうな気もするので、少し文章の要約というかまとめは工夫できないかチャレンジしようと思います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトは reCAPTCHA によって保護されており、Google のプライバシーポリシー および 利用規約 に適用されます。

reCaptcha の認証期間が終了しました。ページを再読み込みしてください。