Как LLM могут общаться на своем языке
В октябре вышла статья, в которой разработчики представили новый способ взаимодействия LLM между собой.
Зачем нужно взаимодействие?
В мультиагентных системах могут использоваться несколько моделей. Выход одной из них подается на вход другой. Простой пример: первая модель отработала запрос пользователя и решила, что для выполнения этого запроса нужно использовать модель для генерации картинок. Первая составила соответствующий промпт и отдала второй.
Пример с несколькими текстовыми моделями: одна из них общего домена, а другие специализированные. «Общая» решает, к какой из остальных передать запрос.
В чем проблема?
Проблема в том, что, передавая текст между моделями, мы сильно ограничиваем информацию. В процессе генерации LLM хранит скрытые состояния, которые более информативны, чем итоговый текст на выходе. Таким образом, мы как бы ограничиваем потенциал.
Что предлагают?
А что, если передавать между моделями эти скрытые состояния вместо итогового текста? Это как если бы люди общались мыслями, а не просто словами. Ведь в мыслях гораздо больше хранится информации, чем в просто словах. Этими скрытыми состояниями является Key-Value Cache. Это результаты векторного умножения Key и Query в Self-Attention модуле трансформера. Подробнее об этом 1 и 2.
Но дело в том, что разные модели сохраняют эти состояния по-разному. Как будто LLM-ки говорят на разных языках. Поэтому авторы статьи придумали отдельную модуль «объединитель мыслей» — Fuser модуль.
Подробнее про Fuser модуль (см. картинку)
Этап 1: объединить мысли обеих моделей путем конкатенации их KV-cache и проекции (полносвязный слой) в новый вектор. Это и есть мост.
Этап 2: Динамическое взвешивание позволяет при разных входных данных учитывать разный вес элементов нового вектора и применять бинарную функцию активации (Gumbel-sigmoid). Таким образом решается, внедрять или нет новый контекст конкретно в данном случае.
Этап 3: В KV-cache второй модели добавляется новый контекст. Именно добавляется, а не перезаписывается.
Как обучается?
Обе модели остаются статичными — их веса не обучаются. Обучается только Fuser модуль, в котором идут вышеперечисленные этапы. То есть обеим моделям в ходе обучения приходит промпт, затем во вторую модель вливается объединенный KV-cache. И оценивается способность к предсказанию в обычной манере обучения LLM — Supervised Fine-tuning.
Плюсы:
Объединение мыслей действительно дает прирост качества. Кроме того, прирост скорости достигается за счет использования принципе KV-cache, а также устранения необходимости генерации самого текста. Да и модели могут генерировать KV-cache параллельно.
Минусы:
Основной минус в том, что для каждых новых 2-х моделей приходится обучать свой Fuser модуль, что может быть затратно. Кроме того, потребление памяти тоже сильно возрастает по сравнению с использованием одной модели без KV-cache. Ну и риск потери информации при объединении мыслей тоже сохраняется.
В целом весьма интересный подход для применения мультиагентных систем.
Post #100
111