Использование генерации контента Reddit и получение информации о процессе разработки

С момента своего выпуска в ноябре 2022 года ChatGPT добился быстрого роста, побив рекорды самой быстрорастущей пользовательской базы. Разработчики с нетерпением ожидали появления официального API для создания приложений с использованием этой мощной технологии.

OpenAI недавно представил GPT-4, который включает в себя визуальный ввод, повышенную точность и более крупные контекстные окна. В этой статье вы найдете ценную информацию и начальный набор для экспериментов с GPT. Должно быть легко обновиться, чтобы использовать большие контекстные окна и потенциально читать содержимое изображений.

Чтобы лучше понять работу с большими языковыми моделями (LLM), я применил два подхода к обучению: создание проекта и обучение других.

В этой статье я делюсь своим опытом создания сводника потоков Reddit с использованием Python, Streamlit, PRAW (Python Reddit API Wrapper) и ChatGPT API. Я обсуждаю ключевые выводы, делюсь кодом и предлагаю идеи для приложений. Несмотря на то, что требуются базовые знания в области кодирования, любой должен быть в состоянии понять эти статьи.

14 марта 2023 года я загрузил на YouTube видео, сопровождающее эту статью:

Краткая история

Несмотря на мой опыт работы с большими языковыми моделями, я все еще поражен прогрессом, достигнутым в 2023 году. ИИ стал участвовать в самом коде и внес свой вклад в такие статьи, как эта.

Изначально я планировал создать инструмент суммирования в течение дня или двух и завершить его после выпуска API. Однако по мере того, как я изучал передовые методы, такие как рекурсивное суммирование, возможности расширялись. Я закрыл его и сохранил остальное для последующей статьи.

Идея возникла в результате экспериментов с Retrieval Augmented Generation (RAG), техникой, которая добавляет контекст к текстовым подсказкам. Я обнаружил, что RAG может создавать впечатляющие сводки из веток комментариев, что побудило меня рассмотреть возможность автоматизации этого процесса для Reddit.

Функции

Этот сумматор предлагает несколько примечательных особенностей:

  • Пользователи могут вставить URL-адрес темы Reddit для создания сводок.
  • Создано с помощью Streamlit, популярной платформы приложений, которая позволяет создавать легкие приложения на основе Python с интуитивно понятным пользовательским интерфейсом и пользовательским интерфейсом.
  • Использует строгую типизацию, вдохновленную TypeScript.
  • Включает в себя надлежащие реализации ведения журнала, присоединения отладчика, конфигурации и загрузчиков среды.
  • Содержит функции для обработки контекста в скользящем окне и эффективные методы суммирования длинных текстов.
  • Разработан для совместимости с будущими моделями, облегчая расширение контекстных окон. Масштабируйтесь, когда новые технологии появляются в сети.
  • В этом проекте также используется черный для форматирования кода и pylint для линтинга.

Хотя приложению не требуются текстовые модели, ориентированные на чат, достаточно стандартного завершения. Во второй части я планирую написать инструмент семантического поиска на основе чата для Reddit, используя Pinecone.

Мотивация

Основная мотивация создания Reddit Thread Summarizer проистекает из современной эпохи информационной перегрузки и необходимости эффективных способов потребления контента. Будучи энтузиастом Reddit, я часто тратил много времени на просмотр длинных тем, чтобы извлечь наиболее актуальную и ценную информацию. Этот трудоемкий процесс привел меня к изучению возможности создания собственного сводника потоков Reddit с использованием передовых методов обработки естественного языка.

Кроме того, я был особенно заинтригован концепцией расширенной генерации поиска (RAG), которая сочетает в себе сильные стороны моделей поиска и генерации для создания контекстуально богатых и точных сводок. Мое любопытство к RAG было вызвано возможностью использовать менее распространенные источники данных для улучшения процесса обобщения, что в конечном итоге привело к разработке этого приложения.

По сути, Reddit Thread Summarizer предназначен не только для экономии времени и усилий пользователей, но также служит для исследования передовых технологий искусственного интеллекта и их практического применения в области обобщения контента и извлечения информации.

Токены GPT и контекстные окна

Токен в моделях GPT — это наименьшая единица текста, которую модель может обработать. Токены могут состоять из одного символа или состоять из одного слова или более, в зависимости от языка и используемого токенизатора. Количество токенов в данном тексте влияет на способность модели понимать и генерировать соответствующие ответы.

