Vertex AI PaLM API를 사용한 텍스트 요약 방법

1. 소개

텍스트 요약은 중요한 정보를 보존하면서 더 짧은 버전의 텍스트 문서를 만드는 프로세스입니다. 이 프로세스는 긴 문서를 빠르게 훑어보거나, 기사의 요점을 파악하거나, 사용자와 요약을 공유하는 데 사용할 수 있습니다. 짧은 단락을 요약하는 것은 사소한 작업이지만, 대용량 문서를 요약하려면 극복해야 할 몇 가지 문제가 있습니다. 여러 페이지로 구성된 PDF 파일을 예로 들 수 있습니다.

이 Codelab에서는 생성 모델을 사용하여 대규모 문서를 요약하는 방법을 알아봅니다.

빌드할 항목

이 튜토리얼에서는 다음 방법을 통해 생성 모델을 사용하여 텍스트의 정보를 요약하는 방법을 알아봅니다.

  • 스터핑
  • 맵리듀스
  • 겹치는 청크를 사용하는 맵리듀스
  • 롤링 요약을 포함하는 맵리듀스

2. 요구사항

  • 브라우저(Chrome 또는 Firefox 등)
  • 결제가 사용 설정된 Google Cloud 프로젝트

3. 비용

이 튜토리얼에서는 Vertex AI Generative AI Studio를 Google Cloud의 청구 가능한 구성요소로 사용합니다.

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 요청에 잘못된 인수가 포함되어 있습니다.

이 문제를 방지하려면 추출된 텍스트 청크(예: 처음 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의 일부분에서 가장 중요한 정보를 간결하고 글머리기호 목록으로 만들어 만들었습니다.

장점

  • 이 메서드는 모델을 한 번만 호출합니다.
  • 모델은 텍스트를 요약할 때 한 번에 모든 데이터에 액세스할 수 있습니다. 이렇게 하면 결과가 개선됩니다.

단점

  • 대부분의 모델에는 컨텍스트 길이가 있습니다. 대용량 문서 (또는 많은 문서)의 경우 프롬프트가 컨텍스트 길이보다 크기 때문에 작동하지 않습니다.
  • 이 방법은 작은 데이터 조각에서만 작동하며 대용량 문서에는 적합하지 않습니다.

6. 맵리듀스 메서드

대용량 문서에서 이 문제를 해결하는 문제를 해결하기 위해 맵리듀스 메서드를 살펴보겠습니다. 이 방법은 먼저 큰 데이터를 작은 조각으로 분할한 다음, 각 조각에 대해 프롬프트를 실행합니다. 요약 작업의 경우 첫 번째 프롬프트의 출력은 해당 부분의 요약입니다. 초기 출력이 모두 생성되면 이를 결합하기 위해 다른 프롬프트가 실행됩니다.

이 메서드의 구현 세부정보는 이 GitHub 링크를 참고하세요.

7. 축하합니다

축하합니다. 긴 문서를 요약했습니다. 긴 문서를 요약하는 두 가지 방법과 장단점을 알아봤습니다. 대용량 문서를 요약하는 방법에는 몇 가지가 있습니다. 다른 Codelab에서 청크가 겹치는 맵리듀스와 롤링 요약을 사용하는 맵리듀스 등 두 가지 다른 방법을 찾아보세요.

긴 문서를 요약하는 것은 어려울 수 있습니다. 문서의 주요 사항을 파악하고 정보를 종합하여 간결하고 일관된 방식으로 제시해야 합니다. 문서가 복잡하거나 기술적인 경우에는 어려울 수 있습니다. 또한 긴 문서를 요약하려면 텍스트를 신중하게 읽고 분석하여 요약이 정확하고 완전한지 확인해야 하므로 시간이 오래 걸릴 수 있습니다.

이러한 방법을 사용하면 LLM과 상호작용하고 긴 문서를 유연한 방식으로 요약할 수 있지만 부트스트랩이나 사전 빌드된 방법을 사용하여 프로세스의 속도를 높이고 싶을 수도 있습니다. 여기서 LangChain과 같은 라이브러리가 사용됩니다. Vertex AI의 LangChain 지원에 대해 자세히 알아보세요.