Вам когда-нибудь приходилось читать множество документов только для того, чтобы быть в курсе последних событий по теме? Возможность быстро обобщать документы — это одна из задач, которую вы можете выполнить с минимальными усилиями благодаря нашей библиотеке.

В этом посте мы покажем вам, как легко суммировать содержимое веб-страниц с помощью unstructured, langchain и OpenAI.

Весь приведенный ниже код можно найти в следующей блокноте Colab.

Подготовка информации

Прежде всего вам понадобится способ извлечения или загрузки содержимого веб-страницы, и для этой цели мы будем использовать класс UnstructuredURLLoader из langchain. Эта функция возвращает загрузчик, и после вызова .load()вы получаете элементы, которые затем можно отфильтровать, оставив только полезную информацию, удалив код JS и нерелевантный контент из HTML. Итак, определяем функцию generate_document:

from langchain.document_loaders import UnstructuredURLLoader
from langchain.docstore.document import Document
from unstructured.cleaners.core import remove_punctuation,clean,clean_extra_whitespace
from langchain import OpenAI
from langchain.chains.summarize import load_summarize_chain
def generate_document(url):
 "Given an URL, return a langchain Document to futher processing"
 loader = UnstructuredURLLoader(urls=[url],
 mode="elements",
 post_processors=[clean,remove_punctuation,clean_extra_whitespace])
 elements = loader.load()
 selected_elements = [e for e in elements if e.metadata['category']=="NarrativeText"]
 full_clean = " ".join([e.page_content for e in selected_elements])
 return Document(page_content=full_clean, metadata={"source":url})

Мы просто сохраняем NarrativeTextelements и используем чистящие кирпичи для удаления странных символов и другого бесполезного контента. Последняя часть функции создает Documentобъект из langchain для хранения всего полученного контента.

Создание конвейера суммирования

Следующим шагом является создание конвейера для приема документов, разбиение их на части для подачи языковой модели, вызов API OpenAI, получение результата и его сохранение. Похоже, много работы? Абсолютно нет, это всего лишь небольшая функция благодаря langchain:

def summarize_document(url,model_name):
 "Given an URL return the summary from OpenAI model"
 llm = OpenAI(model_name='ada',temperature=0,openai_api_key=openai_key)
 chain = load_summarize_chain(llm, chain_type="stuff")
 tmp_doc = generate_document(url)
 summary = chain.run([tmp_doc])
 return clean_extra_whitespace(summary)

По сути, мы создаем llmobject для вызова API (с моделью «Ada») и используем сгенерированные нами документы, получая результат из модели.

И это все! В обмен на эту функцию мы собираемся получить сводку для каждого URL-адреса, который мы передаем.

Одним из преимуществ нашего инструмента является то, что вы можете отправить меньшее количество токенов в OpenAPI, сэкономив на биллинге, а не отправлять весь HTML-контент страницы (но, иногда это невозможно сделать, так как текущие модели имеют ограничения на количество токенов Вы их отправляете). Также полезно знать, что у нас есть множество кирпичей разделения, чтобы подготовить ваши данные для такого рода задач, поэтому вы можете использовать весь потенциал этих LLM без особых усилий. PDF-файлы, DOCX-файлы, электронные письма… что угодно!

Советы

  • Вы, вероятно, захотите использовать механизм для хранения ранее обобщенной информации, чтобы не перерабатывать URL-адреса. Для этого в блокноте Colab мы используем cachier.
  • Доступны и другие поставщики LLM. Дополнительную информацию см. в langchaindocs.

Первоначально опубликовано на https://medium.com 24 июля 2023 г.