שיטות לסיכום טקסט באמצעות 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. מאמתים את סביבת ה-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 שהורדתם.

# 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 מכילה ארגומנט לא חוקי, כי הטקסט שחולץ ארוך מדי לעיבוד המודל הגנרטיבי.

כדי למנוע את הבעיה, צריך להזין מקטע מהטקסט שחולץ, למשל, 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 שיטות לסיכום מסמכים ארוכים, לצד היתרונות והחסרונות שלהם. יש כמה שיטות לסכם מסמכים גדולים. חפשו שתי שיטות נוספות – MapReduce עם מקטעים חופפים ו- MapReduce עם סיכום מתגלגל ב-Codelab אחר.

סיכום של מסמך ארוך יכול להיות מאתגר. היא דורשת מכם לזהות את הנקודות העיקריות במסמך, לחבר בין המידע ולהציג אותו באופן תמציתי ועקבי. הפעולה הזאת יכולה להיות קשה אם המסמך מורכב או טכני. בנוסף, סיכום של מסמך ארוך יכול לגזול הרבה זמן כי צריך לקרוא ולנתח את הטקסט בקפידה כדי לוודא שהסיכום מדויק ומלא.

השיטות האלה מאפשרות לקיים אינטראקציה עם מודלים גדולים של שפה ולסכם מסמכים ארוכים בצורה גמישה, אבל לפעמים ייתכן שתרצו לזרז את התהליך באמצעות אתחול או שיטות מוכנות מראש. כאן נכנסות ספריות כמו LangChain. מידע נוסף על תמיכה ב-LangChain ב-Vertex AI