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

1. 소개

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

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

빌드할 항목

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

  • 스터핑
  • 맵리듀스
  • 중복 청크가 있는 맵리듀스
  • 롤링 요약이 포함된 맵리듀스

2. 요구사항

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

3. 비용

이 튜토리얼에서는 Vertex AI 생성형 AI 스튜디오를 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에서 중복 청크가 있는 MapReduce와 롤링 요약이 있는 MapReduce라는 두 가지 방법을 확인하세요.

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

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