Как BuzzFeed Tech совершенствует современные широкоязычные модели для своих экспериментов с контентом.

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

Но эти разговоры не ограничиваются кофейнями и обеденными столами; они также происходят в комнатах отдыха и на собраниях Zoom. Это вдвойне верно для BuzzFeed за последние пару лет, особенно прошлой осенью, когда мы значительно ускорили внедрение инструментов генеративного ИИ. Почему было ясно с самого начала — чтобы открыть новую эру творчества с людьми за рулем — но как остается открытой проблемой.

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

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

Точно так же плагины ChatGPT также обеспечивают новый способ взаимодействия и имеют дополнительное преимущество, заключающееся в создании нового канала распространения контента в семействе брендов BuzzFeed.

За последние месяцы мы получили удовольствие от решения новых интересных задач и накопили несколько уроков, которыми хотели бы поделиться с большим инженерным сообществом. Некоторые из этих проблем были связаны с ограничениями актуальности набора данных в OpenAI; наборы данных, используемые для обучения популярных готовых LLM, охватывают прошлое, а не настоящее, и не могут рассуждать о текущих событиях. Другими были проблемы с интерфейсом, такие как ограниченное окно контекста: как можно втиснуть десятилетия статей и рецептов в окно контекста токена 4k?

Ранние тесты

Наши ранние проекты — такие игры, как Under The Influencer и Infinity Quizzes — работали на ванильном ChatGPT v3.5 с тщательно продуманными подсказками. Некоторые из ограничений были очаровательны, но безобидны, например, неспособность выполнять элементарные арифметические действия. Другие ограничения были более значительными, например снижение производительности для системных подсказок, содержащих более 5 правил, из-за чего мы разбивали сложные инструкции на несколько вызовов API, используемых для информирования потока управления.

Фольгированный путь

Вдохновленные приемом этих ранних проектов, мы исследовали возможность размещения на собственном хостинге доработанных LLM, таких как FLAN-T5. Отчасти этот план имел смысл; такие инновации, как LoRA, сделали тонкую настройку LLM на наших данных разумным предложением. Но экономика самостоятельного хостинга — игра с тонкой маржой, которая может резко сократиться всякий раз, когда OpenAI делает объявление, — отправила нас обратно к чертежной доске.

Проблеск надежды

BFN Answering Machine, внутренний чат-бот со знанием последних статей BuzzFeed News, стремился устранить ограничение актуальности набора данных с помощью метода Semantic Search + LLM. Семантический [или основанный на встраиваниях] поиск включает в себя проецирование корпуса в векторное пространство и применение того же преобразования к поисковым запросам перед выполнением простого поиска ближайшего соседа для выявления совпадений.

Таким образом, после создания вложений для корпуса статей BuzzFeed News мы смогли выполнить поиск ближайшего соседа во встроенном представлении запроса пользователя с помощью nmslib. Включение первых k совпадений в подсказку, переданную в openai.Completion.create(), позволило автоответчику BFN авторитетно отвечать на вопросы о текущих событиях.

Производственная готовность

Семантический поиск стал победителем, но поскольку nmslib в блокноте Colab не был полностью готов к работе, мы приступили к работе над улучшением нашей архитектуры поиска ближайших соседей. Эта архитектура в течение многих лет обеспечивала персонализацию и рекомендации по контенту, но была явным приоритетом для включения семантического поиска во всех наших проектах генеративного ИИ. Предыдущая версия, поддерживаемая продуктом Matching Engine от Google, использовала внутренние микросервисы для встраивания контента (например, рецептов, статей) и преобразования результатов поиска в стандартный формат, используемый всеми приложениями.

Новая архитектура, управляемая событиями система на основе NSQ (основная технология в стеке BuzzFeed), вносит ряд улучшений в опыт разработчиков, производительность и экономическую эффективность. Пакетные конечные точки упрощают экспериментирование (например, создание новых больших индексов из записной книжки специалиста по данным) и повышают пропускную способность при рабочих нагрузках. Раздельный интерфейс для внутренних векторных баз данных позволил нам отказаться от Matching Engine для Pinecone, что позволило нам немедленно сэкономить на ежемесячном счете GCP.

Устранив эти опасения по поводу ограничения давности набора данных, мы поняли, что нам по-прежнему необходимо исправить окно ограниченного контекста.

Осторожно с открытым исходным кодом

В ходе нашего первого знакомства с генерацией, дополненной поиском, мы часами работали с LangChain, инфраструктурой, формализующей логику потока управления на основе ответов LLM на более простые подзапросы, и готовой реализацией Реакт.

ReAct объединяет рассуждения и действия, используя LLM для генерации как следов рассуждений, так и действий, специфичных для задачи, чередующимся образом. С готовой реализацией LangChain легко начать работу.

Мы увидели преимущества такого краткого представления, но в конечном итоге переросли философию LangChain «батареи включены». В частности,

  • Нам нужно было больше контроля над обработкой ошибок и инструментарием с помощью нашего инструментария метрик (например, сколько вызовов мы делаем в OpenAI).
  • Нам нужен был больший контроль над когда вызовами OpenAI.
  • Сбой LangChain, когда изученная эвристика (например, какой инструмент использовать в каком сценарии) противоречила предоставленным системным подсказкам.

Ролл с известными

Популярные проекты с открытым исходным кодом доминируют в этой области , и мы знаем, что просмотр исходного кода для заполнения пробелов в документации иногда является признаком того, что вы делаете ставку на правильную лошадку. Но после того, как мы изо всех сил пытались заставить LangChain работать на нас, мы (как и многие другие) решили отказаться от LangChain в пользу более простой собственной реализации, которую мы называем нативный ReAct из-за ее верности оригинальной статье. Это позволяет нам обрабатывать рассуждения и генерировать кандидаты внутри, в то же время используя модели OpenAI для фактического создания текста.

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

Большое спасибо Archi Mitra, Max Woolf и Clément Huyghebaert за их вклад в эту статью.