О нюансах работы приложений на базе искусственного интеллекта

Когда разработчик получает задачу, он сначала декомпозирует её: разбивает на части, ищет зависимости, проектирует решение, а затем пишет код.

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

Это не ошибка архитектуры. Это фундаментальный принцип работы трансформеров. Из него следуют почти все странности, с которыми сталкиваются разработчики: почему контекст в миллион токенов — не панацея, почему «thinking-модели» не думают, и почему RAG — не магия, а надстройка над ограниченным инструментом.

Эта статья — о том, как устроены модели и RAG-системы, и почему пора перестать очеловечивать ИИ и считать его магией.

Как всё начиналось

До появления трансформеров языковые модели строились на RNN и LSTM. Они обрабатывали текст последовательно — слово за словом. Это делало их медленными при обучении и неспособными улавливать дальние связи. Архитектура «внимания» решила обе проблемы. Сегодня индустрия почти полностью перешла на трансформеры, оставив RNN для узких задач, например, временные ряды.

Чем RNN отличались от трансформеров

Способ обработки

RNN / LSTM: последовательный. Чтобы понять пятое слово, нужно обработать первые четыре.

Трансформер (LLM): параллельный для энкодера. Декодер при генерации последователен, но с параллелизацией вычислений внимания к уже сгенерированным токенам (через KV-кэш).

Память о прошлом

RNN / LSTM: фиксированный вектор ht (скрытое состояние), который перезаписывается на каждом шаге.

Трансформер: динамически вычисляемые веса внимания. Они не хранятся между шагами, а пересчитываются.

Дальние связи

RNN / LSTM: расстояние = количество шагов. Чем дальше слова, тем сложнее установить связь (градиент затухает).

Трансформер: любое слово может «видеть» любое другое за один шаг внимания, но в декодере — с учётом авторегрессии.

Параллелизация

RNN / LSTM: плохо параллелится. GPU простаивает.

Трансформер: хорошо параллелится благодаря self-attention и отсутствию последовательных зависимостей внутри энкодера.

Современные LLM — это декодерные трансформеры без отдельного энкодера. Они решают проблему фиксированной длины контекста несколькими способами:

  • окна контекста
  • механизмы обработки сверхдлинных контекстов
  • позиционные кодировки (RoPE, ALiBi)

Почему контекст ограничен

Вместо развития неограниченного линейного алгоритма разработчики моделей выбрали путь ограничения контекстных окон и параллелизации. Это не ошибка, но компромисс. Тензор не бесконечен. Мы упёрлись в физические ограничения: для консистентного вывода нужны огромные контексты, а перебор при их обработке требует времени.

Миллион токенов — много или мало? Для чата, простых запросов или написания небольшого сервиса — достаточно. Но для сложных задач, требующих учёта множества нюансов, — катастрофически мало.

Что значит O(n²) для внимания?

В механизме self-attention каждый токен должен вычислить связь с каждым другим. Для последовательности длиной n это:

  • O(n²) операций
  • O(n²) памяти для хранения матрицы внимания (или её разреженных аналогов)

Главное ограничение — не вычисления, а память. Хранение полной матрицы 1M×1M в формате float32 требует около 4 ТБ. Современный GPU может выполнить триллион операций, но не удержать терабайты данных.

На практике используются ухищрения:

  • разреженное внимание (sparse attention)
  • скользящее окно
  • FlashAttention (линейная память)
  • линейные аппроксимации (Linformer, Performer)

Даже миллион токенов — это не панацея. Модель «забывает» середину диалога не из-за плохой памяти, а потому что архитектура физически не способна удерживать все связи одновременно.

Мыслящие (нет) машины

Разберёмся с thinking- и instruct-моделями. Главное отличие — как и когда модель «думает» над ответом. Правильный ответ: она никогда не думает. Она может только имитировать.

  • Instruct-модель: получает задачу — сразу генерирует ответ. Всё «мышление» скрыто внутри сети.
  • Thinking-модель: получает задачу — сначала генерирует цепочку рассуждений (chain-of-thought), пробует разные подходы — затем выдаёт финальный ответ.

Никакого отдельного «движка логики» нет. Всё, что выглядит как рассуждение, — это обычная генерация токенов по статистическим паттернам из обучающих данных. Если модель ошиблась, она не «исправится». Она может сгенерировать «подождите, это неверно» только если такие фразы были в данных.

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

Про движки и понимание

Когда мы обращаемся к модели, важно помнить: это не единый интеллект, а набор специализированных модулей. Например, при переводе модель не понимает, что статья о пчёлах на испанском — это та же статья на немецком. Она не «знает», что это один объект. Она видит последовательности токенов и учится предсказывать другие последовательности.

Если в немецких научных текстах чаще используется пассивный залог, модель это повторит — не потому что поняла стиль, а потому что так было в данных. Семантическая эквивалентность не гарантируется. Только статистическая.

RAG — что это?

RAG (Retrieval-Augmented Generation) — способ дополнить LLM внешним поиском. Это главное практическое решение двух проблем: ограниченного контекста и устаревших знаний. RAG — не замена трансформеру, а надстройка над ним.

В CLI-инструментах вроде Cursor или Claude Code этот цикл повторяется многократно: модель планирует действия, вызывает внешние инструменты (function calling) и проверяет результат.

Программист перед задачей сначала декомпозирует её: архитектор проектирует, тимлид нарезает на таски. Потом разработчик думает, что подключить, и только потом пишет код. Ключевой паттерн — декомпозиция.

LLM — не оракул. Это алгоритм, и не такой уж сложный. Он не выдаёт ответ по волшебству. Он каждый раз перебирает и заполняет матрицу. Представьте, что программист вместо структурного мышления пытается вспомнить все строки кода из всех репозиториев и перебрать, куда что-то можно вставить, пока не получится что-то похожее. При этом полностью игнорируя дедукцию — которой LLM не обладает — и не различая случайные и закономерные корреляции.

