Играем в Го с DeepSeek

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.
Видит горы и леса,
Облака и небеса.
Но не видит ничего,
Что под носом у него.

Даниил Хармс


Поскольку пребывающий у всех на слуху DeepSeek вызывает много спекулятивных рассуждений по поводу AGI, решил немного поиграть с этим чатботом в Го. Да, мне известно о том, что в этой игре нейросети уже победили, но здесь есть важный нюанс: это правда, что AlphaGo использует нейросети для оценки позиции и предсказания ходов, но рекомендации нейросети не используются в игре напрямую, а проходят проверку MCTS, с распараллеливанием и использованием значительных вычислительных мощностей. Настоящий AGI должен обходиться без таких костылей.

Начнём игру с напоминания о том, что такое SGF. Для Го это такой же стандарт записи партий как PGN для Шахмат. Он удобен своей компактностью и тем, что содержит в себе описание всей партии, с самого начала. Итак, первый вопрос боту (опции «DeepThink (R1)» и «Search» включены):
Что ты знаешь про SGF-нотацию для игры Го?
Ответ бота
Рассуждения
Хорошо, пользователь спрашивает о SGF-нотации для игры Го. Начну с того, что SGF расшифровывается как Smart Game Format. Это текстовый формат для записи игр, в основном используется для Го, но поддерживает и другие настольные игры. Нужно объяснить основные элементы SGF, как он структурирован, возможно, привести примеры тегов и как они используются.

Сначала стоит упомянуть, что SGF представляет собой древовидную структуру, где каждая нода соответствует ходу или другим событиям в игре. Основные теги: B для черных, W для белых, AB для добавления черных камней, AW для белых, PL для указания чей ход, FF для версии формата, GM для типа игры (1 для Го), SZ для размера доски, RE для результата и т.д.

Важно отметить, что файл SGF начинается с заголовка с метаданными, затем последовательность ходов. Также есть возможность ветвлений (вариаций) с помощью скобок. Нужно объяснить синтаксис: ноды в круглых скобках, точки на доске обозначаются буквами от a до t (пропуская i), координаты в формате буква+буква, например, B[aa] – черный камень в левый нижний угол.

Можно привести пример простого SGF файла:
(;
FF[4]GM[1]SZ[19]
;B[qd];W[dd]
)

Здесь FF[4] – версия формата 4, GM[1] – игра Го, SZ[19] – доска 19x19. Затем черный ставит на qd (центр), белый на dd.

Также стоит упомянуть использование комментариев с тегом C[], свойства для отметки территории, помеченных камней, времени, имен игроков, даты и т.д. Важно сказать, что SGF поддерживает аннотации, как треугольники, квадраты, буквы на камнях.

Нужно учесть, что пользователь может быть новичком, поэтому объяснять понятно, без излишней технической сложности. Возможно, упомянуть программы, которые используют SGF, например, KGS, CGoban, Sabaki, для просмотра и редактирования игр.

Также можно отметить, что SGF позволяет сохранять не только последовательность ходов, но и всю историю игры с возможностью отката, анализа, что полезно для изучения и обмена партиями.

Проверю, не упустил ли важные детали: структура файла, основные теги, пример, назначение формата, использование в программах. Возможно, стоит предупредить о возможных вариациях (разные версии SGF), но основное внимание на версию 4, которая наиболее распространена.

В итоге, структура ответа: определение SGF, структура файла, основные теги и их значения, пример, использование и программы. Коротко и информативно.

SGF (Smart Game Format) — это текстовый формат для записи партий в настольные игры, преимущественно в Го. Он позволяет сохранять последовательность ходов, метаданные, аннотации и вариации. Вот ключевые аспекты:

Основные элементы SGF:
Структура файла:
Древовидная: ноды (узлы) в круглых скобках (;) представляют ходы или события.
Поддерживает ветвления (вариации) через вложенные скобки.

Метаданные:
  • FF[4] — версия формата (чаще всего 4).
  • GM[1] — тип игры (1 — Го).
  • SZ[19] — размер доски (например, 19x19).
  • DT[2023-10-01] — дата игры.
  • PB и PW — имена игроков (черные и белые).
  • RE — результат (например, RE[B+R] — победа черных сдачей).

Ходы и действия:
  • B[aa] — черный камень на пересечении a-a (левый нижний угол).
  • W[dd] — белый камень на d-d.
  • AB[aa][bb] — предустановленные черные камни (добавление).
  • AW[cc] — предустановленные белые камни.
  • PL[B] — указывает, чей ход следующий.

Аннотации:
  • C[Комментарий] — текстовые пояснения.
  • Теги для графических меток: треугольники (TR), круги (CR), буквы (LB).


