Как большие языковые модели в Street Fighter играли

Вы когда-нибудь задумывались, что будет, если устроить совершенно новый тип тестирования для больших языковых моделей (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 различными моделями:

Как большие языковые модели в Street Fighter играли

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

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

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

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

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

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

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

Как большие языковые модели в Street Fighter играли

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

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

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

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

Дерзайте!

1313
4 комментария

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

высокий уровень интелекта у языковой модели - это конечно топ

2
Ответить

Он, конечно же, именно в виду выпускной уровень ИСКУССТВЕННОГО интеллекта.

Ответить

Комментарий недоступен

Ответить

Комментарий недоступен

Ответить