Контекстные окна являются важным аспектом моделей GPT, определяя количество токенов, которые модель может учитывать одновременно при обработке текста. Размер контекстного окна напрямую влияет на способность модели понимать и генерировать более длинные и более контекстуально точные выходные данные.

В таблице ниже показаны размеры окна контекста для различных моделей GPT, включая модели GPT-4 с размерами окна контекста 8 КБ и 32 КБ.

Модель GPT-4 с размером окна контекста 8 КБ будет иметь значительно большую способность обрабатывать текст по сравнению с GPT-3. Этот увеличенный размер контекстного окна позволит модели понимать и генерировать более сложные и согласованные выходные данные, особенно для более длинных текстов. Возможность захватить больше контекста потенциально может привести к повышению производительности в таких задачах, как обобщение, перевод и написание эссе.

Модель GPT-4 с размером контекстного окна 32 КБ представляет собой значительный скачок в возможностях языковой модели. Благодаря способности обрабатывать даже более длинные тексты эта модель отлично подходит для задач, требующих существенного контекста, таких как написание целых статей, понимание и обобщение больших документов или предоставление подробных ответов в задачах на ответы на вопросы. Однако увеличенный размер окна контекста также может привести к более высоким вычислительным требованиям и затратам. По мере совершенствования моделей и увеличения размеров контекстных окон мы можем ожидать повышения производительности в различных языковых задачах, от написания связного и контекстуально точного текста до предоставления более эффективных решений в приложениях для обработки естественного языка.

Извлечение дополненной генерации

Retrieval-Augmented Generation (RAG) — это метод обработки естественного языка, который сочетает в себе сильные стороны моделей поиска и генерации. RAG использует модель поиска для извлечения релевантной информации из большого текстового корпуса, а затем использует модель на основе генерации для получения ответа, адаптированного к вводу пользователя. В моем приложении мы используем
PRAW: Python Reddit API Wrapper для извлечения контента из тем Reddit, который используется для дополнения запроса ChatAPI через пользовательский интерфейс Streamlit.

Усовершенствованная генерация расширенного поиска с помощью GPT-4

Появление GPT-4 открыло новые двери для области поискового расширенного поколения (RAG). Благодаря расширенным размерам контекстных окон и возможности включать визуальные входные данные GPT-4 может генерировать еще более полные и точные сводки, используя более широкий спектр информации.

GPT-4 и визуальные входы

Способность GPT-4 обрабатывать визуальные входные данные открывает для RAG новое измерение. Включая изображения и другие визуальные данные вместе с текстом, GPT-4 может генерировать сводки, которые учитывают весь контент ветки Reddit, включая сообщения и комментарии на основе изображений.

Например, если ветка Reddit содержит инфографику или мем, GPT-4 может проанализировать визуальный контент и включить соответствующую информацию в сводку. Это приводит к сводкам, которые лучше отражают суть темы, делая их более информативными и привлекательными для пользователей.

Большие контекстные окна

Большие контекстные окна GPT-4 позволяют генерировать более точные и последовательные сводки, особенно для более длинных потоков. Обрабатывая одновременно больше токенов, GPT-4 может лучше понимать взаимосвязь между различными частями потока, что приводит к более контекстуально точным сводкам.

Как показано в таблице в оригинальной статье, модели GPT-4 с размерами окна контекста 8 КБ и 32 КБ могут обрабатывать значительно больше токенов, чем предыдущие модели, что означает, что они могут понимать более длинные потоки и генерировать для них более точные сводки.

Улучшенное рекурсивное суммирование

Более крупные контекстные окна GPT-4 также могут улучшить технику рекурсивного суммирования, используемую в приложении Reddit Thread Summarizer. Принимая во внимание больше контекста в каждой итерации, GPT-4 может генерировать более связные и точные сводки, даже если входной текст разбит на более мелкие фрагменты.

Кроме того, расширенные возможности GPT-4 могут снизить потребность в нескольких итерациях рекурсивного суммирования, потенциально повышая эффективность процесса суммирования.

Начало работы с Reddit Thread Summarizer

Клонирование репозитория

Установка зависимостей

  • приложение использует Поэзию для управления зависимостями, после установки вы можете просто запустить poetry install известные зависимости, включая openai, streamlit и praw

Настройка переменных среды (ключ OpenAI API, учетные данные Reddit API)

  • см. ниже и env.example

Запуск приложения локально

  • беги streamlit run app/main.py

Настройка суммировщика

