1. מבוא
סיכום טקסט הוא תהליך של יצירת גרסה קצרה יותר של מסמך טקסט, תוך שמירה על מידע חשוב. אפשר להשתמש בתהליך הזה כדי לסרוק במהירות מסמך ארוך, לקבל את הרעיון המרכזי של מאמר או לשתף סיכום עם משתמשים. למרות שסיכום של פסקה קצרה הוא משימה לא פשוטה, יש כמה אתגרים שצריך להתמודד איתם אם רוצים לסכם מסמך ארוך. לדוגמה, קובץ PDF עם כמה דפים.
ב-Codelab הזה תלמדו איך להשתמש במודלים גנרטיביים כדי לסכם מסמכים ארוכים.
מה תפַתחו
במדריך הזה תלמדו איך להשתמש במודלים גנרטיביים כדי לסכם מידע מטקסט, באמצעות השיטות הבאות:
- מלית (סטאפינג)
- מיפוי וצמצום
- מיפוי וצמצום עם נתחים חופפים
- מיפוי וצמצום עם סיכום מתגלגל
2. דרישות
3. עלויות
במדריך הזה השתמשנו ב-Vertex AI Generative AI Studio כרכיב של Google Cloud, והשימוש בו כרוך בתשלום.
אתם יכולים לקרוא על התמחור של Vertex AI ועל התמחור של AI גנרטיבי, ולהשתמש במחשבון עלויות כדי ליצור הערכת עלות על סמך השימוש הצפוי.
4. תחילת העבודה
- מתקינים את 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, אפשר להפעיל מחדש את הטרמינל באמצעות הלחצן בחלק העליון.
- מאמתים את סביבת ה-notebook באחת מהדרכים הבאות:
- ב-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")
- יוצרים תבנית להנחיה שאפשר להשתמש בה בהמשך ב-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:
"""
- משתמשים במודל שפה גדול (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 Request contains an invalid argument (בקשה מכילה ארגומנט לא תקין) כי הטקסט שחולץ ארוך מדי בשביל שהמודל הגנרטיבי יוכל לעבד אותו.
כדי להימנע מהבעיה הזו, צריך להזין חלק מהטקסט שחולץ, למשל, 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. מזל טוב
מעולה! סיכמת בהצלחה מסמך ארוך. למדתם על שתי שיטות לסיכום מסמכים ארוכים, וגם על היתרונות והחסרונות שלהן. יש כמה שיטות לסיכום מסמכים ארוכים. ב-codelab אחר מוסברות 2 שיטות נוספות – MapReduce עם נתחים חופפים ו-MapReduce עם סיכום מתגלגל.
סיכום של מסמך ארוך יכול להיות מאתגר. כדי להשתמש בו, צריך לזהות את הנקודות העיקריות במסמך, לחבר בין הנתונים ולהציג אותם בצורה תמציתית ועקבית. יכול להיות שיהיה קשה לעשות את זה אם המסמך מורכב או טכני. בנוסף, סיכום של מסמך ארוך יכול להיות תהליך ארוך כי צריך לקרוא ולנתח את הטקסט בקפידה כדי לוודא שהסיכום מדויק ומלא.
השיטות האלה מאפשרות לכם ליצור אינטראקציה עם מודלים של LLM ולסכם מסמכים ארוכים בצורה גמישה, אבל לפעמים כדאי להשתמש בשיטות של bootstrapping או בשיטות מוכנות מראש כדי להאיץ את התהליך. כאן נכנסות לשימוש ספריות כמו LangChain. מידע נוסף על תמיכה ב-LangChain ב-Vertex AI