GPT-4 добавляем новые знания: Git репозиторий

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

GPT-4 позволяет достаточно просто писать boilerplate код с использованием различных языков, технологий и библиотек. Но, есть небольшая проблема, данные GPT-4 не совсем актуальные и ограничены серединой 2021 года.

А что если мы хотим использовать свежие библиотеки: новые или последние версии, которые сильно изменились с 2021 года. Если говорить про приватные репозитории, то данные этих репозиториев не были использованы для обучения GPT-4. Зачастую приватные репозитории хуже документированы и могут быть достаточно объемными - в общем черт ногу сломит, чтобы понять, что там к чему.

Обучается потихоньку
Обучается потихоньку

Проблема ясна, надо как то решать, потому что работать по-старому совсем не хочется. Уже привык, что можно достаточно просто попросить объяснить и сгенерировать код, пускай даже достаточно простого и можно сказать примитивного, но этого зачастую хватает, чтобы быстро понять как можно сделать задачу или найти нужную информацию. Также хочется получать обобщенную информацию или код по нескольким источникам (например добавить функциональность в UI, backend и базу данных).

Ищем решение

Чтобы решить задачу, нам надо понять какие варианты решения у нас есть.

Первый вариант, мы можем обучить свою большую языковую модель на своих данных. Выглядит достаточно тяжело, долго и дорого. Недавно попалась статья про обучение модели 1.7B параметров, использовали 110GPU в течение 45 дней. Один GPU насколько я понимаю стоит от 10k$, да и модель хочется побольше, ну хотя бы 175B :)

Второй вариант, мы можем дообучить существующую языковую модель, обогатив её знания нашими данными. Вариант, сильно проще, чем делать все заново. Но насколько я понимаю это тоже не совсем тривиально и вроде это не совсем правильно, так как так называемый fine tunning предполагает добавление нового поведения в модель, а не обогащение новыми знаниями. Стоит отметить, что если мы дообучаем OpenAI модель, то мы можем использовать только модели предыдущих поколений (davinci, ada и тд), а они сильно уступают новым GPT-4 и GPT-3.5, к тому же предыдущее поколение достаточно дороги, если сравнивать с GPT-3.5. В общем хочется попробовать, но этот вариант пока не выглядит как самый очевидный.