Разверните настройки, щелкнув панель «Редактировать настройки» (со стрелкой вниз), чтобы установить длину токена фрагмента (количество токенов, которое будет выбрано из потока Reddit), следующая сводка будет включать сводку последнего поколения. и следующее количество токенов n, поэтому следующий фрагмент, поэтому окончательное поколение будет максимальной длиной токена модели минус сколько токенов, которые вы выбрали из кусков + длина инструкций. Примечание: как только окна контекста 8k и 32k станут доступны, вы можете настроить эти значения, возможно, вам нужна только одна сводка с большим контекстом.

Конфигурационный файл

разбивка файла конфигурации app/config.py, чтобы помочь вам понять его назначение и принцип работы.

Файл конфигурации содержит основные настройки и параметры приложения, такие как параметры модели GPT, параметры отладки и значения по умолчанию. Эти параметры можно легко изменить, изменив значения в файле конфигурации, что позволяет более индивидуально настроить пользовательский интерфейс.

Ключевые компоненты

Класс ConfigVars: класс ConfigVars представляет собой TypedDict, который представляет собой словарь с предопределенным набором ключей и связанных типов значений. Это гарантирует, что переменные конфигурации строго типизированы, и снижает вероятность ошибок. Некоторые известные переменные конфигурации включают в себя:

  • DEFAULT_GPT_MODEL: Модель GPT, используемая для обобщения (например, «gpt-3.5-turbo»).
  • DEFAULT_NUMBER_OF_SUMMARIES: количество сводок, создаваемых приложением по умолчанию (например, 3).
  • DEFAULT_MAX_TOKEN_LENGTH: максимальное количество токенов, разрешенное для модели GPT (например, 4096).
  • REDDIT_URL: URL-адрес темы Reddit, для которой нужно обобщить.

Класс ConfigLoader: класс ConfigLoader загружает переменные конфигурации, определенные в ConfigVars. Он содержит переменную класса CONFIG_VARS, которая содержит словарь параметров конфигурации. Метод класса get_config() возвращает этот словарь, делая его доступным для других частей приложения.

  • with_config Decorator: декоратор with_config — это функция, которая внедряет переменные конфигурации в другие функции. Обертывая функцию этим декоратором, параметры конфигурации становятся доступными внутри функции без необходимости явной передачи их в качестве аргументов.

Загрузчик переменных среды

Файл app/env.py отвечает за управление переменными среды приложения, которые необходимы для подключения к OpenAI API и Reddit. Он гарантирует наличие и правильную загрузку всех необходимых ключей и учетных данных API.

Ключевые компоненты

  1. EnvVars: это класс, представляющий определение типа для переменных конфигурации, таких как ключ API OpenAI, идентификатор клиента Reddit и пользовательский агент Reddit.
  2. EnvVarsLoader: этот класс отвечает за загрузку переменных среды из файла .env. Он содержит метод с именем load_env(), который считывает переменные и возвращает словарь, содержащий учетные данные.

Процесс

  1. Метод load_env() проверяет, были ли ранее загружены переменные окружения. Если да, он возвращает существующие переменные.
  2. Если переменные не были загружены, он пытается загрузить файл .env. Если файл отсутствует, он выдает ошибку и просит пользователя создать его.
  3. Затем метод извлекает значения ключа API OpenAI, идентификатора организации и учетных данных Reddit из файла .env. Он проверяет, отсутствуют ли какие-либо из этих значений, и если да, то выдает ошибку.
  4. Если присутствуют все значения, метод создает словарь, содержащий переменные среды, и сохраняет его в атрибуте _env_vars класса EnvVarsLoader.

Бонусный скрипт: рекурсивное суммирование

Скрипт импортирует необходимые модули, устанавливает константы и инициализирует модель GPT-3 и параметры ограничения скорости. Он определяет несколько служебных функций для чтения и записи текстовых файлов, а также основные функции суммирования: recursive_summarization, summarize_text и cleanup_summary.

Основные понятия

  1. Рекурсивное суммирование: функция recursive_summarization является ядром этого скрипта, использующего GPT-3 для итеративного создания сводок. Функция принимает три параметра: summary_size, chunk_text и prefix_text. Он создает сводную строку с заданными параметрами, а затем отправляет ее в качестве приглашения модели GPT-3. Этот процесс повторяется для каждого фрагмента текста, в результате чего получается сводная версия всего входного текста.
  2. Скользящие окна: функция summarize_text использует метод скользящего окна, чтобы разбить входной текст на управляемые фрагменты, каждый из которых передается функции recursive_summarization. Этот метод позволяет сценарию эффективно обрабатывать большие объемы текста, поскольку каждый фрагмент обрабатывается и обобщается отдельно перед объединением в окончательный вывод.
  3. Сводка по очистке: функция cleanup_summary — это дополнительный шаг, который уточняет сгенерированную сводку с помощью GPT-3. Он направлен на улучшение согласованности и форматирования резюме путем очистки от любой тарабарщины или плохого форматирования, гарантируя, что окончательный результат будет более отточенным и читабельным.

