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つがあります。
stuff
map_reduce
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について調べたのでまとめを書きました。
長い文章の要約に使えないか?と思って調べたのですが、実際にやってみると期待したほどすごい要約がでてくるという感じではない印象です。
このため、個人的には使いどころが悩ましいなぁというと思っています。
ただ、いろいろ工夫すればいいものができそうな気もするので、少し文章の要約というかまとめは工夫できないかチャレンジしようと思います。