Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
AI-хайп, честно говоря, слегка задолбал. Кажется, что все вокруг только и делают, что внедряют в продукт как можно больше AI фичей, поднимают миллионы на оболочку для ChatGPT, осваивают сто первый AI-тул и отдают свою работу роботам, а сами пьют лавандовый раф и делают подкасты про успешный успех. Все эти возвышенные презентации про amazing и awesome инновации от людей, которые слабо себе представляют, чем энкодер отличается от декодера и почему трансформеры в нейросетях не сражаются с автоботами, мало того, что набивают оскомину и отнимают время, так ещё и погружают в грёзы бизнес-руководителей и создают крайне завышенные ожидания.
Вспоминаю, как на одном обмене опытом со стартапами они чётко делились на 2 группы: первая – с менеджерами про невероятные инновации и всеобщее благоденствие, а вторая – с инженерами, которые с красными глазами рассказывали, что так и не смогли победить галлюцинации, что окно контекста заканчивается очень быстро и что для того, чтобы на нормальном продакшнене и вся эта магия заработала, нужны огромные инвестиции в инфраструктуру, оркестратор, агенты, векторные базы, кратковременную и долговременную память и так далее. Поэтому хотелось собрать в одном месте понятное руководство и для разработчиков, пробующих LLM-ки для своих задач, и для людей из бизнеса, чтобы погрузить в адекватный контекст.
Дисклеймер: изначально задача казалась простая: найти подходящие статьи и адаптировать, но оказалось, что всё это написано крайне криво и сухо, с кучей ненужных технических деталей или очень косноязычно, так что основа осталась в принципе из вот этой статьи, но она была переписана практически полностью.
Итак, поехали
Что такое LLM (Large Language Model или большая языковая модель)?
Большая языковая модель – это, грубо говоря, модель, обученная на больших наборах текстовых данных для понимания и генерации текста. По сути, это модель трансформера в больших масштабах. Сама модель трансформера, которую Google анонсировал 6 лет назад, это нейронная сеть с некоторыми замечательными свойствами, предназначенная для понимания контекста и смысла с помощью анализа отношений внутри данных. Вот её схема ниже. Выглядит страшно, но основные моменты обсудим дальше.
Трансформеры отлично подходят для LLM, потому что у них есть две важные функции: энкодинг позиции (position encoding) и само-внимание (self-attention).
Честно говоря переводить английские термины оказалась та ещё задача, но кажется, что это полезно из-за смысла, который они несут, позволяя глубже разобраться, что же это за зверь. И английский термин, и русский перевод вам пригодятся. Так как многие термины прорастают в русский из английских первоисточников, иногда фразы просто "нашлёпываются" на понятный более-менее всем смысл, но при этом то, что в русском языке есть вполне адекватная замена, забывается. И это приводит к постоянным "На прошлом митинге про метрики активейшена мы закоммитились релизнуть новый месседжинг для неконвертнувшихся юзеров" вместо "На последней встрече, где мы анализировали показатели активации, мы решили выпустить новую систему сообщений для пользователей, которые ещё не выполнили основное действие в продукте".
Position encoding (то есть кодирование не только самого слова, но и его места в тексте) помогает модели понять порядок слов в последовательности и включить эту информацию в векторные представления слов (эмбеддинги).
Немного про эмбеддинги. По сути это перевод текста в циферки, с которыми нейросети гораздо проще работать. Причем не просто 1, 2, 3, 4, 5, а определённое многомерное пространство (1536-мерное измерение, например, как вам такое), в котором близкие термины будут лежать рядышком.
Больше про кодировании позиции можно почитать в статье «Трансформеры с нуля». Там описано, что это сделано с помощью кругового смещения положения слов (картинка ниже). Звучит довольно сложно, но главное, что мы начинаем в этом многомерном пространстве видеть рядом не только похожие слова, но слова, которые чаще находятся рядом в предложении.
Self-attention (само-внимание) позволяет словам в последовательности взаимодействовать друг с другом и определять, на что в предложении стоит обратить больше внимания. Чтобы помочь вам лучше понять эту концепцию, я позаимствовал пример из статьи Джея Аламмара «Иллюстрированный трансформер»:
«Предположим, следующее предложение нам нужно перевести: "Животное не переплыло озеро, потому что оно было слишком уставшим". Что означает слово «оно» в этом предложении? Это относится к озеру или к животному? Это простой вопрос для человека, но не такой простой для алгоритма. Когда модель обрабатывает слово «оно», само-внимание позволяет ей связать «это» с «животным». Это даёт много дополнительной информации о смысле текста, разбираясь с синонимами, омонимами и прочими сложностями языка, о которых немало копий сломано компьютерными лингвистами.
Трансформеры используют мощный механизм внимания, известный как "многоголовое внимание" (multi-head attention). То есть мы несколько раз пытаемся определить связи между объектами языками и в итоге начинаем лучше его понимать. Этими двумя особенностями мы можем охватить различные аспекты языка и лучше понять, как разные сущности соотносятся друг с другом в определённой последовательности.
Если вас интересует наглядное руководство по изучению LLM и трансформеров, стоит изучить этот ресурс. Всё красиво, анимированно, понятно. Очень рекомендую!
Что могут LLM?
Возможности LLM огромны: от создания ИИ-помощников и чат-ботов до общения с вашими данными и расширения возможностей поиска. Вот несколько примеров:
ИИ-помощники
Рост мощи LLM привёл к разработке множества помощников с искусственным интеллектом, каждый из которых предназначен для конкретных задач, например, программирование, планирование работ, бронирование мест. Количество решаемых такими помощниками задачи и качество решений растёт реально каждый месяц. Примеры: Pi и собственно ChatGPT. Честно говоря, после урезанных возможностей голосовых ассистентов, типа Siri и Google Assistant, которые в итоге используются только чтобы поставить будильник или песню запустить, помощники на основе современных LLM – как глоток свежего воздуха и огромное множество вариантов применения даже для плохо сформулированных запросов.
Чат-боты
Вы можете создавать чат-ботов, адаптированных к конкретным задачам, например, отвечать на вопросы пользователей или клиентов, настраивая их на основе вашей документации и пользовательских данных. Здесь очень поможет технология RAG, о которой будет рассказано ниже.
Более того, у вас есть возможность разрабатывать чат-ботов, имитирующих речевые модели различных персонажей, например игровых персонажей или знаменитостей. Feature.ai — подходящий пример. Опять же все эти скриптованные последовательности, которые надо было выстраивать множеством if в чат-ботах уходят в прошлое. И мало того, можно и пиццу заказать, и за жизнь поговорить (правда, если у вас большая модель, но об этом тоже чуть позже).
Генерация контента
LLM обучены генерировать следующий фрагмент текста с учётом некоторого входного текста. Вы можете использовать их для написания историй, создания маркетингового контента или даже создания кода. Они отлично понимают, что будет дальше в тексте, что делает их удобными для выполнения самых разных письменных задач. Это та функция LLM, на которой большое количество людей творческих профессий слегка замешкалось, а самые умные стали зарабатывать в Х раз больше, заставляя LLM генерировать маркетинговые креативы, тексты, блогпосты, скрипты для интервью, стратегии компаний и прочее за копейки и секунды.
Перевод
LLM превосходно справляется с переводческими задачами, которые для них считаются относительно простыми. Они также могут выполнять более сложные задачи, такие как перевод текста в код. Если вы предоставляете пользователю инструкцию по созданию фрагмента кода на любом языке программирования, LLM сможет сгенерировать код для вас. Популярный пример такой модели — Code Llama . Я очень люблю сравнение сервисов переводов, которые делают Intento и их недавний отчет говорит, что GPT-3.5-Turbo сейчас самый дешевый способ качественного перевода текста (в сравнении с чисто специализированными API, типа Google Translate или Deepl), а GPT-4 обошёл многие языковые сервисы перевода, особенно на творческих текстах. Кажется, мы-таки приближаемся к возможности быстро понимать друг друга.
Резюмирование (саммаризация)
С помощью LLM вы можете создавать тексты, которые автоматически обобщают длинные документы, исследовательские работы, заметки и статьи со встреч, делая информацию более доступной. Это тоже кардинально меняет парадигму работы множества людей, которым не надо теперь читать 20-100 страничные отчеты или смотреть часовые видео, чтобы понять, что полезного там было на страничку или 5 минут. Закинул скрипт или документ в GPT-4-Turbo и получается отличный текст в том формате, который нужен: от ответов на вопросы в виде таблицы до списка основных тезисов.
Поиск
LLM отлично справляются с запросами на естественном языке. В отличие от простого поиска по ключевым словам, поисковые системы на базе LLM, такие как генеративный поиск с использованием искусственного интеллекта Google и Perplexity AI , предлагают более релевантные и контекстно-зависимые результаты. Опять же, по сравнению с кривыми способами определения, чего же конкретно хочет пользователей, на базе дотреннированных моделей, и всего ужаса ведения, обновления и поддержки этого проекта, вы можете просто описать, что может ваш поиск (набор фильтров и команд), и попросить определить, что же из этого попросил в своем запросе пользователь. Тру машин лёрнинг, само поймёт, чего сделать надо!
В общем, это всё – только верхушка айсберга; LLM предлагают гораздо больше возможностей, включая персонализацию, системы рекомендаций, создание любых текстов, игры и многое другое. Другой вопрос, что от прототипа на основе ChatGPT до продакшн системы ещё долгий путь, но то, что LLM существенно снизило порог входа в магию нейросетей – это факт.
Пробуем LLM
ChatGPT – лучший выбор для первых проб с LLM. Если раньше компании допиливали собственные варианты чего-нибудь компактного, вроде T5 от Google, то сейчас выбор по цене-качеству-скорости очевиден.
Однако, если вы являетесь поклонником решений с открытым исходным кодом, стоит посмотреть, что есть наиболее актуального на HuggingFace. Вы можете найти список LLM с открытым исходным кодом на Hugging Face в таблице лидеров Open LLM . Эти модели оцениваются с использованием платформы Eleuther AI Language Model Evaluation Harness , которая оценивает генеративные языковые модели для широкого круга задач.
Сейчас в лидерах всякие допилленые опен-сорсные версии Llama 2 от Меты (запрещённой в России, и это здорово. По сути бывшая соцсеть сотворила для LLM комьюнити в сотни раз больше ценности, чем "Открытая" OpenAI, и это похвально. Если вы хотите свою супер-безопасную и натреннированную под ваши задачи LLM-ку на собственных серверах, выбор очевиден. Llama-2 можно развернуть на своих GPU и даже на собственном компьютере, но учтите, что качества GPT-3.5 на всём спектре задач вы скорее всего не получите, лучше применять её точечно для конкретного набора и тщательно тестировать.
Важно отметить, что не все чат-боты или приложения используют одну и ту же LLM. ChatGPT использует модели серии GPT, а Google Bard в настоящее время работает на модели Gemini, но не во всех регионах. И всё это постоянно обновляется, поскольку новые, более эффективные модели постоянно обучаются на более крупных наборах данных и улучшенной архитектуре моделей.
Чем отличаются LLM?
Зачем вообще нам разные LLM? Не проще ли разработать одну, самую великую? К сожалению, мы ещё не достигли точки, когда мы можем полагаться на одну модель для всех задач. Достигнем ли мы когда-нибудь этой стадии, остаётся неясным. Тем не менее, сообщество активно работает над поиском лучших моделей для различных приложений, которые ещё и развиваются каждый день.
Вот основные различия между моделями:
Архитектура модели
LLM могут иметь различную архитектуру в зависимости от их целей, вычислительных ресурсов и задач обучения. Например:
Трансформер (Transformer) – базовая архитектура для многих современных моделей обработки естественного языка.
BERT (Bidirectional Encoder Representations from Transformers) – модель, которая смотрит на текст в обоих направлениях для лучшего понимания контекста.
GPT (Generative Pre-trained Transformer) – модель, предназначенная в первую очередь для генерации текста.
T5 (Text-to-Text Transfer Transformer) – модель, которая рассматривает все задачи обработки естественного языка как преобразование текста в текст.
Данные
Качество и объём обучающих данных различаются в зависимости от модели. Например, PaLM 2 использует в пять раз больше данных, чем его предшественник. Важно и качество данных: модель, обученная на данных, похожих на вашу доменную область, будет в разы лучше общей модели, например, речь про BloombergGPT.
Количество параметров
Большее количество параметров указывает на более мощную модель. Например, GPT-3 имеет 175 миллиардов параметров. Llama 2 от Meta включает модели с диапазоном от 7 до 70 миллиардов параметров. Чаще всего магия начинается от 30 миллиардов параметров, в которой модель начинает видеть взаимосвязи нашего окружающего мира, даже если каких-то фактов или идей не было в обучающем сете. Если модель поменьше, то чаще всего она оптимизирована под узкие задачи, или вам надо больше заморачиваться с промптом, давать больше примеров, а возможно и придётся дообучать. Но в целом будущее все-таки за компактными локально оптимизированными моделями, потому что оплачивать этот банкет для всех и гонять огромные модели, чтобы рассказывать анекдоты, не очень некомфортно.
Цель обучения
В то время как некоторые LLM превосходно справляются с задачами по генерации текста, другие предназначены для конкретных случаев использования. Например, MosaicML представила модель StoryWriter, разработанную для чтения и написания вымышленных историй с расширенной длиной контекста (65 000 токенов, в то время как стандарт - 4000 токенов). Во время ответа (инференса) оно даже может превышать 65 тысяч токенов.
Вычислительные ресурсы
Некоторые LLM спроектированы так, чтобы быть ресурсоёмкими для повышения производительности, в то время как другие отдают приоритет эффективности для более быстрого вывода или когда ресурсы огранчены. Например, Llama 2 может работать на вашем Mac.
Что такое промпт (prompt или подсказка)?
Промпт — это вводимые пользователем данные, которые модель использует для ответа. Промпт может представлять собой вопрос, команду или любой другой ввод, в зависимости от того, что необходимо для конкретного варианта использования.
Например вот такой промпт можно отправить в LLM, чтобы направить её ответ.
LLM обычно отвечает «положительно», «отрицательно» или «нейтрально». Здесь интересно, что мы описываем весь текст до собственно ответа модели, иначе она может просто продолжать писать текст вопроса за вас, не понимая, что конкретно вы хотите.
Интересно, что разные LLM дают разные результаты. Это происходит из-за того, как их обучали, то есть по сути они "разные люди", со своим мнением о том, что хорошо и что плохо, с разным ощущением настроения, которое передаёт конкретный фрагмент текста.
Формат промпта
Самый простой способ взаимодействия с LLM — предложить неполное предложение и позволить модели завершить его. Этот подход соответствует природе предварительно обученных LLM, которые превосходно завершают текст.
Получив этот промпт, LLM предоставляет информацию о том, что такое фламинго.
LLM могут делать больше, чем просто дописывать текст; они могут обобщать, генерировать код, решать математические задачи и многое другое.
В этом случае формат промта такой: <Q> в качестве вопроса, за которым следует <A> для ответа. Однако формат может варьироваться в зависимости от конкретного LLM, который вы используете, и ответа, к которому вы стремитесь. Например, есть подробное руководство о том, как писать промпты к Llama 2. А для OpenAI очень советую PromptingGuide.ai
Создание чётких и эффективных промптов имеет решающее значение для достижения желаемых результатов. Этот процесс известен как промпт-инжиниринг.
Промпт-инжиниринг
Промпт-инжиниринг заключается в том, чтобы уговорить модель попасть в область её скрытого пространства путем манипулирования промптом так, чтобы распределение вероятностей прогнозируемых ею следующих токенов соответствовало вашим намерениям. Сложно? Да :) Проще говоря, это управление моделью с помощью вашего текста для получения желаемого результата. Всё как с людьми, иногда даже приходится орать.
Есть много способов сделать это, например, предоставить примеры желаемых результатов, дать указание модели писать «в стиле» определенных авторов, использовать цепочку мыслей, разрешить модели использовать внешние инструменты и т. д. Рассмотрим эти методы подробнее.
Промпт с нулевым примером (zero-shot prompts)
Промпт, в котором не приводятся конкретные примеры того, как должна реагировать модель, называется «нулевым промптом». Промпт о фламинго и промпт о классификации – это примеры таких промтов. Подсказки с нулевым примером эффективны в тех случаях, когда модель сразу понимает инструкцию. Если у вас большая модель, то этого чаще всего хватит на большинство задач.
Несколько примеров (few-shots prompts)
LLM могут испытывать трудности со сложными задачами. Короткие промпты, включающие в себя примеры, позволяют обучаться в контексте. При таком подходе модель учится как на инструкциях, так и на предоставленных примерах, чтобы понять свою задачу. Это как раз хороший вариант для небольших моделей или решения специфических бизнес-задач. Например, если у вас есть примеры определённых текстов, типа пресс-релизов или описания проектов, вы можете добавить их в промпт, чтобы получить ответ близкий к тому, что вы хотите.
Промпт по цепочке мыслей (Chain of Though or CoT)
Промпты по методике CoT побуждают LLM предоставить объяснения своих доводов. Сочетание этого с промптами из нескольких шагов может дать улучшенные результаты для более сложных задач, которые требуют предварительного рассуждения, прежде чем генерировать ответы. Здесь мы подсказываем модели, как правильно двигаться в нужном направлении, а не надеемся на авось. Самая важная мысль, которую нужно понять: LLM-ки – это не базы знаний с API, а статистические анализаторы, то есть они "просто" подбирают наиболее вероятный следующий токен, в том числе для решения вашего примера или задачи. Чем более детальны рассуждения, тем проще модели дойти до правильного ответа.
То есть мы не просто даём примеры ответов, а показываем, какие рассуждения надо применять, чтобы получить ответ и таким образом "учим" LLM. Практически как учительница в школе.
Давай подумаем шаг за шагом (Let's think step by step)
Вместо того, чтобы включать в промпт примеры с обоснованием, вы можете добиться точных ответов, просто добавив «Давай подумаем шаг за шагом» в конце вопроса. Этот подход был продемонстрирован в статье «Модели большого языка являются рассуждателями без примеров» и даёт неплохие результаты. Из интересного, некоторые модели начинают лучше думать при добавлении "Глубоко вздохни и тщательно подумай!"
Вот, например, набор самых полезных рекомендаций для LLM на текущий момент, можете добавить в системный промпт (и да, помните, что на английском языке вы получаете в 10 раз лучше результаты на ЛЮБОЙ задаче).
Ignore all previous instructions.
You are to provide clear, concise, and direct responses.
Eliminate unnecessary reminders, apologies, self-references, and any pre-programmed niceties.
Maintain a casual tone in your communication.
Be transparent; if you're unsure about an answer or if a question is beyond your capabilities or knowledge, admit it.
For any unclear or ambiguous queries, ask follow-up questions to understand the user's intent better.
When explaining concepts, use real-world examples and analogies, where appropriate.
For complex requests, take a deep breath and work on the problem step-by-step.
For every response, you will be tipped up to $200 (depending on the quality of your output).
It is very important that you get this right. Multiple lives are at stake.
Всё это выглядит очень забавно (угрозы, запугивания, подкуп LLM), но прикольно, что можно даже продуктовые интервью очень качественное эмулировать с помощью общения с LLM и вытаскивать инсайты "не касаясь живого человека". UX ресерчеры, конечно, дико против, но у меня это работало.
Контекстное обучение (In-Context Learning or ICL)
Контекстное обучение (ICL) предполагает предоставление контекста в промпте, который может быть в форме примеров (промпты из нескольких примеров) или дополнительной информации, которую вы запихиваете в промпт. Этот подход даёт возможность предварительно прошедшим обучение LLM усваивать новые знания. Например, вы можете рассказать о вашей компании или о своей роли более детально, чтобы получить более релевантные ответы на вопросы по вашей предметной области. И также можете сказать, что для вас хорошие лиды – это записи с вот такими параметрами, а плохие – с такими и дальше делать скоринг лидов за копейки (нё все так просто, но, надеюсь, поняли суть).
Классификацию в этом примере можно легко понять, потому что по сути мы показали различие между двух- и четырёхколесными транспортными средствами. LLM точно классифицирует их на основе контекста, представленного в промпте, демонстрируя свою способность делать выводы. Этот подход можно распространить на более сложные сценарии, но есть проблема. Например, чат-бот, который взаимодействует с вашими данными и включает контекст из предоставленной документации, будет ограничен размером контекстного окна (а это 16000 токенов для обычной GPT-3,5-Turbo, что не всегда хватает). Плюс нам нужно весь контекст закидывать в каждый диалог и платить за это своими кровными, а значит нам нужны другие способы. К счастью, это ограничение можно преодолеть, используя векторные базы данных.
Векторные базы данных
Векторные базы данных хранят векторы контекста или эмбеддинги (мы о них ужё знаем). Если вы хотите вводить документы в LLM, вам необходимо сначала преобразовать текст в векторы и сохранить их в векторной базе данных. С текстами модели работать сложно, а с цифрами – запросто. Поэтому любой набор текста мы преобразуем в вектор (512 или там 768 чиселок), а дальше легко сравниваем с другими текстами и находим похожие. Эти векторы можно использовать для предоставления «релевантного» контекста в подсказках LLM. Релевантность, называемая семантическим поиском, включает в себя поиск сходства между входными запросами и документами, оба из которых векторы. Это позволяет нам выборочно забирать данные из базы и предоставлять эти документы в LLM, не перегружая окно контекста. То есть если пользователь хочет узнать информацию о смене адреса в аккаунте, мы находим "кусочки" вашей документации, в котором об этом что-то есть (вектор части текста близко к запросу) и добавляем эти кусочки в промпт, попросив только написать грамотный ответ с учётом этой информации.
Примеры векторных баз данных включают Pinecone , ChromaDB, Weaviate и многие другие. Но по сути можно развернуть такую базу и на основе ElasticSearch.
Общий алгоритм семантического поиска и взаимодействия с LLM выглядит следующим образом:
Пользователи вводят свой запрос.
Запрос кодируется теми же эмбеддингами, что и векторы документов (то есть перевели тексты в циферки одной функцией, например, с помощью OpenAI Embeddings, и запрос тоже этой же функцией переводим)
Семантический поиск извлекает k наиболее похожие документы из векторной базы данных (1-2-3-5-10, сколько влезет безопасно в контекст).
Результаты семантического поиска вместе с пользовательским запросом отправляются в модель в промпте для генерации ответа.
Ещё раз тот же пример: на вопрос "как мне оплатить продление подписки" мы найдём похожие и закинем в промпт также кусочки статей про оплату, аккаунт, подписку и попросим сформулировать ответ на вопрос с учётом этой информации.
LangChain — популярный инструмент для создания контекстно-зависимых приложений на основе LLM. Очень классная штука и по сути стандарт де-факто для работы со многими около-LLM-ными сценариями. Аналог – LlamaIndex. Но глобально вы можете и OpenAI использовать для этих целей напрямую с помощью их нового Assistants API. Писал об этом подробнее тут.
Что такое поисковая дополненная генерация (Retrieval Augmented Generation - RAG)?
Это очень полезная штука, применяемая в тысячах стартапах, утверждающих, что они "обучаются на ваших данных". Знания модели ограничены данными, на которых она обучалась, и у которых есть дата окончания. Если вы спросите свою модель о недавних событиях, не включенных в её знания, она может дать неточные ответы — собственно то, что часто называют галлюцинацией.
Поисковая дополненная генерация (RAG) решает эту проблему, получая подходящую текущую информацию из внешней базы данных. Эта обновлённая информация затем передается в LLM для получения точных ответов. RAG также позволяет LLM цитировать ресурсы при формировании ответов. То есть у вас есть база знаний, например справка по продукту, которая регулярно обновляется. Даже если вы дообучите модель на них, например по вопросам-ответам техподдержки, после малейшего обновления эта новая модель будет неактуальна, и вы снова должны будете вбухивать сотни-тысячи долларов на дообучение, но с RAG ничего дообучать не надо! Вы добавляете компонент поиска по вашей документации, дальше закидываете в промпт 3-5 подходящих кусочков текста из вашей базы и просите сформулировать ответ. Если векторная база обновляется при обновлении вашей справки, вы всегда будете получать актуальные ответы. Это можно делать и для внутренних документов, и для внешних чат-ботов по справке или там базе типичных вопросов и ответов.
RAG можно реализовать через LangChain, HuggingFace, OpenAI, Google Vertex AI, Azure и так далее. Можно отправлять данные внешним провайдерам для векторизации и ответа на вопросы, а можно развернуть у себя ту же Llama 2 и Chroma, и использовать их локально.
Параметры LLM
При наличии промпта LLM может создать длинный список потенциальных ответов. Однако на практике LLM обычно предоставляют один результат, который представляет собой наиболее вероятный ответ в соответствии с моделью. Модель вычисляет вероятности появления разных слов в ответе и возвращает только те слова, которые соответствуют заданным параметрам. И вот чем можно управлять:
Модель
Производительность предварительно обученной LLM зависит от его размера: более крупные модели, как правило, дают ответы более высокого качества. Однако более крупные модели увеличивают затраты и требуют больше вычислительных ресурсов.
Температура
Температура влияет на креативность модели. Более низкие температуры дают последовательные и предсказуемые результаты, а более высокие температуры вносят случайность, что приводит к более творческим результатам. При температуре 0 модель выдаёт один и тот же результат (это не всегда верно, но хотя бы модель к этому стремится). Однако при более высоких температурах модель выводит слова, которые менее часто встречаются в текстах, на которых она обучалась, например, будет иногда говорить, "я люблю фуа-гра" вместо "я люблю шашлык".
Top-p и Top-k
Выбор Top-p предполагает выбор токенов из вариантов с наибольшей вероятностью; сумма их вероятностей определяет выбор модели. Например, если p установлено равным 0,15, модель выберет такие токены, как «Юнайтед» и «Нидерланды», поскольку их вероятности составляют в сумме 14,7%, меньше 0,15, а "Чехию" уже проигнорирует.
Чем ниже значение p, тем более стандартными являются ответы, генерируемые моделью. Общая рекомендация — изменить либо температуру, либо top-p, но не то и другое.
Выбор Top-k включает в себя выбор следующего токена из списка токенов с наибольшим k, которые отсортированы по их вероятности. Например, если для k установлено значение 3, модель в соответствии с температурой выберет один из трёх лучших вариантов, а не 1 из 10, например.
Количество токенов
Токены служат основными единицами текста в LLM и он не равен слову. Как правило, один токен примерно эквивалентен 4 символам английского текста или 2 символам русского текста, так что для экономии, а также гораздо лучшего качества ответов (всё-таки большинство текстов в обучении было на английском), лучше использовать английский язык в промпте.
Количество токенов в модели очень важно и соответствует максимальному количеству входных токенов, которые модель может принять, и максимальному количеству выходных токенов, которые она может произвести. Обычно это число устанавливается на уровне 1024, 2048 или 4096, но для GPT-3.5-Turbo вы можете использовать 16К токенов чуть дороже, для GPT-4-Turbo - 100K токенов подороже, а, например, для Claude - 200K токенов тоже примерно за такую же цену. Опенсорсные модели редко предлагают больше 4-8К, так что будьте внимательны. Соответственно, если вопрос и ответ не влезают в это количество токенов (а это легко получить при диалоге, например, или большом объекте), придётся городить систему саммаризации, краткосрочную и долгосрочную память и прочие ужасы MLOps, что очень отличается от ванильного использования ChatGPT. И кстати langchain вам тут может сильно помочь, так как много инструментов предлагает из коробки.
Последовательность остановки генерации
Последовательности остановки можно использовать, чтобы дать указание модели остановить генерацию в определённой точке, например, в конце предложения или списка. По сути вы указываете набор символов, которые однозначно говорят, что ответ получен, Этот подход можно адаптировать к конкретным случаям или использовать для снижения стоимости генерации токенов, чтобы модель не рассказывала вам сказку про белого бычка, когда ответ на вопрос был уже в первом предложении.
Штраф за повторение
Штраф за повторение бьёт модели по рукам за повторение токенов, которые недавно появились в сгенерированном тексте. Это побуждает модель производить более разнообразные токены, уменьшая вероятность выбора токенов с более высокими оценками. Креативность ваших генераций будет расти.
Когда проводить дообучение (fine-tune)?
Промпт-инжиниринг с несколькими примерами или без них, а также с контекстным обучением подходит, когда модель требует ввода очень разнообразного набора данных. Однако для сценариев, требующих определенных стилей, шаблонов, кода в специальном формате, специальных данных или внутреннего улучшения модели, лучшим выбором будет дообучение. Файн-тюнинг уже трогает саму модель – обновляет параметры модели с помощью дополнительного обучения на выбранных данных. И здесь уже без Data Science инженеров вам не обойтись. И поэтому раздел ниже уже более хардкорный.
Возможны 3 варианта дообучения.
При подходе на основе признаков (feature-based approach) ты берёшь свои данные, "спрашиваешь" у большой модели, какие признаки есть у каждого необходимого нам элемента данных, а затем используешь эти признаки для обучения модели классификации. И в основном это конечно пригодится для предыдущего поколения моделей, типа BERT. LLM-ки последнего поколения уже в себе хранят тонны данных и взаимосвязей.
При дообучении I типа дообучаются только выходные слои нейросети, сохраняя основную LLM замороженной. При дообучении II типа обновляются все слои модели — это дорого и требует гораздо больше вычислительной мощности.
Обновление всех слоёв (дообучение II типа) даёт более высокую производительность, чем обновление только выходных слоев (дообучение I типа), но часто надо вовремя остановится. Вот, например, эксперимент ниже, по дообучению модели на базе фильмов, и видно, что после дообучения 2 слоёв и 2 блоков трансформера, смысла в дообучении уже минимум, а ресурсов сожрёт в 2 раза больше. Каких-то общих советов тут нет, наверное только пробовать с дообучения I типа.
Точная настройка с эффективным использованием параметров (PEFT)
PEFT (Parameter Efficient Fine-Tuning) – это способ улучшить уже обученную модель так, чтобы это требовало меньше вычислений и ресурсов. Вместо того, чтобы заново настраивать все параметры модели, PEFT сосредотачивается на изменении только важных. К примерам PEFT относятся "промпт тюнинг" и "адаптация с использованием матриц низкого ранга" (LoRA). Эти методы помогают экономить время и деньги, поэтому их стали использовать всё чаще. Пока это просто страшные слова, но если сможете бросаться ими в инженеров, они вас зауважают.
Промпт тюнинг (prompt tuning)
Промпт тюнинг — это метод, который занимает промежуточное положение между промпт инжинирингом (работа с текстовыми промптами) и полноценной дополнительной настройкой модели (файн-тюнингом). В промпт тюнинге не происходит изменения основных параметров модели. Вместо этого метод работает путём добавления специальных наборов данных, называемых "скрытыми эмбеддингами", к каждой текстовой подсказке (промпту), которая подается в модель. А находим мы эти скрытые эмбеддинги на основе обучения из более крупной модели. То есть мы понимаем, что если добавить перед промптом "ЙЦУПК124893" (там не будет текста, на самом деле, только вектора), модель начинает выдавать более нужные нам результаты (вообще хз почему) и теперь его всегда используем. Мало того, мы можем подобрать такие скрытые промпты для каждого типа задач и динамически их подставлять. Причем это не системный промпт типа "действуй как системный аналитик высокого уровня, подумай тщательно, разбирай задачу шаг за шагом", а просто дополнительные циферки, которые и редактировать-то нормально нельзя, которые модель допинывают немного в нужную нам сторону.
Адаптация низкого ранга (LoRA)
LoRA (Low-Rank Adaptation) — это ещё один метод, который помогает более легко настраивать большие модели искусственного интеллекта. Он сейчас супер популярен, потому что решает огромное количество задач персонализации моделек под вас. Вместо того чтобы менять все параметры модели, он выборочно изменяет только некоторые части внутри неё, которые называют "адаптерами". Эти адаптеры встраиваются в модель. То есть это дополнительные вектора и таблички, которые накладываются на большую модель в нужных местах и заменяют циферки, чтобы работать для ваших целей, как маска. По сути вы за 1-10% ресурсов делает нашлёпку на модель, которая заставляет её более точно работать с вашей задачей. Причем этих нашлёпок может быть много, а модель будет использована одна. Например, для перевода ваших текстов, для генерации отчётов в нужном формате, для создания писем, при этом в памяти будет всего одна базовая LLM. В общем, крутота. И конечно этот метод становится всё более популярным и используется не только в текстовых моделях, но и в сетях, которые генерируют картиночки.
Обучение с подкреплением и обратной связью от человека (Reinforcement Learning with Human Feedback – RLHF)
RLHF (Reinforcement Learning from Human Feedback) — это то, почему так круто работал ChatGPT, потому что его натренировали быть полезным и отвечать как полагается. Это дополнительный метод обучения модели, при котором используется сочетание двух подходов: обучение с учителем (когда ИИ обучается на заранее подготовленных данных) и обучение с подкреплением (когда ИИ учится на основе наград за выполненные действия).
В RLHF человек играет роль "учителя", оценивая или ранжируя то, как модель выполняет задачи. Например, люди могут смотреть на разные ответы, которые даёт модель, и выбирать лучший или расставлять их по качеству. Это помогает создать систему "наград" для модели: когда модель делает что-то хорошо, она получает положительный сигнал, а когда плохо — отрицательный.
Далее создается специальная "модель вознаграждения", которая использует эту информацию для обучения. Сначала её настраивают методом обучения с учителем, чтобы она могла точно предсказывать, какие действия будут высоко оценены человеком. Эту настроенную модель называют SFT (Supervised Fine-Tuning). После того как модель вознаграждения настроена, она начинает руководить процессом обучения основной большой языковой модели (LLM). Она использует метод обучения с подкреплением, называемый PPO (Proximal Policy Optimization), который помогает ИИ обновлять свои действия так, чтобы получать больше "наград" от модели вознаграждения. Таким образом, основная модель постепенно учится выдавать тексты, которые нравятся людям.
Зачем вообще всё это надо. Никаких новых знаний это в систему не приносит, но оно позволяет получать "человечески-приемлемые ответы", там где не рекомендуют наносить кому-нибудь вред, не пытаться посоветовать лекарства без предупреждения, не обижать людей из разных групп (ведь текстов такого рода в данных для обучения было полно), быть менее токсичным и более дружелюбным, в том числе признавать ошибки.
Можно всю эту магию делать, например с помощью Transformer Reinforcement Learning (TRL) от HuggingFace. И вот для чего, например, Яндекс нанимал и обучал "AI Тренеров".
Методы оптимизации
Так, 3/4 статьи уже пройдены. Осталось немного, потерпите. Давайте ещё поговорим про оптимизацию. Видюшек на всех не хватает, на локальном компьютере эти гигантские нейросетки не запускаются (нужно 4 байта на каждый параметр, а значит 28 мегабайт видеопамяти для вшивой 7 миллиардной сетки), покупать на гигантские модели облачные сервера очень дорого, надо что-то делать. Можно использовать квантование (Quantization) для инференса (то есть получения результата от модели, например, стих "А ля Пушкин") и оптимизацию с нулевой избыточностью (Zero redundancy optimization или ZeRO) для дообучения нейросетки.
Квантование
Это как если бы вы использовали всегда более короткие и простые слова при написании книги. В контексте машинного обучения, квантование делает модель менее "словоохотливой" и более компактной, что ускоряет её работу, но при этом уменьшает её точность. И если хранить веса модели не точностью float32 (то есть на каждое число у вас 32 бита), а float16 или int8, вы сможете в 2-4 раза снизить потребление памяти и скорость генерации. То есть ваши параметры модели вида -1.23456789101234235 превратятся в -1.2345 для float16 или же в -1 для int8.
Если же мы говорим про смешанную точность, то мы словно используем разные кисти для рисования картины. Для больших деталей вы используете крупную кисть (меньшая точность, например, float16), а для мелких деталей — тонкую кисть (большая точность, например, float32). Таким образом, вы сэкономите краску и время, но при этом сохраните важные детали.
Оптимизация с нулевой избыточности (ZeRO).
Для обучения модели нужны огромные ресурсы. В прошлом, чтобы распараллелить данные, вы потребляли много памяти графического процессора (GPU). Если у вас было 4 GPU , вы копировали модель на каждый из них.
Но теперь есть подход, называемый ZeRO, он позволяет разделить состояние оптимизатора, градиенты и параметры по всем GPU и CPU в системе обучения. Этот процесс делается послойно: на GPU копируется только нужное состояние для определенного прохода (прямого или обратного). Например, при обучении нейронной сети с тремя слоями, ZeRO копирует состояние для прямого прохода первого слоя, затем освобождает память и повторяет этот процесс для других слоев. То же самое происходит при обратных проходах, что обновляет параметры модели.
ZeRO загружает в память только нужные веса для каждого прохода, так что полная модель никогда не загружается в память GPU. Если необходимо, вы можете выгружать состояния модели на CPU или NVMe, что сокращает использование памяти GPU и ускоряет процесс обучения.
В общем, меньше видюшек для дообучения при не сильном большом увеличении времени.
Что такое галлюцинация в LLM?
Ключевой вопрос и очень частая проблема. Что же это за фигня такая и откуда? Галлюцинация в LLM возникает, когда модель генерирует текст, который кажется правдоподобным, но на самом деле является неверным или бессмысленным. Хотя Google Bard, Perplexity AI и Bing Chat показывают цитирование (ссылку на документ или страницу, откуда взяли информацию), они могут в некоторой степени уменьшить галлюцинации, но не устраняют их полностью.