LlamaIndexとChatGPT APIを活用して書籍の全文要約を行う
先日は書籍をOCRしたテキストデータの内容をChatGPT APIを利用して補正してみました。今回は早速LlamaIndexを利用して書籍の全文要約をしてみようと思います。
LlamaIndexとは?
LlamaIndex(旧:GPT Index)はチャットボット作成ツールとして紹介されることが多いようですが、LLMに設定できるコンテキストサイズの限界を超えるためのツールという方が正しい理解だと思います。
例えばChatGPT APIであるgpt-3.5-turboのリクエスト最大トークン数は4,096(日本語で4000文字ぐらい)ですが、この制限は応答トークン数も含んだトークン数なので、実際にはもっと小さな値になります。
例えば特定の書籍の内容を踏まえて回答して欲しい場合、書籍の内容をまるっとリクエストに含めれば良いことになりますが、そんなことをすれば当たり前のようにリクエストトークン数は制限を超えてしまいます。
LlamaIndexはこのような制限を超えるためのライブラリで、事前にコンテキストとなる情報をインデックスした上で、クエリ内の文字列に関係のある箇所をAPIコール時のプロンプトに埋め込むことで、コンテキストの効いた文字生成を実現しています。
インデックスの仕方やレスポンスの合成方法については各種オプションがあるようなので、詳しくは下記ドキュメントを参照のこと。
コード
# パッケージのインストール
pip install llama-index
パッケージをインストールしたら下記のコードでインデックスを作成します。推論器としてChatGPTLLMPredicatorを指定しています。
from llama_index import GPTSimpleVectorIndex, SimpleDirectoryReader
from llama_index.langchain_helpers.chatgpt import ChatGPTLLMPredictor
llm_predictor = ChatGPTLLMPredictor(
prepend_messages = [
{"role": "system", "content": "あなたは優秀な批評家です。明快な理由と共に本質をおさえた回答が得意です。"},
]
)
# dataディレクトリに入っているファイルをロード
documents = SimpleDirectoryReader('data').load_data()
index = GPTSimpleVectorIndex(
documents=documents,
llm_predictor=llm_predictor
)
以下のコードでクエリを実行できます。
response = index.query("この書籍の要点は何ですか?")
print(response)
クエリ毎にどのぐらいのトークンを消費しているか表示されます。
実行結果の検証
response = index.query("著者は人月によって何が引き起こされると考えていますか? また、問題が引き起こされないようにするためには、どんな対処が必要であると考えていますか? 1000字以上で答えて下さい。")
print(response)
以下は「人月の神話」のテキストを与えてインデックスを生成した上で、上記のクエリを実行した結果の出力です。
要約品質の向上には、プロンプトとインデックスのチューニングがもっと必要ですね。