1. Введение
Резюмирование текста — это процесс создания сокращенной версии текстового документа с сохранением важной информации. Этот процесс можно использовать для быстрого просмотра длинного документа, определения сути статьи или для предоставления краткого содержания пользователям. Хотя резюмирование короткого абзаца — задача нетривиальная, существует несколько трудностей, которые необходимо преодолеть, если вы хотите резюмировать большой документ. Например, PDF-файл, содержащий несколько страниц.
В этом практическом занятии вы узнаете, как использовать генеративные модели для составления кратких обзоров больших документов.
Что вы построите
В этом уроке вы узнаете, как использовать генеративные модели для обобщения информации из текста, рассмотрев следующие методы:
- Начинка
- MapReduce
- MapReduce с перекрывающимися блоками
- MapReduce с скользящим итогом
2. Требования
3. Расходы
В этом руководстве используется Vertex AI Generative AI Studio как платный компонент Google Cloud.
Узнайте о ценах на Vertex 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 перезапустить терминал можно с помощью кнопки вверху.
- Аутентифицируйте свою среду ноутбука одним из следующих способов:
- В Colab раскомментируйте следующую ячейку.
from google.colab import auth
auth.authenticate_user()
- Инструкции по установке Vertex AI Workbench см. в соответствующем разделе.
- Для инициализации SDK Vertex AI необходимо импортировать библиотеки.
- Для импорта библиотек в 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. Способ начинки
Простейший способ передать данные языковой модели — это «вставить» их в подсказку в качестве контекста. Это включает в себя всю необходимую информацию из подсказки и в том порядке, в котором вы хотите, чтобы модель её обработала.
- Извлеките текст только со второй страницы 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 Запрос содержит недопустимый аргумент , поскольку извлеченный текст слишком длинный для обработки генеративной моделью.
Чтобы избежать этой проблемы, необходимо ввести фрагмент извлеченного текста, например, первые 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 с скользящим суммированием — в другом практическом занятии.
Составление краткого изложения длинного документа может быть сложной задачей. Для этого необходимо определить основные моменты документа, обобщить информацию и представить её в сжатой и связной форме. Это может стать трудным, если документ сложный или технический. Кроме того, составление краткого изложения длинного документа может занять много времени, поскольку необходимо внимательно прочитать и проанализировать текст, чтобы убедиться в его точности и полноте.
Хотя эти методы позволяют взаимодействовать с LLM-библиотеками и гибко резюмировать длинные документы, иногда может потребоваться ускорить процесс, используя метод начальной загрузки или готовые методы. Именно здесь на помощь приходят такие библиотеки, как LangChain. Узнайте больше о поддержке LangChain на Vertex AI .