Что в итоге?

Работа LLM — это не осознанный поиск, а математически детерминированная операция: softmax над скалярными произведениями. Чтобы модель решала задачи не «нахрапом», а через декомпозицию, её нужно не дообучать, а надстраивать — добавлять логическое ядро, которое будет управлять контекстами, собирать запросы из других запросов и так далее.

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

Анекдоты и абстракции

Идёт суслик по лесу. Навстречу лиса:
— Ты куда?
— На медведя посмотреть.
— Так он спит.
— Ну и пусть.
Идёт дальше. Волк:
— Суслик, ты куда?
— На медведя посмотреть.
— Он же спит!
— Ну и ладно.
Подходит к берлоге, а медведь сидит, газету читает.
— Ты почему не спишь?
— Да вот, суслик какой-то ходит, спать мешает.

Идёт бобёр по лесу. Навстречу лиса:
— Ты куда?
— На медведя посмотреть.
— Так он спит.
— Ну и пусть.
Идёт дальше. Волк:
— Бобёр, ты куда?
— На медведя посмотреть.
— Он же спит!
— Ну и ладно.
Подходит к берлоге, а медведь сидит, газету читает.
— Ты почему не спишь?
— Да вот, бобёр какой-то ходит, спать мешает.

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

Представьте задачу: сопоставить поведение пчёл, муравьёв, бактерий и транспортировку данных. Модель не выведет оригинальный алгоритм, опираясь на природные процессы, если об этом нет статьи на arXiv и нет прямого контекста про хемотаксис. Она знает, что градиентный спуск основан на шуме, но сама не выведет и не подберёт алгоритм с нуля.

По запросу «выведи алгоритм транспортировки данных из поведения бактерий» модель делает следующее:
Извлекает известные паттерны: «бактерии» → хемотаксис → градиентный спуск → аналогия.
Выдаёт стандартный ответ: про стохастический градиентный спуск, локальные минимумы, адаптивный шаг.
Но это не вывод нового алгоритма, а воспроизведение уже описанной в литературе связи.
Модель не сделает следующий шаг: «А что если в задаче нет градиента? Как адаптировать хемотаксис?»
Потому что для этого нужно:
— Выделить инвариант процесса (не «движение к еде», а «асимметричный случайный поиск с памятью»)
— Отделить его от биологического контекста
— Применить к задаче с другой метрикой (например, частота доставки пакета)

Модель может «питаться» описанными идеями, но даже с RAG не способна к истинно креативному мышлению. Человеческий архив знаний — её топливо. RAG позволяет внедрить паттерны обработки, придавая модели подобие унаследованных абстракций.

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

Человек умеет заимствовать абстрактные паттерны из природы, культуры или других дисциплин — даже если прямой связи в литературе нет. Это не мистическая креативность, а иной способ получения знаний, включающий телесный опыт и случайные ассоциации, недоступные модели.

Устройство кодген CLI на RAG

RAG-система (Retrieval-Augmented Generation) сочетает поиск документов с генерацией ответов LLM. Это идеально для CLI-приложений, работающих с кодом.

Компоненты RAG CLI:

  • Эмбеддер: генерирует векторные представления текста
  • Векторное хранилище: хранит и ищет похожие векторы
  • Генератор: создаёт ответ на основе найденного контекста

Эмбеддер превращает запрос в вектор, ищет похожие фрагменты, формирует контекст для LLM, получает результат и обновляет базу.

Но есть важный этап: мышление. Это обработка задачи — начальная, промежуточная, завершающая. Циклы не ограничены.

На запрос «напиши сервис с чатиком» модель сначала определяет, что это такое. Умная RAG CLI включает режим планировщика и уточняет у пользователя детали. Например, Claude Code проходит этап «онбординга» проекта.

После уточнения (например, «браузерный мессенджер») RAG формирует контекст, ищет документацию SDK, фреймворков, сканирует GitHub и npm. На основе собранного контекста начинается планирование: как расположить файлы, что в них писать.

Затем модель пишет код, валидирует его, и цикл продолжается — до остановки по лимиту вызовов или другому критерию. Параллельно пополняется база эмбеддингов.

Как модель ходит в сеть, ищет файлы, записывает код? Она не делает этого напрямую. Она генерирует текст и классифицирует задачи.

Function calling — ключевой механизм. LLM получает описание инструментов в формате JSON-схемы, анализирует запрос и генерирует структурированный вызов. В RAG CLI это встраивается в цикл: агент решает, нужен ли тул, извлекает контекст, вызывает функцию (git clone, npm search, web scrape), получает результат и продолжает.

Модель не исполняет код. Она генерирует JSON с описанием вызова. Исполнение — на внешнем рантайме (CLI, сервер).

Так LLM превращается из «болталки» в ядро принятия решений. Разработка становится сборкой «лоскутного одеяла» из готовых решений — как разработчики брали код со Stack Overflow, так RAG автоматизирует этот цикл.

Итог: модель — не исполнитель

В агентных системах с RAG и function calling модель не вызывает функции напрямую. Она генерирует JSON с описанием вызова. Исполнение — за пределами модели.

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

Новый этап

С приходом LLM ценность «чистого кодера» упала. Но выросла ценность системного мыслителя.

Теперь программист — это не столько исполнитель, сколько архитектор процессов. Прочная база знаний — computer science, логика, статистика, математика, умение применять абстракции — становится ключевым преимуществом.

Именно это позволяет превратить «болталку» в ядро технологий, невозможных ранее.

Читать оригинал