วิธีการสรุปข้อความโดยใช้ Vertex AI PaLM API

1. บทนำ

การสรุปข้อความเป็นกระบวนการสร้างเอกสารข้อความฉบับย่อโดยยังคงรักษาข้อมูลสำคัญไว้ กระบวนการนี้สามารถใช้เพื่ออ่านเอกสารขนาดยาวอย่างรวดเร็ว ดูคร่าวๆ จับใจความสำคัญของบทความ หรือแชร์ข้อมูลสรุปกับผู้ใช้ แม้ว่าการสรุปย่อหน้าสั้นๆ จะไม่ใช่เรื่องง่าย แต่ก็มีความท้าทายบางอย่างที่คุณต้องเอาชนะหากต้องการสรุปเอกสารขนาดใหญ่ เช่น ไฟล์ PDF ที่มีหลายหน้า

ใน Codelab นี้ คุณจะได้เรียนรู้วิธีใช้โมเดล Generative เพื่อสรุปเอกสารขนาดใหญ่

สิ่งที่คุณจะสร้าง

ในบทแนะนำนี้ คุณจะได้เรียนรู้วิธีใช้โมเดล Generative เพื่อสรุปข้อมูลจากข้อความโดยทำตามวิธีการต่อไปนี้

  • การยัด
  • MapReduce
  • MapReduce ที่มี Chunk ทับซ้อนกัน
  • MapReduce พร้อมสรุปแบบต่อเนื่อง

2. ข้อกำหนด

  • เบราว์เซอร์ เช่น Chrome หรือ Firefox
  • โปรเจ็กต์ Google Cloud ที่เปิดใช้การเรียกเก็บเงิน

3. ค่าใช้จ่าย

บทแนะนำนี้ใช้ Vertex AI Generative AI Studio เป็นคอมโพเนนต์ที่เรียกเก็บเงินได้ของ Google Cloud

ดูข้อมูลเกี่ยวกับราคาของ Vertex AI, ราคาของ Generative 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. ตรวจสอบสิทธิ์สภาพแวดล้อมของ Notebook ด้วยวิธีใดวิธีหนึ่งต่อไปนี้
  • สำหรับ Colab ให้ยกเลิกการแสดงความคิดเห็นในเซลล์ต่อไปนี้
from google.colab import auth
auth.authenticate_user()
  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 ที่ดาวน์โหลดมา 2-3 หน้ามีดังนี้

# 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. ดึงข้อความจากหน้า 2 ในไฟล์ PDF เท่านั้น
# 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. สร้างเทมเพลตพรอมต์ที่ใช้ใน Notebook ได้ในภายหลัง
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. ใช้ LLM ผ่าน API เพื่อสรุปข้อความที่ดึงออกมา โปรดทราบว่าปัจจุบัน 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 คำขอมีอาร์กิวเมนต์ที่ไม่ถูกต้อง เนื่องจากข้อความที่ดึงออกมานั้นยาวเกินกว่าที่โมเดล Generative จะประมวลผลได้

หากต้องการหลีกเลี่ยงปัญหานี้ คุณต้องป้อนข้อความที่แยกออกมาเป็นกลุ่ม เช่น 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. วิธีการ MapReduce

เราจะดูวิธี MapReduce เพื่อแก้ปัญหาการแก้ปัญหานี้สำหรับเอกสารขนาดใหญ่ วิธีนี้จะแบ่งข้อมูลขนาดใหญ่ออกเป็นชิ้นเล็กๆ ก่อน จากนั้นจึงเรียกใช้พรอมต์ในแต่ละชิ้น สำหรับงานสรุป ผลลัพธ์ของพรอมต์แรกคือสรุปของชิ้นงานนั้น เมื่อสร้างเอาต์พุตเริ่มต้นทั้งหมดแล้ว ระบบจะเรียกใช้พรอมต์อื่นเพื่อรวมเอาต์พุตเหล่านั้น

ดูรายละเอียดการติดตั้งใช้งานวิธีนี้ได้ที่ลิงก์ใน GitHub

7. ขอแสดงความยินดี

ยินดีด้วย คุณสรุปเอกสารขนาดยาวเรียบร้อยแล้ว คุณได้เรียนรู้วิธีสรุปเอกสารขนาดยาว 2 วิธี พร้อมทั้งข้อดีและข้อเสียของแต่ละวิธี การสรุปเอกสารขนาดใหญ่ทำได้ 2-3 วิธี โปรดดูอีก 2 วิธี ได้แก่ MapReduce ที่มีก้อนข้อมูลที่ทับซ้อนกันและ MapReduce ที่มีสรุปแบบเลื่อนใน Codelab อื่น

การสรุปเอกสารที่มีเนื้อหายาวอาจเป็นเรื่องยาก โดยคุณจะต้องระบุประเด็นหลักของเอกสาร สังเคราะห์ข้อมูล และนำเสนอในลักษณะที่กระชับและสอดคล้องกัน ซึ่งอาจเป็นเรื่องยากหากเอกสารมีความซับซ้อนหรือเป็นเอกสารทางเทคนิค นอกจากนี้ การสรุปเอกสารขนาดยาวอาจใช้เวลานาน เนื่องจากคุณต้องอ่านและวิเคราะห์ข้อความอย่างละเอียดเพื่อให้แน่ใจว่าสรุปนั้นถูกต้องและครบถ้วน

แม้ว่าวิธีเหล่านี้จะช่วยให้คุณโต้ตอบกับ LLM และสรุปเอกสารขนาดยาวได้อย่างยืดหยุ่น แต่บางครั้งคุณอาจต้องการเร่งกระบวนการโดยใช้การเริ่มต้นหรือวิธีการที่สร้างไว้ล่วงหน้า ไลบรารีอย่าง LangChain จึงมีประโยชน์ในกรณีนี้ ดูข้อมูลเพิ่มเติมเกี่ยวกับการรองรับ LangChain ใน Vertex AI