1. はじめに
テキスト要約とは、重要な情報を保持しながら、テキスト ドキュメントの短いバージョンを作成するプロセスです。このプロセスは、長いドキュメントをすばやく要約したり、記事の要点を把握したり、ユーザーと要約を共有したりするために使用できます。短い段落の要約は簡単なタスクではありませんが、大規模なドキュメントを要約する場合は、いくつかの課題を克服する必要があります。たとえば、複数ページの PDF ファイルなどです。
この Codelab では、生成モデルを使用して大規模なドキュメントを要約する方法を学びます。
作成するアプリの概要
このチュートリアルでは、生成モデルを使用してテキストの情報を要約する方法を次の方法によって学習します。
- スタッフィング
- MapReduce
- チャンクが重複する MapReduce
- MapReduce とローリング サマリー
2. 必要なもの
3. 費用
このチュートリアルでは、Google Cloud の課金対象コンポーネントとして Vertex AI Generative AI Studio を使用します。
Vertex AI の料金と生成 AI の料金について学習する。料金計算ツールを使用すると、予想使用量に基づいて費用の見積もりを出すことができます。
4. 開始するには
- 次のコマンドを使用して、Vertex AI SDK やその他のパッケージ、それらの依存関係をインストールします。
!pip install google-cloud-aiplatform PyPDF2 ratelimit backoff --upgrade --quiet --user
- Colab の場合、次のセルのコメント化を解除してカーネルを再起動します。
# # Automatically restart kernel after installs so that your environment can access the new packages
import IPython
app = IPython.Application.instance()
app.kernel.do_shutdown(True)
- Vertex AI Workbench の場合は、上部のボタンを使用してターミナルを再起動できます。
- 次のいずれかの方法でノートブック環境を認証します。
- Colab の場合は、次のセルのコメント化を解除します。
from google.colab import auth
auth.authenticate_user()
- Vertex AI Workbench については、設定手順をご覧ください。
- ライブラリをインポートして Vertex AI SDK を初期化します。
- Colab の場合は、次のセルのコメント化を解除して、ライブラリをインポートします。
import vertexai
PROJECT_ID = "[your-project-id]" # @param {type:"string"}
vertexai.init(project=PROJECT_ID, location="us-central1")
import re
import urllib
import warnings
from pathlib import Path
import backoff
import pandas as pd
import PyPDF2
import ratelimit
from google.api_core import exceptions
from tqdm import tqdm
from vertexai.language_models import TextGenerationModel
warnings.filterwarnings("ignore")
- text-bison@001 という事前トレーニング済みのテキスト生成モデルを読み込むモデルをインポートします。
generation_model = TextGenerationModel.from_pretrained("text-bison@001")
- 要約タスク用に PDF ファイルをダウンロードするデータファイルを準備します。
# Define a folder to store the files
data_folder = "data"
Path(data_folder).mkdir(parents=True, exist_ok=True)
# Define a pdf link to download and place to store the download file
pdf_url = "https://services.google.com/fh/files/misc/practitioners_guide_to_mlops_whitepaper.pdf"
pdf_file = Path(data_folder, pdf_url.split("/")[-1])
# Download the file using `urllib` library
urllib.request.urlretrieve(pdf_url, pdf_file)
ダウンロードした PDF ファイルのページ数ページを表示する方法は次のとおりです。
# Read the PDF file and create a list of pages
reader = PyPDF2.PdfReader(pdf_file)
pages = reader.pages
# Print three pages from the pdf
for i in range(3):
text = pages[i].extract_text().strip()
print(f"Page {i}: {text} \n\n")
#text contains only the text from page 2
5. スタッフィングの方法
言語モデルにデータを渡す最も簡単な方法は、「スタッフィング」です。コンテキストとしてプロンプトに挿入します。これには、プロンプト内のすべての関連情報と、モデルに処理させる順序での情報が含まれます。
- PDF ファイルの 2 ページ目のみからテキストを抽出します。
# Entry string that contains the extacted text from page 2
print(f"There are {len(text)} characters in the second page of the pdf")
- ノートブックで後から使用できるプロンプト テンプレートを作成します。
prompt_template = """
Write a concise summary of the following text.
Return your response in bullet points which covers the key points of the text.
```{text}```
BULLET POINT SUMMARY:
"""
- API を介して LLM を使用し、抽出されたテキストを要約する。LLM には現在入力テキストの上限があるため、大量の入力テキストをスタッフィングすることは認められない場合があります。割り当てと上限の詳細については、割り当てと上限をご覧ください。
次のコードでは例外が発生します。
# Define the prompt using the prompt template
prompt = prompt_template.format(text=text)
# Use the model to summarize the text using the prompt
summary = generation_model.predict(prompt=prompt, max_output_tokens=1024).text
print(summary)
- モデルからエラー メッセージ「400 Request contains an invalid arguments」が返されました。抽出されたテキストが長すぎて生成モデルで処理できないためです。
この問題を回避するには、抽出したテキストのチャンク(たとえば、最初の 30,000 単語)を入力する必要があります。
# Define the prompt using the prompt template
prompt = prompt_template.format(text=text[:30000])
# Use the model to summarize the text using the prompt
summary = generation_model.predict(prompt=prompt, max_output_tokens=1024)
summary
スクリーンショットに次の結果が表示されます。
概要
このモデルに対してテキストは大きすぎますが、このモデルを使用して PDF の一部から最も重要な情報を箇条書きで簡潔にまとめたリストを作成することができました。
メリット
- このメソッドは、モデルを 1 回だけ呼び出します。
- テキストを要約する際、モデルはすべてのデータに一度にアクセスできます。これにより、結果が向上します。
デメリット
- ほとんどのモデルにはコンテキストの長さがあります。大規模なドキュメント(または多数のドキュメント)では、プロンプトがコンテキストの長さを超えるため、うまく機能しません。
- この方法は、小さなデータしか処理できず、大きなドキュメントには適していません。
6. MapReduce メソッド
サイズの大きいドキュメントの問題を解決するという問題に対処するために、MapReduce 方式を見ていきます。この方法では、まず大きなデータを小さな断片に分割し、各断片に対してプロンプトを実行します。要約タスクの場合、最初のプロンプトの出力はその部分の要約です。すべての初期出力が生成されたら、別のプロンプトを実行してそれらを結合します。
このメソッドの実装の詳細については、こちらの GitHub のリンクをご覧ください。
7. 完了
これで、長いドキュメントを要約できました。長いドキュメントを要約する 2 つの方法と、その長所と短所を学びました。サイズの大きいドキュメントを要約する方法はいくつかあります。他の 2 つのメソッド(チャンクが重複する MapReduce と、別の Codelab でローリング サマリーを使用する MapReduce)を確認してください。
長いドキュメントの要約は難しい場合があります。ドキュメントの要点を特定し、情報をまとめ、簡潔かつ一貫した方法で提示する必要があります。ドキュメントが複雑であったり、技術的であったりすると、判断は難しくなることがあります。さらに、長いドキュメントを要約するには、テキストを注意深く読んで分析し、要約が正確かつ完全であることを確認する必要があるため、時間がかかることがあります。
これらの方法では LLM とやり取りし、長いドキュメントを柔軟に要約できますが、ブートストラッピングや事前構築された方法で処理をスピードアップしたい場合もあります。このような場合に役立つのが、LangChain などのライブラリです。Vertex AI での LangChain サポートの詳細を確認する。