На семинаре Stanford CS547 HCI Seminar, организованном Стэнфордским университетом, профессор Тяньи из Университета Пердью представил концепцию «взаимного заземления» (mutual grounding) в программировании с помощью ИИ. Вместо привычного линейного диалога, где человек лишь пассивно отдает текстовые команды, его исследовательская группа предлагает перейти к двустороннему сотрудничеству, основанному на классической теории коммуникации. В докладе были продемонстрированы инновационные инструменты и методы, которые позволяют разработчикам лучше понимать «мысли» больших языковых моделей, направлять их внимание на уровне отдельных токенов и эффективно исправлять локальные ошибки без полной перегенерации кода.
📜 От Эдсгера Дейкстры до «вайб-кодинга»: эволюция программирования на естественном языке 0:10
Программирование с помощью инструкций на обычном человеческом языке сегодня модно называть термином «вайб-кодинг». Однако сама концепция зародилась задолго до появления современных LLM. Одним из первых примеров была система LUNAR, созданная на рубеже 1960–1970-х годов для анализа лунных пород, доставленных на Землю миссиями Apollo. Ученым-геологам приходилось составлять сложные формальные запросы на основе исчисления предикатов первого порядка с обилием кванторов и переменных. LUNAR предлагала семантический анализатор на основе правил, который распознавал паттерны в обычной речи исследователей и переводил их в строгие логические конструкции. Другим известным примером той эпохи стала диалоговая система SHRDLU, разработанная Терри Виноградом в Стэнфордском университете.
Далеко не все ученые разделяли этот оптимизм. Известный нидерландский ученый Эдсгер Дейкстра назвал идею программирования на естественном языке глупостью. По его мнению, между неформальной, склонной к двусмысленности человеческой речью и формальными языками программирования существует непреодолимое фундаментальное противоречие. Дейкстра, будучи ярким приверженцем структурного программирования и математического формализма, утверждал, что индустрии нужно создавать более совершенные высокоуровневые формальные языки, а не адаптироваться к хаотичной структуре человеческой речи. Как отмечает спикер, исторически Дейкстра оказался прав: последние 50 лет человечество укрощало вычислительную мощность компьютеров именно через строгие высокоуровневые языки вроде Java и Python.
Профессор Тяньи выделил две фундаментальные проблемы программирования на естественном языке, которые остаются нерешенными даже в эпоху современных нейросетей:
- Внутренняя двусмысленность: одно и то же текстовое описание задачи может быть интерпретировано множеством разных способов, что порождает массу некорректных вариантов кода. Из-за этой размытости не существует надежного автоматического критерия («оракула»), способного определить, какой именно вариант программы точен.
- Бесконечное пространство поиска: в отличие от настольных игр вроде Го, где размер поля и количество комбинаций колоссальны, но все же ограничены, синтаксис языков программирования позволяет создавать бесконечно длинные и сколь угодно сложные цепочки. Процесс усложняется строгими правилами семантики, а также тысячами сторонних библиотек и API, которые необходимо учитывать при сборке программы.
🛠️ Доэпоха LLM и революция Codex 5:36
До появления современных больших языковых моделей компьютерная наука пыталась решить проблему синтеза кода тремя основными путями:
- Сужение пространства поиска: переход от бесконечного синтаксиса к жестко ограниченным предметно-ориентированным языкам (DSL) с компактной контекстно-свободной грамматикой. Это позволяло алгоритмам эффективнее находить нужные кандидаты программ.
- Обогащение модальности ввода: объединение текстового описания с конкретными примерами ввода-вывода (input-output), пользовательскими демонстрациями или готовыми каркасами (скелетами) кода. Это удерживало семантические парсеры от чрезмерного обобщения интента пользователя.
- Эволюция архитектур: создание более продвинутых моделей — от n-gram в начале 2010-х годов к рекуррентным сетям RNN и LSTM в 2015-м и полноценным трансформерам после 2018 года.
Ситуация кардинально изменилась в 2021 году после релиза моделей Codex и GitHub Copilot. Впервые ИИ продемонстрировал способность генерировать крупные рабочие блоки кода из обычного текста, причем без привязки к узкому домену. Профессор Тяньи вспоминает, что в тот момент он сам работал над синтезом регулярных выражений с помощью DSL и SMT-солверов методом восходящего перечислительного поиска. Увидев демо Codex, он понял, что обязан полностью изменить вектор своих исследований: наступала эра, когда люди начнут массово кодить на естественном человеческом языке. За последние годы ИИ-агенты стали еще мощнее: они научились использовать внешние инструменты (браузер, терминал), составлять планы, поглощать огромные контексты в рамках целых репозиториев и заниматься самоисправлением.
🔄 Переход к «взаимному заземлению»: три метода профессора Тяньи 8:48
Несмотря на технологический скачок, любой, кто регулярно кодит с помощью ИИ, сталкивается с фрустрацией: модель периодически не понимает инструкцию, а при попытке дать дополнительные уточняющие промпты код становится только хуже. Исследовательская группа из Университета Пердью обратила внимание на то, что текущий интерфейс взаимодействия глубоко линеен. Человек выступает в роли жесткого драйвера, безостановочно отдающего приказы, а языковая модель лишь пассивно и изолированно на них отвечает.
В реальном человеческом общении коммуникация устроена иначе. Люди постоянно меняются ролями, перехватывают инициативу, повторяют услышанное для подтверждения, задают вопросы при обнаружении двусмысленностей и меняют тон или уровень детализации, чтобы выделить главное. В лингвистике этот процесс называют «заземлением» (опираясь на Grounding Theory Кларка и Бреннана). Инспирированная этой теорией команда профессора Тяньи разработала три метода, позволяющих выстроить полноценный двусторонний диалог между программистом и LLM.
1. Пошаговое объяснение и ментальная модель ИИ
Первый метод направлен на то, чтобы заставить модель «объяснить» человеку свое понимание задачи. Из-за сложнейших вычислений внутри нейросети напрямую извлечь ее минимальную логическую модель невозможно. Ученые пошли по пути поговорки «поступки говорят громче слов»: сгенерированная программа сама по себе является честным отражением ментальной модели ИИ.
Алгоритм взаимодействия выглядит так:
- Модель пишет исходный код на основе первичной мысли пользователя.
- Интерфейс раскладывает этот код обратно в пошаговое текстовое объяснение на естественном языке.
- Программист изучает этот текст как строительные леса (scaffold). Он может точно указать, на каком шаге модель свернула не туда, и отредактировать конкретную строчку объяснения, указав верную логику рассуждений.
- Вместо генерации всего кода с нуля, модель точечно переписывает только тот фрагмент кода, который отвечает за ошибочный текстовый шаг.
Этот метод был успешно протестирован в нескольких доменах: генерация SQL-запросов, веб-автоматизация, обработка данных (data wrangling) и написание кода на Python. Тесты показали существенное сокращение времени выполнения задач. Примечательно, что в сфере SQL и веб-автоматизации пошаговые текстовые объяснения полностью стерли разрыв в продуктивности между новичками и экспертами. Новичкам тяжело читать синтаксис кода, но когда логика ИИ развернута в обычный текст, они мгновенно понимают, где закралась ошибка, и дают точный точечный фидбек. Дополнительно интерфейс позволяет ставить брейкпоинты прямо на текстовые шаги объяснения, отлаживая логику промпта, а также подсвечивать визуальное соответствие между словами в запросе и итоговыми столбцами или строками в таблицах данных.
Главным вызовом проекта стала надежность текстовых объяснений. В 2021–2022 годах модели GPT часто галлюцинировали при описании кода. Профессор Тяньи подчеркивает свою крайнюю осторожность в отношении галлюцинаций в интерфейсах, формирующих человеческое мышление: в отличие от генерации исполнимого кода, где ошибку может отловить внешняя среда или компилятор, в процессе размышлений контролировать ИИ гораздо сложнее. Поэтому команда создала жесткий символьный метод: программа (например, SQL-запрос) декомпозируется строго по правилам ее грамматики, после чего каждый элемент переводится в текст по заранее прописанным шаблонам-трансляторам. Это полностью исключило элемент случайности и галлюцинаций в объяснениях.
🎯 Инструмент Dango: уточняющие вопросы вместо угадывания 19:25
Второй метод наделяет языковую модель способностью самостоятельно задавать уточняющие вопросы. Попытки просто промптить ИИ вопросом «есть ли тут двусмысленность» провалились, так как это не задействовало логические мощности LLM. Процесс разбили на последовательные этапы:
- Модель резюмирует и интерпретирует интент пользователя собственными словами.
- На основе полученного резюме ИИ оценивает, есть ли в запросе слепые зоны и неопределенности.
- В случае обнаружения неоднозначности модель формулирует уточняющий вопрос. При этом команда применила интерфейсный принцип «узнавания, а не вспоминания» (recognition over recall): вместо открытого громоздкого вопроса ИИ делает обоснованные предположения и предлагает пользователю готовые варианты ответа в виде теста (multiple-choice), сохраняя при этом текстовое поле для кастомного ответа.
На базе этой механики была спроектирована система Dango для автоматизации очистки и трансформации электронных таблиц. При демонстрации работы Dango пользователь загружает таблицы и просит провести «корреляционный анализ» между столбцами, намеренно не уточняя конкретную математическую модель. Инструмент распознает абстрактность формулировки и предлагает меню выбора: запустить корреляцию Пирсона, Спирмена или провести t-тест. После клика на нужный вариант система генерирует код и символьное объяснение. На следующем шаге пользователь просит «удалить столбец, если обнаружена статистически значимая корреляция». Dango видит новую двусмысленность — в процессе участвуют два столбца — и выводит четкое меню с вопросом: «Какой именно из двух столбцов вы хотите отбросить?». Получив клик, система собирает обновленный единый скрипт трансформации.
В пользовательском исследовании Dango приняли участие 33 студента Университета Пердью с самым разным бэкграундом — от классического Computer Science до химии, биоинженерии и машиностроения. Сравнивались три конфигурации: обычный интерфейс в стиле ChatGPT с текстом от GPT-4; интерфейс с символьными пошаговыми объяснениями; и полная версия с подключенными уточняющими вопросами. Анализ логов активности, разложенных по нормализованной временной шкале, показал: активное вовлечение пользователей в ответы на структурированные вопросы ИИ не только ускорило решение задач, но и радикально снизило частоту галлюцинаций языковой модели. Четкие детали, полученные на раннем этапе через систему меню, заземлили ИИ и не позволили ему уйти в ложные фантазии.
⚓ Механизм SPARK: управление вниманием нейросети 25:36
Третий метод — селективное закрепление промпта (selective prompt anchoring) — позволяет человеку вручную управлять фокусом внимания нейросети, подсвечивая в длинных инструкциях слова, которые модель рискует проигнорировать. Профессор продемонстрировал это на функции count_upper, которая должна считать заглавные гласные строго на четных индексах переданной строки. Стандартная LLM выдала внешне рабочий код, но пропустила слово uppercase, собрав массив гласных в нижнем регистре. Стоило пользователю выделить мышкой слово uppercase и нажать кнопку «закрепить» (anchor), как модель мгновенно перестроила логику генерации и учла это жесткое ограничение.
Самым очевидным способом реализации такой механики является прямое изменение весов на матрицах внимания (attention scores) внутри блоков трансформера. Однако это сопряжено с колоссальными вычислительными трудностями. Даже относительно небольшая современная модель Llama 3.1 8B состоит из 32 слоев, в каждом из которых работает по 32 головы внимания — суммарно инженерам нужно манипулировать 1024 головами.
Существующий аналог PASTA (представленный на конференции ICLR 2024) решает это за счет предварительного профилирования, вычисляя, какие именно головы отвечают за конкретный тип задач. Но этот подход требует огромных мощностей: для точного обнаружения нужных голов системе PASTA необходимо прогнать минимум 1000 предварительных инстансов.
Команда профессора Тяньи создала альтернативный фреймворк SPARK (Selected Prompt Anchoring Spot), который аппроксимирует управление вниманием путем прямой манипуляции логитами на самом последнем слое трансформера.
Математический пайплайн SPARK устроен следующим образом:
- Запускаются два параллельных процесса декодирования: один с оригинальным текстом промпта, второй — со скрытым (замаскированным) целевым словом, внимание к которому нужно скорректировать.
- Вычисляется разница распределения логитов между этими двумя прогонами. Если маскирование слова приводит к резкому падению вероятности конкретного токена кода, значит, это слово напрямую влияло на его генерацию.
- Полученная разница логитов умножается на специальный регулируемый гиперпараметр — силу закрепления $\omega$ (омега), после чего значение прибавляется к финальному распределению.
Варьируя параметр $\omega$, разработчик может гибко менять поведение нейросети:
- $\omega > 1$: влияние выделенного фрагмента промпта на генерацию токенов агрессивно усиливается.
- $\omega = 1$: влияние нейтрально, формула выдает стандартный фабричный промпт без изменений.
- $0 < \omega < 1$: внимание модели к выделенному тексту принудительно ослабляется.
- $\omega = 0$: токен полностью исключается из расчетов (эквивалентно полному игнорированию слова ИИ).
- $\omega < 0$: эффект инвертируется (например, если закрепить слово
uppercaseс отрицательным коэффициентом, модель начнет усиленно генерировать логику для букв в нижнем регистреlowercase).
Эффективность SPARK протестировали на различных бенчмарках и архитектурах. Алгоритм показал стабильный прирост качества кода даже на ультрамалых специализированных моделях вроде CodeGen с 350 миллионами параметров. Главным преимуществом SPARK стали рекордно низкие накладные расходы (overhead). В отличие от PASTA, системе не нужно тяжелое предварительное вычисление голов. А в отличие от популярных агентских подходов вроде ReAct или алгоритмов самоотладки (self-debugging), SPARK не тратит ресурсы и время на генерацию бесконечных цепочек рассуждений и итеративных правок, меняя вероятности токенов «на лету» в один проход.
🔮 Будущее ИИ-разработки и вызовы для образования 34:59
Размышляя над тем, сохранят ли данные методы актуальность через 5–10 лет на фоне стремительного прогресса базовых моделей, профессор Тяньи дает твердый утвердительный ответ. По его мнению, кодинг-агенты никогда не станут аналогами современных компиляторов. Когда мы пишем код на Си или Python, мы не проверяем итоговый байт-код или ассемблер, поскольку компилятор обладает 100-процентной точностью, заложенной математически. С нейросетями ситуация иная: они ошибаются непредсказуемо. Модель может легко споткнуться на элементарном условии и выдать абсурдную ошибку, но в то же время блестяще решить комплексную архитектурную задачу. Из-за этого программистам в любом случае придется перепроверять каждую строчку сгенерированного кода. Если вы не верите, что через 10 лет ИИ-агенты достигнут абсолютной безошибочности во всех сферах, то любые инструменты взаимного заземления, верификации и построения контролируемого доверия будут критически востребованы.
Эффект для обучения программированию
В ходе сессии вопросов и ответов участники семинара подняли острую тему влияния ИИ-ассистентов на высшее образование. Профессор Тяньи подчеркнул, что экономика затрат на кодинг кардинально отличается для разных групп. Для опытного инженера ChatGPT и Copilot — это великолепный инструмент, экономящий время на механический набор текста (keystrokes), так как эксперт держит в голове идеальный чертеж архитектуры и за доли секунды видит огрехи генерации. Но для новичка, лишенного интерактивной поддержки, процесс превращается в катастрофу. Получив неработающий код, студент вынужден часами читать и отлаживать его — а это именно те навыки, которыми он владеет хуже всего. Исследование, проведенное Тяньи совместно с профессором Еленой Глассман, наглядно зафиксировало этот паттерн: Copilot дает мощнейшее ускорение экспертам, но заставляет новичков мучительно буксовать.
Этот тектонический сдвиг должен стать принудительным стимулом для реформы университетских учебных планов по Computer Science. По мнению спикера, академиям пора прекратить заставлять студентов зазубривать синтаксические правила и операторы конкретных языков, чтобы просто избегать ошибок компиляции — с удержанием синтаксиса в памяти LLM справляются идеально.
Вместо этого фокус обучения необходимо сместить на принципиально другие навыки:
- Глубокое чтение и понимание структуры чужого (в том числе сгенерированного машиной) кода.
- Освоение продвинутых методик сквозной отладки (debugging).
- Понимание архитектурных графов, графов зависимостей и потоков данных (data flow).
- Формирование эстетического вкуса к хорошему стилю кодирования.
В качестве планов на будущее исследовательская группа из Пердью планирует дополнить свои пошаговые текстовые объяснения новыми аналитическими слоями. В интерфейсы SPARK и Dango планируется интегрировать автоматическую подсветку потенциальных уязвимостей (security) и оценку вычислительной сложности алгоритмов (efficiency) с демонстрацией альтернативных безопасных паттернов, что сделает концепцию взаимного заземления незаменимым стандартом профессиональной индустриальной разработки.