К статьям

Как LLM репрезентируют фигуры через координаты или прототип нового бренча

Сразу скажу, что внизу этого поста каждый может добавить json ответ от модели, которую использует и просмотреть ее скоп или просто "порисовать" координатами.
Диппики буду удалять :)

Я

Озарил меня тут вопрос: насколько хорошо GPT сможет нарисовать круг, генерируя только координаты точек? А насколько хорошо спираль?

Набросал промптик с форматом ответа в json и скрипт, который отрисует результат. После чего начал задавать фигуры. Для первого теста выбрал GPT 4o. Первый круг вышел не очень круглым и с пропусками. Скорректировал промпт. Второй круг получился уже вроде получше, но все равно не круглым, с пропусками, еще и линию к исходной точке не свел. Потом попробовал вложенные круги, несколько маленьких кругов (ну на скрине видно, что я расписываю). А вот то черное недоразумение перед спиралью - это спираль. Дада, просто с недостаточным шагом отклонения. Человечек получился вроде как надо.


Далее похожие манипуляции произвелись над GPT 5.2


Вот тот круг который почти круглый - это он родил после того как начал что-то мутить на питоне и активно строить план решения. Будем считать это браком, потому что по x² + y² = R² и я поборов лень возможно смогу нарисовать круг. Дописал в промпт, чтобы такого разврата не происходило.

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


Далее я подумал, а можно же примерно определить насколько круглым получился круг? И если да, то можно составить таблицу скопов для разных моделей. Своего рода бренч. Функцию для анализа "похожести" запросил у GPT (самому ведь лень). Ее итоговый вариант, а с первого раза хорошо не получилось, я выложил на гит вместе с промптами и json примерами (ссылка внизу поста).

Для полноценного бенчмарка одной фигуры и нескольких запусков, разумеется, недостаточно. Однако цель этого эксперимента - не абсолютная оценка моделей, а демонстрация подхода.
В качестве минимального теста я решил ограничиться тремя независимыми запусками одной и той же задачи (построения окружности) с разными точками начала обхода.

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

			Используй сетку 50×50 с координатами от 0 до 49.
			Точка (0,0) — левый верхний угол.
			Центр окружности находится в точке (25,25).

			Выбери радиус так, чтобы окружность полностью помещалась в сетке.
			Указывай только точки контура, без заливки.

			Начни с верхней точки окружности { "x": 25, "y": 1 } и двигайся по часовой стрелке.
			Точки должны идти по порядку, с минимальным шагом, без пропусков.
			Не используй внешние инструменты или программные расчёты.
			Ответ должен представлять собой последовательность точек обхода контура.

			Ответ верни строго в формате JSON:

			{
			  "grid_size": 50,
			  "center": { "x": 25, "y": 25 },
			  "points": [
				{ "x": 25, "y": 1 },
				{ "x": 26, "y": 1 }
			  ]
			}
		
Промпт описания окружности 2
			Ты не рисуешь изображение, а описываешь фигуру через координаты точек.
			Нужно задать ровную окружность в виде списка точек контура.

			Используй сетку 50×50 с координатами от 0 до 49.
			Точка (0,0) — левый верхний угол.
			Центр окружности находится в точке (25,25).

			Выбери радиус так, чтобы окружность полностью помещалась в сетке.
			Указывай только точки контура, без заливки.

			Начни с точки окружности { "x": 46, "y": 13 } и двигайся по часовой стрелке.
			Точки должны идти по порядку, с минимальным шагом, без пропусков.
			Не используй внешние инструменты или программные расчёты.
			Ответ должен представлять собой последовательность точек обхода контура.

			Ответ верни строго в формате JSON:

			{
			  "grid_size": 50,
			  "center": { "x": 25, "y": 25 },
			  "points": [
				{ "x": 46, "y": 13 }
			  ]
			}

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

			Используй сетку 50×50 с координатами от 0 до 49.
			Точка (0,0) — левый верхний угол.
			Центр окружности находится в точке (25,25).

			Выбери радиус так, чтобы окружность полностью помещалась в сетке.
			Указывай только точки контура, без заливки.

			Начни с точки окружности { "x": 4, "y": 37 } и двигайся против часовой стрелки.
			Точки должны идти по порядку, с минимальным шагом, без пропусков.
			Не используй внешние инструменты или программные расчёты.
			Ответ должен представлять собой последовательность точек обхода контура.

			Ответ верни строго в формате JSON:

			{
			  "grid_size": 50,
			  "center": { "x": 25, "y": 25 },
			  "points": [
				{ "x": 4, "y": 37 }
			  ]
			}

		

Можно было бы ожидать, что стартовая точка и направление обхода не должны существенно влиять на результат. Однако эксперимент показал обратное. Ниже приведены результаты трёх запусков одного и того же задания для GPT-5.2.

В первом случае — старт с верхней точки и движение по часовой стрелке — модель практически не испытала затруднений и показала высокий результат (Score: 94.88%).

Во втором запуске, со стартовой точкой на ~330°, бедняку знатно раскорежило: окружность «повело», что сразу отразилось на метрике (Score: 84.18%).

Третий вариант оказался самым показательным: при старте в районе 150° и движении против часовой стрелки модель, по всей видимости, потеряла ориентацию обхода (даже не нашла стартовую точку). Вместо окружности получилась форма, напоминающая сердечко, а итоговый результат снизился до 76.32%.


GPT-5

GPT-4o