Третий вариант - наш победитель.
Мы можем передать интересующую нас информацию как контекст в запрос. Контекст имеет ограниченный размер (подробнее можно почитать в моей прошлой статье - https://habr.com/ru/articles/727458/) Из-за ограничения контекста мы не сможем передать в контекст целый репозиторий, так как он понятное дело сильно больше.

Но мы можем передавать связанную с запросом информацию в контексте запроса. Например текст запроса будет выглядеть следующим образом:

Используй следующую информацию, чтобы помочь пользователю с его запросом:
{Документация по классу}
{Исходный код класса}
{Примеры использования класса}
User:
Сгенерируй наследника класса BabyAGI, добавь возможность запроса у пользователя, нужно ли продолжать выполнение задач при достижении лимитов на количество выполненных задач.

В этом случае мы можем использовать как GPT-3.5 модель (если хотим подешевле и ограничение его контекста нас устраивает - 4к токенов). Или можем использовать GPT-4, сильно дороже, но контекст уже до 32к токенов.

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

Тут нам на помощь приходит семантический поиск и так называемые embeddings.
Сначала нам нужно понять, что это такое и как это работает.

Минутка определений

Спросим GTP-4, что такое семантический поиск:

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

Что такое векторное представление (embeddings):

Векторное представление (embeddings): Это метод преобразования объектов, таких как слова, фразы или тексты, в числовые векторы в многомерном пространстве. Этот подход позволяет компактно кодировать семантическую и синтаксическую информацию, делая текстовые данные доступными для анализа и обработки с помощью моделей машинного обучения и обработки естественного языка. Векторные представления облегчают извлечение закономерностей и определение сходства между различными объектами, что способствует созданию более мощных и интуитивных алгоритмов.

Алгоритм

  • подготовка данных для семантического поиска

    • разбиваем наш текст, документ, репозиторий на части определенного размера, не очень большого, чтобы несколько частей можно было добавить в контекст запроса

    • для каждой такой текстовой части получаем её векторное представление

    • сохраняем вектор и текст в базу данных, которая поддерживает поиск с использованием векторов

Пока AI не научился генерировать подобные диаграммы, сильно жду.
Пока AI не научился генерировать подобные диаграммы, сильно жду.
  • обработка пользовательского запроса

    • пользователь вводит запрос

    • получаем вектор для пользовательского запроса

    • получаем из базы данных релевантные тексты с использованием вектора для запроса

    • добавляем полученные из базы данных тексты в контекст запроса

В целом выглядит не сложно
В целом выглядит не сложно

Применение

Давайте перечислю несколько вариантов применения данного подхода для решения разных задач.

Вопросы по большим документам.
Векторизуем документ по частям, выясняем какие части документа относятся к запросу и добавляем их в запрос.

Память в чатах.
При превышении размера контекста, можно векторизовать сообщения пользователя и ответы чата. Затем добавляем в контекст релевантные сообщения для последнего запроса пользователя. Получается, что мы можем поддержать достаточно длительные беседы. Возможно именно таким образом работает веб версия ChatGpt, который позволяет не только спроектировать системы, но и делать реализацию в рамках одного чата, практически не теряя контекста предыдущей сообщений.

Поиск Bing.
Здесь мы можем векторизовать не только переписку, но и данные которые получили при поиске в интернете, а потом релевантные данные передать на вход языковой модели.

Поиск по личной/приватной библиотеке.
У меня лежит около 1TB данных: куча книг, статей, курсов, видео. Все это можно векторизовать и потом запрашивать необходимые данные. Как векторизовать видео? Получаем текст из видео и этот текст векторизуем. В метаданные записи указываем источник - видео файл.

Поиск по приватным/корпоративным базам знаний (репозитории, система документооборота, система документации: Notion, Confluencе и тд).
Просто все векторизуем.

Надо отметить, скорее всего необходимо использовать разные индексы для разных типов данных (память в чатах, документация, исходный код, полученные данные из интернета). Разные индексы позволят замешать правильный коктейль в контекст, чтобы не было перекосов в сторону одного источника данных. Можно добавить еще классический map-reduce, чтобы понять какую именно информацию стоит добавлять в контекст к запросу в случае если релевантных документов слишком много.

Можно сказать, что векторное преобразование и семантический поиск, позволяют достаточно просто реализовать существующий вариант поиска. Например: запрос в гугл -> список статей, запрос в gmail -> список писем.
Но в данном случае мы передаем релевантные документы или их части в языковую модель, чтобы она сделала магию и ответила на наш вопрос с использованием найденных документов.

Что будем векторизовать и спрашивать

С теорией разобрались, но хочется это попробовать руками и посмотреть на результат.

В качестве подопытного взял репозиторий langchain - https://github.com/hwchase17/langchain

Источник: https://habr.com/ru/articles/731056/


Интересные статьи

Интересные статьи

В 1900 году водолаз Элиас Стадиатис, облачённый в медно-латунный шлем и брезентовый костюм, появился из моря, трясясь от страха и бормоча о «куче мёртвых голых людей». Элиас был одним из греческих в...
Если помните, недавно мы рассказывали о том, как специалисты нашего экспертного центра безопасности (PT Expert Security Center, PT ESC) обнаружили новую, ранее неизвестную APT-группировку, получившую ...
На днях мы продолжили делиться на Хабре нашими открытыми проектами, поговорили о проблемах, связанных с продвижением технологических продуктов, и начали обсуждать исследование «публичного образа» Санк...
Raspberry Pi Pico — отличная плата, хотя и с урезанными возможностями. В целом, ей не хватает двух ключевых функций. Первая — это кнопка reset, которую, впрочем, можно без проблем добав...
Вышла новая версия Acronis True Image — системы защиты данных для персональных пользователей. И мы хотим рассказать о том, чем True Image 2020 отличается от True Image 2019. Всех, кому интересно,...