1. บทนำ
การสรุปข้อความเป็นกระบวนการสร้างเอกสารข้อความเวอร์ชันที่สั้นลงโดยยังคงเก็บข้อมูลสำคัญไว้ โดยขั้นตอนนี้สามารถใช้เพื่อดูเอกสารขนาดยาวคร่าวๆ อ่านใจความของบทความ หรือแชร์ข้อมูลสรุปกับผู้ใช้ แม้ว่าการสรุปย่อหน้าสั้นๆ จะเป็นงานที่ไม่สำคัญ แต่ก็มีอุปสรรค 2-3 ข้อที่ต้องจัดการหากต้องการสรุปเอกสารขนาดใหญ่ เช่น ไฟล์ PDF ที่มีหลายหน้า
ใน Codelab นี้ คุณจะได้ดูวิธีใช้โมเดล Generative เพื่อสรุปเอกสารขนาดใหญ่
สิ่งที่คุณจะสร้าง
ในบทแนะนำนี้ คุณจะได้เรียนรู้วิธีใช้โมเดล Generative เพื่อสรุปข้อมูลจากข้อความผ่านวิธีการต่อไปนี้
- อาหารยัดไส้
- MapReduce
- MapReduce กับกลุ่มที่ซ้อนกัน
- สรุปแบบ MapReduce กับ Rolling
2. ข้อกำหนด
3. ค่าใช้จ่าย
บทแนะนำนี้ใช้ Vertex AI Generative AI Studio เป็นคอมโพเนนต์ที่เรียกเก็บเงินได้ของ Google Cloud
ดูข้อมูลเกี่ยวกับราคา Vertex AI, ราคาของ Generative AI และใช้เครื่องคำนวณราคาเพื่อสร้างค่าใช้จ่ายโดยประมาณตามการใช้งานที่คาดการณ์ไว้
4. เริ่มต้นใช้งาน
- ติดตั้ง Vertex AI SDK, แพ็กเกจอื่นๆ และทรัพยากร Dependency โดยใช้คำสั่งต่อไปนี้
!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. วิธีการยัดไส้
วิธีที่ง่ายที่สุดในการส่งผ่านข้อมูลไปยังโมเดลภาษาคือ "ข้อมูล" ลงในพรอมต์เป็นบริบทได้ด้วย ซึ่งจะรวมข้อมูลที่เกี่ยวข้องทั้งหมดในพรอมต์และตามลำดับที่คุณต้องการให้โมเดลประมวลผล
- ดึงข้อความจากหน้าที่ 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")
- สร้างเทมเพลตพรอมต์และนำไปใช้กับสมุดบันทึกในภายหลังได้
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:
"""
- ใช้ 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)
- โมเดลตอบกลับด้วยข้อความแสดงข้อผิดพลาด: 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
คุณควรเห็นผลลัพธ์ต่อไปนี้ในภาพหน้าจอ
สรุป
แม้ว่าข้อความทั้งหมดจะใหญ่เกินไปสำหรับโมเดล แต่คุณก็สร้างรายการข้อมูลสำคัญที่สั้นกระชับและได้เป็นหัวข้อย่อยของข้อมูลสำคัญจากส่วนหนึ่งของ PDF โดยใช้โมเดลได้
ข้อดี
- วิธีนี้เรียกใช้โมเดลเพียงครั้งเดียว
- ขณะสรุปข้อความ โมเดลมีสิทธิ์เข้าถึงข้อมูลทั้งหมดพร้อมกัน ซึ่งจะช่วยให้ผลการค้นหาดีขึ้น
ข้อเสีย
- โมเดลส่วนใหญ่มีความยาวของบริบท กรณีที่เป็นเอกสารขนาดใหญ่ (หรือหลายเอกสาร) สิ่งนี้จะใช้งานไม่ได้เนื่องจากจะทำให้พรอมต์มีขนาดใหญ่กว่าความยาวของบริบท
- วิธีนี้ใช้ได้เฉพาะกับข้อมูลชิ้นเล็กๆ เท่านั้นและไม่เหมาะกับเอกสารขนาดใหญ่
6. เมธอด MapReduce
ในการแก้ปัญหานี้สำหรับเอกสารขนาดใหญ่ เราจะดูที่เมธอด MapReduce วิธีนี้จะแบ่งข้อมูลขนาดใหญ่ออกเป็นส่วนๆ ก่อน จากนั้นจึงเรียกใช้พรอมต์ในแต่ละข้อมูล สำหรับงานการสรุป เอาต์พุตของพรอมต์แรกจะเป็นสรุปของข้อมูลส่วนนั้น เมื่อสร้างเอาต์พุตเริ่มต้นทั้งหมดแล้ว ระบบจะเรียกใช้พรอมต์อื่นเพื่อรวมเอาต์พุตดังกล่าว
โปรดไปที่ลิงก์ GitHub นี้เพื่อดูรายละเอียดการนำวิธีการนี้ไปใช้งาน
7. ขอแสดงความยินดี
ยินดีด้วย คุณสรุปเอกสารขนาดยาวสำเร็จแล้ว คุณได้เรียนรู้วิธีสรุปเอกสารขนาดยาว 2 วิธี รวมถึงข้อดีและข้อเสียแล้ว การสรุปเอกสารขนาดใหญ่ทำได้หลายวิธี มองหาอีก 2 วิธี นั่นคือ MapReduce ซึ่งมีส่วนที่ทับซ้อนกันและ MapReduce พร้อมสรุปแบบต่อเนื่องใน Codelab อื่น
การสรุปเอกสารขนาดยาวอาจเป็นเรื่องยาก โดยคุณจะต้องระบุประเด็นหลักของเอกสาร สังเคราะห์ข้อมูล และนำเสนอให้กระชับและสอดคล้องกัน ซึ่งอาจทำได้ยากหากเอกสารมีความซับซ้อนหรือทางเทคนิค นอกจากนี้ การสรุปเอกสารที่ยาวอาจใช้เวลานานเนื่องจากคุณต้องอ่านและวิเคราะห์ข้อความอย่างละเอียดถี่ถ้วนเพื่อให้แน่ใจว่าข้อมูลสรุปมีความถูกต้องและสมบูรณ์
แม้ว่าวิธีการเหล่านี้จะช่วยให้คุณโต้ตอบกับ LLM และสรุปเอกสารขนาดยาวได้อย่างยืดหยุ่น แต่บางครั้งคุณอาจต้องการเร่งกระบวนการโดยใช้วิธีเปิดเครื่องหรือการสร้างไว้ล่วงหน้า ซึ่งเป็นที่ที่ไลบรารี เช่น LangChain นำมาใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับการรองรับ LangChain ใน Vertex AI