Isham Faizal выложил визуализатор внимания языковой модели. Страница с готовыми примерами: наводите курсор на любой сгенерированный токен и видите подсветку прошлых токенов, из которых модель тянула информацию для него. Работает прямо в браузере — React плюс Transformers.js, модель на 600 миллионов параметров. Часть промптов предгенерирована и открывается мгновенно, потому что модель весит сотни мегабайт и ждать её загрузки ради первого кадра никто не будет.
Автор сразу оговаривает упрощение. Подсвечивается вес внимания, умноженный на величину value-вектора, агрегированный по всем головам и просуммированный по всем слоям; полученное одно число на токен переводится в прозрачность, максимум непрозрачен, остальное интерполируется. Информации выброшено много, и он честно пишет, что сомневался, будет ли результат вообще читаемым.
Чтобы достать эти внутренние значения, пришлось лезть в модель. Transformers.js работает с .onnx-файлом, вычисления идут в wasm, наружу отдаются только заранее объявленные выходы. Автор небольшим скриптом правил сам onnx-файл, выставляя нужные внутренние значения в выходы, и залил инструментированную модель в свой репозиторий на Hugging Face. Штатный цикл генерации для этого не годится, его он переписал вручную.
Что видно на примерах
В примере с конспектом офисного переезда наведение на дословно скопированные адрес и даты резко подсвечивает исходные данные в промпте. Автор объясняет этим свой давний вопрос: почему модель, предсказывающая следующий токен вероятностно, так надёжно копирует и не сыпется на случайной ошибке. Она не восстанавливает строку из ограниченного внутреннего состояния — у неё есть доступ ко всем прошлым токенам, и при копировании она тянет прямо оттуда, поэтому шанс ошибки низкий.
В примере с отладкой функции модель на 600 миллионов параметров воспроизводит целую JS-функцию, изменив ровно то, что просили. Саму проблему в коде она найти не смогла, автор давал подсказки. Ещё одно наблюдение: слово «remain» во фразе про пропуска и телефоны подтягивает одновременно «work» из одной формулировки и «stay the same» из другой, склеивая обе.
Прикладной вывод отсюда прямой. Если в ответе нужна точная строка — номер счёта, дата, артикул, кусок кода — она должна лежать в контексте дословно. Тогда модель копирует, а копирование у неё надёжное. Пересказ вместо цитаты, суммаризация чанка перед подачей в контекст, «сожмём документ, чтобы влезло в окно» — все эти приёмы отбирают у модели то, из чего она копирует, и переводят ответ в режим восстановления по весам, где и живут выдумки. Тот же принцип объясняет, почему в базе знаний лучше хранить исходный абзац рядом с его пересказом, а в контекст класть оба.
Границы у этой картинки жёсткие. 600 миллионов параметров — маленькая модель, у больших слоёв больше и ведут они себя иначе, переносить наблюдения один в один нельзя. Одно число на токен не объясняет, почему модель ответила именно так, — это иллюстрация механизма, а не отладчик промптов.
Откройте свой поисковый пайплайн и посмотрите, что доезжает до контекста: исходные строки документов или их пересказ. Если пересказ — начните с полей, где нужна точность, и подавайте их дословно.
