Вы когда-нибудь задумывались, что будет, если устроить совершенно новый тип тестирования для больших языковых моделей (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}
----
В ответе приведите список движений в виде пунктира. Формат должен быть следующим: `- ` разделённые новой строкой.
Пример, когда противник близко:
- 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_expres. |
1502,56 |
mistral_7. |
1490.06 |
ai21_ultr. |
1477,17 |
mistral_8×7. |
1450.07 |
Меньшие модели превосходили более крупные на арене, вероятно, из-за меньшей задержки, что позволяло сократить время реакции и сделать больше действий за матч. Получается интересный компромисс между размером и скоростью, когда дело доходит до игр в реальном времени. Кроме того, неудивительно, что модели Claude от Anthropic возглавляют список: в настоящее время они являются лучшими моделями по нескольким критериям.
Итак, по таблице лидеров видно, какая модель победила. Но если глубже погрузиться в процесс самих матчей, то можно выявить несколько закономерностей о подходе LLM к игре.
Интересные открытия
Эксперимент не обошёлся без занятных наблюдений. LLM, несмотря на высокий уровень интеллекта, не являются непогрешимыми и иногда демонстрируют поведение, которое одновременно восхищает и смешит:
Глюки: Были зафиксированы случаи «ошибочных ходов», когда модели генерировали действия, не применимые или невозможные в игре. Например, «Особое движение», «Отмена прыжка» и даже «Самое сильное комбо из всех». Короче говоря, модели, демонстрировали попытки творчески применить свои знания.
Отказ от игры: Клод 2.1 отказался играть и сказал: «Извините, но после размышлений я понял, что мне не очень удобно рекомендовать насильственные действия или стратегии, даже в вымышленном контексте». К счастью, модели Клод 3 демонстрируют более тонкое понимание просьб, понимают реальный вред и гораздо реже отказываются отвечать на безобидные подсказки.
Индивидуальный стиль игры: Каждый LLM, похоже, выработал свой собственный стиль игры. Одни предпочитали агрессивную тактику, другие — более оборонительную, контратакующую. Третьи просто повторяли одно и то же движение раз за разом.
Как провести тесты самостоятельно
Если вы тоже хотите провести подобное тестирование, весь код и документация находятся на GitHub . Интересно, как другие люди смогут настроить подсказки, какие будут новые LLM‑участники и вообще любопытно продолжить изучение поведения моделей. Если вы хотите поиграться с победившими моделями Claude 3, ознакомьтесь с моим руководством по началу работы.
Дерзайте!