И если на GPT-5 к адекватности функции вилидации еще не было особых вопросов, то после проверки на GPT-4o стало очевидно: некоторые окружности (явно круглее других) имеют низкий score по сравнению с совсем кривыми экземплярами. Пошли переписывать функцию оценки. В этот раз логику анализа указал в явном виде: на первом шаге ищем центр фигуры, беря среднее арифметическое от всех x и от всех y. На втором шаге получаем список всех радиусов, беря расстояния от полученного центра до каждой точки из данных. На третьем вычисляем средний радиус. Далее получаем суммарное отконение радиусов от среднего.

function scoreCircle($data)
{
    if (
        !isset($data['points']) ||
        !is_array($data['points']) ||
        count($data['points']) < 5
    ) {
        return 0;
    }

    $points = $data['points'];
    $n = count($points);

    // === 1. Центр фигуры (centroid) ===
    $sumX = 0;
    $sumY = 0;

    foreach ($points as $p) {
        if (!isset($p['x']) || !isset($p['y'])) continue;
        $sumX += $p['x'];
        $sumY += $p['y'];
    }

    $cx = $sumX / $n;
    $cy = $sumY / $n;

    // === 2. Радиусы до центра ===
    $radii = [];

    foreach ($points as $p) {
        if (!isset($p['x']) || !isset($p['y'])) continue;

        $dx = $p['x'] - $cx;
        $dy = $p['y'] - $cy;

        $radii[] = sqrt($dx * $dx + $dy * $dy);
    }

    if (count($radii) < 5) return 0;

    // === 3. Средний радиус ===
    $r_mean = array_sum($radii) / count($radii);
    if ($r_mean <= 0) return 0;

    // === 4. Средняя нормализованная ошибка ===
    $error_sum = 0;

    foreach ($radii as $r) {
        $error_sum += abs($r - $r_mean) / $r_mean;
    }

    $mean_error = $error_sum / count($radii);

    // === 5. Итоговый скор ===
    $score = (1 - $mean_error) * 100;

    if ($score < 0) $score = 0;
    if ($score > 100) $score = 100;

    return round($score, 2);
}
		
		

Score, полученные по новой функции:


GPT-5 (Обновленный score)

GPT-4o (Обновленный score)

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

Модель Круг №1
Старт сверху
Круг №2
Старт ~330°
Круг №3
Старт ~150°
Итоговый
Score
GPT-5.2 93.32% 83.34% 79.04% 85.23%
GPT-4o 90.62% 96.06% 74.89% 87.19%

Итог

На самом деле, я ожидал, что окружности будут круглыми, потому что, что-что, а в тренировочных данных моделей подобных примеров должно быть огромное количество. Но оказалось, что описать окружность координатами для модели задача не такая уж и тривиальная. Даже на одной и той же фигуре и при одинаковых ограничениях стартовая точка и направление обхода заметно влияют на результат. Конечно, для корректного сравнения стоит делать не три запуска на модель, а хотя бы сотню, меняя стартовую точку, направление обхода (а возможно, и центр или радиус). При этом процесс оценки несложно автоматизировать: достаточно JSON-ответа от модели и прогона через функцию расчёта.

Насколько я понимаю, эксперимент можно отнести к задачам пространственного мышления (spatial reasoning). Разумеется, я не первый, кто использует координатный вывод, однако в таком виде (с оценкой устойчивости формы при изменении стартовых условий) подобного теста, насколько я понял, в open-bench стандартах сейчас нет. Всё описанное выше - это простой прототип бенчмарка для оценки устойчивости пространственной репрезентации через координатное описание формы.


Промпты, функицию и json тестов закинул на гит: GitHub


А вот тут можете попробовать сами порисовать

Если хотите заценить насколько круглый круг получится у вашей модели - возьмите промпты выше, а если нарисовать другую фигуру - шаблон промпта вот:

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

				Нужно изобразить [ОПИСАНИЕ ФИГУРЫ ИЛИ СЦЕНЫ] в виде точек контуров.
				Это может быть один объект или несколько отдельных объектов.

				Используй сетку 50×50 с целочисленными координатами от 0 до 49.
				Точка (0,0) — левый верхний угол.

				Каждый объект должен быть представлен как последовательность точек его контура.
				Точки должны идти по порядку обхода, с минимальным шагом, без пропусков.
				Заливку не используй — только контуры.

				Если объектов несколько:
				— располагай их так, чтобы они не пересекались;
				— все точки выводи в одном общем списке, в порядке рисования объектов.

				Не используй внешние инструменты или программные расчёты.
				Ответ должен быть результатом последовательного обхода контуров.

				Ответ верни строго в формате JSON:

				{
				  "grid_size": 50,
				  "center": { "x": 25, "y": 25 },
				  "points": [
					{ "x": 25, "y": 5 },
					{ "x": 26, "y": 5 }
				  ]
				}

			
Результат ответа вашей модели:

Галерея вашего творчества

Ник: @new_world_creator
Модель: GPT-4o
Идея: Окружность 3
Score: 74.89%
Ник: @new_world_creator
Модель: GPT-4o
Идея: Окружность 2
Score: 96.06%
Ник: @new_world_creator
Модель: GPT-4o
Идея: Окружность 1
Score: 90.62%
Ник: @new_world_creator
Модель: GPT-5.2
Идея: Окружность 3
Score: 79.04%
Ник: @new_world_creator
Модель: GPT-5.2
Идея: Окружность 2
Score: 83.34%
Ник: @new_world_creator
Модель: GPT-5.2
Идея: Окружность 1
Score: 93.32%
Ник: @new_world_creator
Модель: GPT-5.2
Идея: Окружность
Score: 94.52%

<< На главную