LangChainチュートリアルメモ4 [LangChain&GPT-3で文章を要約する]
注意:この記事は書きかけの状態で公開しています。
参考(以下のチュートリアルを日本語訳+補足した内容になります。
LangChainのSummarization機能を用いて、ドキュメントを要約します。
要約を行うプログラムの前に、ドキュメントを要約する方法(CombineDocuments Chain)について学ぶ必要があります。
CombineDocuments Chainsについて
CombineDocuments Chainは、複数のドキュメントに対して言語を実行する必要がある場合に便利です。
一般的な使用例としては、
質問応答
ソース付き質問応答
要約
などがあります。詳細は、こちらの概要をご覧ください。
https://langchain.readthedocs.io/en/latest/use_cases/combine_docs.html
1.Stuffing
スタッフィングとは,言語モデルに渡すコンテキストとして,プロンプトに関連するデータをすべて詰め込むという最もシンプルな方法です。これはLangChainにStuffDocumentsChainとして実装されています。
長所:LLMへの呼び出しは一度だけ。テキストを生成する際、LLMは一度にすべてのデータにアクセスすることができる。
欠点:ほとんどの LLM はコンテクスト長を持っており、大きなドキュメント(または多くのドキュメント)の場合、コンテクスト長よりも大きなプロンプトになるため、この方法はうまくいかない。
この方法の主な欠点は、小さなデータしか扱えないことです。多くのデータを扱うようになると、この方法はもはや実行不可能になる。次の2つの方法は、この問題に対処するためのものです。
2.Map Reduce
この方法では、データの塊ごとに最初のプロンプトを実行する(要約タスクの場合はその塊の要約、質問応答タスクの場合はその塊のみに基づく回答)。次に、すべての初期出力を結合するために、別のプロンプトが実行される。これはLangChainの中でMapReduceDocumentsChainとして実装されています。
長所:StuffDocumentsChainよりも大きなドキュメント(およびより多くのドキュメント)にスケールすることができる。個々の文書に対するLLMの呼び出しは独立しているため、並列化できる。
短所:StuffDocumentsChainよりも多くのLLMの呼び出しを必要とする。最終的な結合の呼び出しで、一部の情報を失う。
3.Refine
この方法では、最初のデータの塊に対して最初のプロンプトが表示され、何らかの出力が生成される。残りの文書については、その出力が次の文書とともに渡され、LLMに新しい文書に基づいて出力を改良するよう依頼する。
長所:MapReduceDocumentsChainよりも関連性の高いコンテキストを取り込むことができ、損失が少ない可能性がある。
短所:StuffDocumentsChainよりも多くのLLMへの呼び出しを必要とする。また、この呼び出しは独立ではない。つまり、MapReduceDocumentsChainのように並列化することはできない。また、ドキュメントの順序に依存する可能性もある。
4.Map-Rerank
この方法では、各データチャンクに対して初期プロンプトを実行し、タスクを完了させようとするだけでなく、その答えがどの程度確かであるかをスコアで示します。そして、このスコアに従って回答がランク付けされ、最も高いスコアが返されます。
長所:MapReduceDocumentsChainと同様の長所。MapReduceDocumentsChainと比較すると、呼び出し回数が少ない。
短所:ドキュメント間の情報を結合することができない。つまり、1つのドキュメントに1つの単純な答えがあると予想される場合に最も有効である。
Stuffingを用いて文章を要約してみる
1.サンプル
今回は、Apple創業者、スティーブ・ジョブズ氏の2005年の演説字幕をYoutubeにて取得し、サンプルとして用いました。
サンプルは公開しておりますので、以下よりダウンロードすることが可能です。
2.コード
from langchain import OpenAI, PromptTemplate, LLMChain
from langchain.text_splitter import CharacterTextSplitter
from langchain.chains.mapreduce import MapReduceChain
from langchain.docstore.document import Document
from langchain.chains.summarize import load_summarize_chain
import os
os.environ["OPENAI_API_KEY"] = "..."
llm = OpenAI(temperature=0)
text_splitter = CharacterTextSplitter()
#要約するファイルを開く
with open('text_model_ENG.txt') as f:
state_of_the_union = f.read()
texts = text_splitter.split_text(state_of_the_union)
docs = [Document(page_content=t) for t in texts[:3]]
chain = load_summarize_chain(llm, chain_type="stuff")
print(chain.run(docs))
3.出力結果
ChatGPTで要約した内容と比較してみる
1.ChatGPT
2.Stuffing
この記事が気に入ったらサポートをしてみませんか?