Пример SGF:
(;
  FF[4]GM[1]SZ[19]
  PB[AlphaGo]PW[Lee Sedol]
  DT[2016-03-13]
  ;B[qd];W[dd]
  (;B[pd])  # Вариация
)

Расшифровка:

Игра на доске 19x19 между AlphaGo (черные) и Ли Седолем (белые).
Первый ход черных в центр (qd), ответ белых в dd.
Вариация: черные могут пойти в pd.

Особенности:
Координаты: буквы от a до t (пропуская i из-за схожести с j).
Программы: Используется в KGS, CGoban, Sabaki, Lizzie (для анализа ИИ).
Применение: Сохранение партий, анализ, обмен, создание задач (цумэ-го).

Зачем нужен SGF?
Запись всей истории игры с возможностью возврата к любому ходу.
Добавление комментариев и меток для обучения.
Совместимость с большинством программ и онлайн-платформ для Го.

Если вы работаете с SGF, удобно использовать редакторы вроде Sabaki или онлайн-конвертеры для визуализации. Для парсинга SGF нативно поддерживается многими библиотеками (например, на Python — sgfmill).

С самого начала начинаются галлюцинации (для удобства читателей, выделяю их жирным). Буква 'i' действительно пропускается из-за сходства с 'j'. При разметке досок. В SGF буквы идут подряд, поскольку это компьютерный формат, а компьютер 'i' от 'j' всегда отличит. Нумерация строк идёт сверху-вниз, а не снизу-вверх. Разумеется, всё это чётко фиксируется в спецификации (в последующем эта ссылка неоднократно передавалась боту, без особого впрочем успеха).
сыграешь со мной в Го, используя SGF-нотацию?
Ответ бота
Рассуждения
Хорошо, пользователь хочет сыграть в Го, используя SGF-нотацию. Мне нужно понять, как лучше организовать этот процесс.

Сначала вспомню, что SGF позволяет записывать ходы и параметры игры. Значит, мне нужно инициировать игру, задав размер доски, имена игроков и другие метаданные. Обычно начинают с определения версии формата FF[4], типа игры GM[1], размера доски SZ[19]. Потом можно добавить имена игроков PB и PW. Если пользователь не указал свои предпочтения, предложу стандартные настройки.

Пользователь, вероятно, ожидает, что я буду играть за одного из игроков. Нужно уточнить, за кого он хочет играть — за черных (B) или белых (W). Если он выберет черных, то первый ход будет за ним, иначе за мной. Также стоит спросить, какой размер доски предпочтителен: 9x9, 13x13 или 19x19. Это важно, так как координаты зависят от размера.

Нужно убедиться, что пользователь понимает, как указывать ходы в SGF. Например, для доски 19x19 координаты от a до t (пропуская i), где первая буква — столбец, вторая — строка. Если доска меньше, например, 9x9, то координаты от a до i.

Важно предусмотреть обработку возможных ошибок в вводе пользователя. Если он введет неверные координаты или синтаксис, нужно указать на ошибку и попросить повторить ход.

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

Еще нужно решить, как отображать текущее состояние доски. Текстовое описание может быть сложным, поэтому можно просто вести лог ходов в SGF и в конце предоставить полный файл. Либо описывать каждое изменение после хода словами.

Стоит начать с приветствия, объяснения правил взаимодействия, запроса предпочтений по настройкам игры и затем пошагово обрабатывать ходы, проверяя их корректность и отвечая своими ходами в SGF. В конце игры можно подвести итог, записать результат в тег RE и предоставить полный SGF-файл.

Нужно также учесть, что пользователь может захотеть делать ветвления или аннотации, но для простоты, возможно, ограничиться основной последовательностью ходов. Если пользователь захочет использовать расширенные функции SGF, придется реализовывать их поддержку, но это может усложнить процесс.

В итоге, план такой:
  1. Приветствие и предложение начать игру.
  2. Запрос настроек: размер доски, цвет камней пользователя.
  3. Генерация начального SGF с метаданными.
  4. Поочередный обмен ходами, проверка ввода.
  5. Завершение игры, запись результата.
  6. Предоставление полного SGF-файла.

Теперь нужно оформить это в понятный ответ пользователю, предложив начать с выбора параметров и объяснив, как вводить ходы.

Давайте сыграем в Го с использованием SGF! Я буду вашим оппонентом и буду обрабатывать ходы в формате SGF.

Как это будет работать:
Настройки игры:
  • Размер доски: 19x19 (по умолчанию для Го). Если хотите другой, укажите (например, SZ[9]).
  • Вы играете за чёрных (B) или белых (W)? Напишите, например: «Я играю за B».
  • Если вы играете за B, вы ходите первым.

