Vertex AI PaLM API を使用したテキスト要約メソッド

1. はじめに

テキストの要約とは、重要な情報を保持しながら、テキスト ドキュメントの短いバージョンを作成するプロセスです。このプロセスを使用すると、長いドキュメントをすばやく確認して記事の要点を把握したり、要約をユーザーと共有したりできます。短い段落を要約するのは簡単なことではありませんが、長いドキュメントを要約する場合は、克服すべき課題がいくつかあります。たとえば、複数ページの PDF ファイルなどです。

この Codelab では、生成モデルを使用して長いドキュメントを要約する方法について説明します。

作成するアプリの概要

このチュートリアルでは、生成モデルを使用してテキストから情報を要約する方法を学習します。次の方法を使用します。

  • スタッフィング
  • MapReduce
  • 重複するチャンクを使用した MapReduce
  • ローリング サマリーを使用した MapReduce

2. 必要なもの

  • ブラウザ(ChromeFirefox など)
  • 課金を有効にした Google Cloud プロジェクト

3. 費用

このチュートリアルでは、Google Cloud の課金対象コンポーネントとして Vertex AI Generative AI Studio を使用します。

Vertex AI の料金生成 AI の料金をご覧ください。また、 料金計算ツールを使用すると、予想される使用量に基づいて費用を見積もることができます。

4. 開始するには

  1. 次のコマンドを使用して、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 の場合は、上部のボタンを使用してターミナルを再起動できます。
  1. 次のいずれかの方法でノートブック環境を認証します。
  • Colab の場合は、次のセルのコメントを解除します。
from google.colab import auth
auth.authenticate_user()
  • Vertex AI Workbench の場合は、設定手順をご覧ください。
  1. ライブラリをインポートして 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")
  1. text-bison@001 という事前トレーニング済みのテキスト生成モデルを読み込むモデルをインポートします。
generation_model = TextGenerationModel.from_pretrained("text-bison@001")
  1. 要約タスク用の 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. スタッフィング方式

言語モデルにデータを渡す最も簡単な方法は、コンテキストとしてプロンプトに「スタッフィング」することです。これには、プロンプト内のすべての関連情報と、モデルで処理する順序が含まれます。

  1. 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")
  1. ノートブックで後で使用できるプロンプト テンプレートを作成します。
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:
"""
  1. 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)
  1. 抽出されたテキストが長すぎて生成モデルで処理できないため、モデルはエラー メッセージ 400 Request contains an invalid argument を返しました。

この問題を回避するには、抽出したテキストのチャンク(たとえば、最初の 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

スクリーンショットに次の結果が表示されます。

710efedd9f6dbc6d.png

概要

フルテキストはモデルには大きすぎますが、モデルを使用して PDF の一部から最も重要な情報の簡潔な箇条書きリストを作成できました。

メリット

  • このメソッドでは、モデルへの呼び出しは 1 回のみです。
  • テキストを要約する場合、モデルはすべてのデータに一度にアクセスできます。これにより、結果が向上します。

デメリット

  • ほとんどのモデルにはコンテキストの長さがあります。長いドキュメント(または多数のドキュメント)の場合、コンテキストの長さを超えるプロンプトが生成されるため、この方法は機能しません。
  • このメソッドは、小さなデータに対してのみ機能し、長いドキュメントには適していません。

6. MapReduce メソッド

長いドキュメントでこの問題を解決するために、MapReduce メソッドについて説明します。このメソッドでは、まず大きなデータを小さなピースに分割し、各ピースに対してプロンプトを実行します。要約タスクの場合、最初のプロンプトの出力はそのピースの要約です。最初の出力がすべて生成されたら、別のプロンプトを実行してそれらを結合します。

このメソッドの実装の詳細については、こちらの GitHub リンクをご覧ください。

7. 完了

おめでとうございます!長いドキュメントを要約できました。長いドキュメントを要約する 2 つの方法と、そのメリットとデメリットについて学習しました。長いドキュメントを要約する方法はいくつかあります。別の Codelab で、重複するチャンクを使用した MapReduce とローリング サマリーを使用した MapReduce の 2 つの方法について説明します。

長いドキュメントを要約するのは難しい場合があります。ドキュメントの要点を特定し、情報を合成して、簡潔で一貫性のある方法で提示する必要があります。ドキュメントが複雑または技術的な場合は、難しくなる可能性があります。また、要約が正確で完全であることを確認するために、テキストを注意深く読んで分析する必要があるため、長いドキュメントの要約には時間がかかることがあります。

これらの方法を使用すると、LLM を操作して長いドキュメントを柔軟に要約できますが、ブートストラップまたは事前構築済みのメソッドを使用してプロセスを高速化したい場合があります。このような場合に、LangChain などのライブラリが役立ちます。Vertex AI での LangChain のサポートの詳細をご覧ください。