Прохождение кода

  • Сценарий начинается с импорта необходимых модулей и настройки констант, ограничения скорости и конфигураций API GPT-3.
  • Вспомогательные функции load_text_file и write_text_file обрабатывают чтение и запись текстовых файлов, позволяя сценарию взаимодействовать с входными и выходными файлами.
  • Функция recursive_summarization выполняет основной процесс суммирования с использованием GPT-3, принимая во внимание желаемый размер сводки и любой текст префикса.
  • Функция summarize_text разбивает входной текст на фрагменты, используя метод скользящего окна, и итеративно вызывает функцию recursive_summarization для создания сводки.
  • Функция cleanup_summary отвечает за уточнение сгенерированного резюме и улучшение его согласованности и форматирования.
  • Наконец, сценарий загружает входной текст, генерирует сводку, очищает ее и записывает вывод в файл.

Оценка качества суммирования

Для субъективной оценки согласованности, релевантности и информативности я обнаружил, что результаты оказались на удивление хорошими, но, как и во всем, что связано с GPT, мы испытываем галлюцинации, а использование Reddit в качестве источника контента иногда приводит к тому, что комментарии троллей интерпретируются как факты. . Мы должны использовать более объективные показатели, такие как баллы ROUGE или BLEU. Качество сводки можно улучшить, изменив настройки, инструкции и т. д.

Проблемы

  • Я был разочарован отсутствием заглушек типов для пакета Python OpenAI и оболочки PRAW Reddit, функции завершения возвращают сложные типы, ИМХО более сложные, чем они должны быть.
  • Во время разработки Reddit падал несколько раз, что очень неприятно, убедитесь, что ваши источники контента надежны.
  • Я действительно хотел добавить кнопку копирования и вставки в Streamlit, но это оказалось неоправданно сложно, я бы хотел, чтобы они добавили эту функцию, довольно важную для такого приложения, они все еще могут быть способами сделать это, но я был удивлен не было хороших готовых решений.
  • Стоит попробовать поэкспериментировать с моделями текстовых инструкций, такими как davinci-003, на самом деле я получил лучшие результаты с некоторыми инструкциями, но стоимость выше. (tldr, chatGPT не всегда лучше)

Будущая работа и улучшения

  • Интеграция моделей GPT-4 для повышения производительности суммирования. Если у вас есть доступ к API, вы можете использовать более длинные контекстные окна уже сегодня. Запишитесь в лист ожидания здесь: https://openai.com/waitlist/gpt-4
  • Создание инструмента семантического поиска на основе чата для Reddit с использованием Pinecone или других передовых методов.
  • Добавление поддержки для обобщения других типов контента, таких как новостные статьи или сообщения в блогах.
  • Изучение дополнительных методов НЛП для улучшения качества итогов, таких как абстрактные и экстрактивные методы.

Заключение

Обобщитель Reddit — это приятный и практичный инструмент, который генерирует сводки сообщений Reddit с использованием GPT. Это может помочь пользователям сэкономить время, открыть для себя новые темы и улучшить свои навыки письма. Если вы хотите попробовать средство суммирования, посетите https://github.com/seandearnaley/reddit-gpt-summarizer и следуйте инструкциям.

Этот код демонстрирует мощь моделей OpenAI GPT в создании кратких и последовательных сводок больших текстовых входов. Используя методы рекурсивного суммирования и скользящего окна, мы можем эффективно обрабатывать и суммировать большие объемы текста, что делает его ценным инструментом для различных задач обработки естественного языка.

Интеграция GPT-4 в приложение Reddit Thread Summarizer может значительно повысить его производительность и возможности. Используя способность GPT-4 обрабатывать визуальные входные данные и более крупные окна контекста, приложение может генерировать более полные и точные сводки для потоков Reddit, что делает его еще более ценным инструментом для пользователей.

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

Я надеюсь, что вам понравится использовать сводку, и вы можете поделиться своими отзывами и предложениями со мной. Спасибо за чтение!