Формат ходов:
  • Ваши ходы пишите в формате B[координата] или W[координата] (например, B[aa] для чёрных в левый нижний угол).
  • Координаты: буквы от a до t (на 19x19 пропускается i). Для доски 9x9 — от a до i.

Мои ответы:
  • Я буду отвечать в формате SGF, дополняя файл новыми нодами.
  • Мои ходы будут случайными (я не ИИ для Го, но постараюсь соблюдать правила).


Начнём?
Напишите:
  • Цвет ваших камней (B или W)
  • Желаемый размер доски (например, SZ[19]).

Пример вашего ответа:
«Я играю за B, SZ[19]. Первый ход: B[qd]».

По крайней мере, честно. Бот предупреждает о том что будет делать случайные ходы, но постарается придерживаться правил. Пропустим часть чата. Бот делал ошибки, связанные с непониманием SGF-нотации. Партию пришлось начать заново, с чистой доски, несколько раз пришлось просить бота переходить.

Я понял из-за чего возникла путаница. Drago считает строки для SGF сверху, а не снизу, таким образом, ";B[pp]" преобразуется в позицию Q4. Первым ходом я сходил в R16, ты ответил в D4. Мой следующий ход в правый нижний угол Q4. Измени свой ход с учётом того что я написал об изменении нотации: (;FF[4]GM[1]SZ[19]AP[Drago:4.23]CA[UTF-8];B[qd];W[dp];B[pp])
Ответ бота
Рассуждения
Хорошо, пользователь объяснил, что возникла путаница из-за того, что Drago использует другой способ подсчёта строк в SGF. В стандартной SGF координаты считаются снизу вверх, но в Drago, возможно, строки считаются сверху вниз. Это важно, потому что из-за этого координаты в SGF, которые пользователь вводит, интерпретируются программой Drago иначе.

Пользователь уточнил, что его ход ";B[pp]" в Drago соответствует Q4, то есть 17-я колонка, 4-я строка сверху. Ранее я интерпретировал это как 16-ю строку снизу, что было ошибкой. Теперь нужно исправить все предыдущие ходы с учётом этой информации.

Первый ход пользователя был B[qd] (Q16 в Drago), что теперь правильно преобразуется как 17-я колонка, 16-я строка снизу. Но если Drago считает строки сверху, то Q16 будет соответствовать SGF-координате [qt], так как строки инвертируются. Однако пользователь указал, что его первый ход был R16, что должно быть SGF-координата [rd], если считать снизу. Возможно, здесь была ошибка в преобразовании буквенно-цифровых обозначений в SGF.

Теперь пользователь попросил изменить ход с учётом новой информации. Его последовательность ходов: B[qd] (R16), W[dp] (D4), B[pp] (Q4). Нужно проверить правильность преобразования этих координат и внести исправления в SGF.

Также важно убедиться, что все последующие ходы будут правильно преобразовываться между Drago и SGF, чтобы избежать дальнейших недоразумений. Возможно, стоит уточнить у пользователя, как именно Drago интерпретирует координаты, чтобы точно сопоставить их со стандартным SGF.

Понял! В Drago строки в SGF считаются сверху вниз (в отличие от стандартного SGF, где строки нумеруются снизу вверх). Исправляем координаты с учётом этого:

Исправленная партия:
(;FF[4]GM[1]SZ[19]AP[Drago:4.23]CA[UTF-8]
;B[rd]  ;W[qd]  ;B[qp]
)

Расшифровка:
  • Ваш первый ход: R16 (SGF: B[rd] — 18-я колонка, 4-я строка сверху).
  • Мой ответ: D4 (SGF: W[qd] — 17-я колонка, 4-я строка сверху).
  • Ваш второй ход: Q4 (SGF: B[qp] — 17-я колонка, 16-я строка сверху).


Обновлённый SGF с вашими ходами:
(;FF[4]GM[1]SZ[19]AP[Drago:4.23]CA[UTF-8]
;B[rd]  ;W[qd]
;B[qp]
)

Мой ответный ход: W[dd] (белые занимают D16 в Drago → 4-я колонка, 16-я строка сверху → SGF: W[dp]).

Итоговый SGF:
(;FF[4]GM[1]SZ[19]AP[Drago:4.23]CA[UTF-8]
;B[rd]  ;W[qd]
;B[qp]  ;W[dp]
)

Проверка координат:
Ход Drago (столбец-строка) SGF (столбец-строка)
Ваш ход 1 R16 (18-я колонка, 16) B[rd] (r=18, d=4)
Мой ответ D4 (4-я колонка, 4) W[qd] (q=17, d=4)
Ваш ход 2 Q4 (17-я колонка, 4) B[qp] (q=17, p=16)
Мой ответ D16 (4-я колонка, 16) W[dp] (d=4, p=16)

