Вы когда-нибудь задумывались, что будет, если устроить совершенно новый тип тестирования для больших языковых моделей (LLM)? Что-то выходящее за рамки типичных задач с ответами на вопросы или генерацией текста. Например, выпустить несколько моделей на арену и заставить их соревноваться друг с другом?

Именно это я и решил сделать: столкнуть LLM друг с другом в классической аркаде Street Fighter III. Далее расскажу, как я создал эту арену и какие интересные наблюдения сделал во время битв LLM на виртуальных улицах Метро-Сити.

Супер атака в действии
Супер атака в действии

Как это работает

Для создания арены я использовал эмулятор Street Fighter III на платформе Diambra, а также работы Стэна Жирара, который открыл исходный код своего испытательного стенда для моего теста.

Для начала на Amazon Bedrock выбираются две случайные модели LLM, которые будут управлять Кеном. Затем испытательный стенд выполняет следующие шаги:

1. Сбор данных о состоянии игры

Постоянно считывается текущее состояние игры:  местоположение персонажа, его здоровье и счёт. Затем эта информация преобразуется в подсказку со всем соответствующим контекстом для LLM. Туда входят доступные ходы и рекомендуемые стратегии.

Вы находитесь очень далеко от противника. Переместитесь ближе к противнику. Ваш противник находится слева.
Теперь вы можете использовать мощный прием. Названия мощных приемов: Megafireball, Super attack 2.
Ваше последнее действие было Low. Последним действием противника было Left.

Ваш текущий счет - 17.0. Вы побеждаете. Продолжайте атаковать противника.

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

Вы можете использовать следующие приемы:

- Move Closer
- Move Away
- Fireball
- Megapunch
- Hurricane
- Megafireball

2. Получение ходов игрока

Имея нужный контекст, можно создать системную подсказку и отправить её соответствующему LLM через бессерверный API Bedrock. Получив подсказку, каждый LLM анализирует состояние игры и выбирает ходы.

def call_llm() -> str:
      
       move_list = "- " + "\n - ".join([move for move in META_INSTRUCTIONS])

       system_prompt = f"""Вы - лучший и самый агрессивный игрок Street Fighter III 3rd strike в мире.

       Ваш персонаж - {self.character}. Ваша цель - победить соперника. В ответ вы приводите список приемов.

       {self.context_prompt()}

       Движения, которые вы можете использовать:

       {move_list}

       ----

       В ответе приведите список движений в виде пунктира. Формат должен быть следующим: `- <name of the move>` разделённые новой строкой.

       Пример, когда противник близко:

       - Move closer

       - Medium Punch
      

       Пример, когда противник далеко:

       - Fireball

       - Move closer

       """

       prompt = "Ваши следующие действия:"

       llm_response = call_bedrock_model(self.model, system_prompt, prompt, bedrock_runtime)

       print(f"{self.model} making move {llm_response}")

3. Выполнение движений

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

Таблица лидеров LLM

Я отслеживал результаты каждого LLM с помощью системы рейтингов Эло, аналогичную той, которая используется в шахматах. Эта система позволила создать динамическую таблицу лидеров, показывающую, какие модели лучше всего адаптируются к быстро меняющейся обстановке в Street Fighter III. Я провёл 314 матчей с 14 различными моделями:

Модель

Рейтинг Эло

? claude_3_haiku

1613,45

? claude_3_sonnet

1557,25

? claude_2

1554,98

claude_instant

1548,16

cohere_light

1527.07

cohere_command

1511,45

titan_express

1502,56

mistral_7b

1490.06

ai21_ultra

1477,17

mistral_8×7b

1450.07

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

Сопоставление моделей
Сопоставление моделей

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

Интересные открытия

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

Глюки: Были зафиксированы случаи «ошибочных ходов», когда модели генерировали действия, не применимые или невозможные в игре. Например, «Особое движение», «Отмена прыжка» и даже «Самое сильное комбо из всех». Короче говоря, модели, демонстрировали попытки творчески применить свои знания.

Отказ от игры: Клод 2.1 отказался играть и сказал: «Извините, но после размышлений я понял, что мне не очень удобно рекомендовать насильственные действия или стратегии, даже в вымышленном контексте». К счастью, модели Клод 3 демонстрируют более тонкое понимание просьб, понимают реальный вред и гораздо реже отказываются отвечать на безобидные подсказки.

Индивидуальный стиль игры: Каждый LLM, похоже, выработал свой собственный стиль игры. Одни предпочитали агрессивную тактику, другие — более оборонительную, контратакующую. Третьи просто повторяли одно и то же движение раз за разом.

Спам-атаки — действенная стратегия
Спам-атаки — действенная стратегия

Как провести тесты самостоятельно

Если вы тоже хотите провести подобное тестирование, весь код и документация находятся на GitHub . Интересно, как другие люди смогут настроить подсказки, какие будут новые LLM‑участники и вообще любопытно продолжить изучение поведения моделей. Если вы хотите поиграться с победившими моделями Claude 3, ознакомьтесь с моим руководством по началу работы.

Дерзайте!

Комментарии (0)