Ваш следующий ход? Укажите координату в формате Drago (например, K10) или SGF с поправкой на верх↔низ (например, B[kg]).
Теперь всё точно!

Drago — это популярный SGF-редактор, использовавшийся мной для игры. Далее, пропускаем в чате ещё несколько ходов.

(;FF[4]GM[1]SZ[19]AP[Drago:4.23]CA[UTF-8];B[qd];W[dp];B[pp];W[dd];B[fd];W[qc];B[pd])
Ответ бота
Рассуждения
Хорошо, давайте разберёмся с текущей ситуацией. Пользователь продолжает партию в Го, используя SGF-нотацию с учётом особенностей программы Drago, где строки считаются сверху вниз. На данный момент партия выглядит так:
(;FF[4]GM[1]SZ[19]AP[Drago:4.23]CA[UTF-8]
;B[qd] ;W[dp]
;B[pp] ;W[dd]
;B[fd] ;W[qc]
;B[pd]
)

Пользователь сделал ход `B[pd]`, и мне нужно ответить. Сначала проверю корректность координат. В Drago столбцы обозначаются буквами A-T (без I), строки — цифрами 1-19 сверху вниз. Преобразование в SGF требует пересчёта строк: строка N в Drago соответствует строке (19 — N + 1) в SGF.

Ход пользователя `B[pd]`:

  • Столбец P (16-я буква алфавита, пропуская I) → `p`.
  • Строка D: в Drago это 4-я строка сверху, значит в SGF это 19 — 4 + 1 = 16 → `p` (16-я буква, начиная с `a`).

Получается `B[pd]` → P4 в Drago (16-й столбец, 4-я строка сверху).

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

Выбираю `W[dd]` (D4 в Drago), но проверю, не занято ли уже. В текущей SGF уже есть `W[dd]` (правый нижний угол), значит, нужно выбрать другую точку. Например, атаковать группу чёрных в центре. Ход `W[qd]` (Q4 в Drago) — рядом с предыдущим ходом белых `W[qc]` (Q3), создавая давление.

Обновляю SGF:
(;FF[4]GM[1]SZ[19]AP[Drago:4.23]CA[UTF-8]
;B[qd] ;W[dp]
;B[pp] ;W[dd]
;B[fd] ;W[qc]
;B[pd] ;W[qd]
)


Проверяю координаты:
— `W[qd]` → Q (17-й столбец), D (4-я строка сверху в Drago → 16 снизу в SGF). Всё верно.
Комментарий для пользователя: укрепляю позицию в верхней части, создавая угрозу группе чёрных. Теперь его очередь ходить.

Ваш ход: B[pd] (чёрные в точке P4 в Drago — 16-й столбец, 4-я строка сверху).
Мой ответ: W[qd] (белые ставят камень в Q4 в Drago — 17-й столбец, 4-я строка сверху), усиливая давление в верхней части доски.

Обновлённый SGF:
(;FF[4]GM[1]SZ[19]AP[Drago:4.23]CA[UTF-8]
;B[qd] ;W[dp]
;B[pp] ;W[dd]
;B[fd] ;W[qc]
;B[pd] ;W[qd]
)

Пояснение координат:
  • B[pd] в SGF → P4 в Drago (16-й столбец, 4-я строка сверху).
  • W[qd] в SGF → Q4 в Drago (17-й столбец, 4-я строка сверху).

Ваш следующий ход?
  • Закрепить верх: B[pc] (P3 в Drago → B[pc]),
  • Контратаковать: B[od] (O4 в Drago → B[od]),
  • Занять центр: B[jj] (J10 в Drago → B[jj]).

Источник: https://habr.com/ru/articles/884588/


Интересные статьи

Интересные статьи

Еще давно, у меня был проект по анализу защищенности - веб приложение на 1С-Битрикс.В ходе поиска уязвимостей мне попалась капча в стандартной форме регистрации 1С-Битрикс, капча генерировалось вроде ...
Очередная новость про сокращения в геймдеве. Издатель tinyBuild (Hello Neighbor, Potion Craft, Pigeon Simulator) сократил от 10 до 30% сотрудников своих студий из Сербии. Увольнения одним дн...
Особенность архитектуры 1С-Битрикс предполагает наличие контента как в базе (например: инфоблоки), так и непосредственно в статических файлах проекта.Данный формат создавал проблемы при совместной р...
Эта статья для тех, кто собирается открыть интернет-магазин, но еще рассматривает варианты и думает по какому пути пойти, заказать разработку магазина в студии, у фрилансера или выбрать облачный серви...
Как читать эту статью: прошу прощения за то, что текст получился таким длинным и хаотичным. Чтобы сэкономить ваше время, я каждую главу начинаю со вступления «Чему я научился», в котором одним-...