Архитектура современных LLM и специфика работы с контекстным окном
Архитектура современных LLM и специфика работы с контекстным окном
Представьте ситуацию: вы загружаете в нейросеть 50-страничную спецификацию банковского продукта и просите сгенерировать для нее BDD-сценарии на Gherkin. Модель думает минуту, а затем выдает ошибку превышения лимита, либо генерирует отличный код, но полностью забывает или искажает правила из начала документа. Почему так происходит? Ответ кроется в фундаментальной архитектуре современных больших языковых моделей (LLM) и жестких математических ограничениях их «краткосрочной памяти».
Чтобы успешно пройти техническое интервью на позицию инженера AI-агентов, недостаточно уметь отправлять запросы к API. Нужно понимать, как модель обрабатывает текст под капотом, почему контекстное окно стоит дорого и почему мы не можем просто передать всю корпоративную базу знаний в одном запросе.
Токенизация: как модель видит текст
LLM не читают текст по буквам или словам. Текст разбивается на базовые единицы — токены.
Токен может быть целым словом, слогом или даже отдельным символом (особенно для редких языков или спецсимволов в коде). В среднем для английского языка 1 токен равен примерно 0.75 слова. Для русского языка или специфичного синтаксиса Gherkin (например, Given, When, Then) токенизация может быть менее эффективной: одно слово часто разбивается на 2-3 токена.
Это критически важно для инженерии AI-агентов по двум причинам:
- Биллинг: Провайдеры (OpenAI, Anthropic) тарифицируют API по количеству токенов, а не символов.
- Лимиты: Контекстное окно модели измеряется строго в токенах.
Сердце LLM: Трансформеры и механизм Self-Attention
Современные LLM (от GPT-3 до Llama 3) построены на архитектуре Transformer. Главное нововведение этой архитектуры, позволившее совершить революцию в AI, — механизм Self-Attention (внимание к себе).
Когда модель обрабатывает последовательность токенов, она не читает их строго слева направо по одному. Она анализирует все токены одновременно и вычисляет математический вес связи каждого токена с каждым другим токеном в текущем окне.
Например, в предложении «Банк одобрил кредит, потому что у него была хорошая история», механизм Self-Attention помогает модели понять, что слово «него» относится к клиенту, а не к банку, выстроив сильную математическую связь между этими токенами.
Квадратичная сложность: цена понимания
Вычисление связей «каждый с каждым» имеет свою цену. Вычислительная сложность механизма Self-Attention составляет , где — количество токенов в контекстном окне.
Что это значит на практике для инженера? Если вы увеличиваете объем входного промпта в 2 раза (например, передаете не 10, а 20 существующих BDD-шагов в качестве примеров), количество вычислений, которые должна сделать видеокарта (GPU), вырастает в 4 раза. Если увеличиваете в 10 раз — вычисления растут в 100 раз.
Именно поэтому обработка длинных контекстов требует огромных объемов видеопамяти (VRAM) и занимает больше времени (растет метрика Time-to-First-Token — время до генерации первого слова ответа).
Анатомия контекстного окна
Контекстное окно — это вся оперативная память модели на один цикл взаимодействия. Это жесткий лимит , который делится на две части: входные данные (Input) и выходные данные (Output).
В контексте создания AI-агента для генерации BDD-сценариев, ваш Input () будет состоять из:
- System Prompt: Инструкции для модели («Ты — QA-инженер в банке...»).
- Context (База знаний): Существующие шаги Gherkin (
step_definitions), которые модель должна переиспользовать. - User Input: Функциональные требования, которые нужно покрыть тестами.
Output () — это сгенерированный моделью .feature файл.
Если лимит модели составляет 8000 токенов, и вы передали в Input 7500 токенов (загрузив туда сотни существующих шагов), у модели останется всего 500 токенов на генерацию ответа. Сценарий просто оборвется на середине.
Проблема длинного контекста: "Lost in the Middle"
Современные модели заявляют огромные контекстные окна (128k, 200k и даже 1M токенов). Казалось бы, проблема решена? Можно просто выгрузить весь банковский BDD-фреймворк в промпт и попросить написать тест.
На практике это плохой архитектурный паттерн. Помимо огромной стоимости каждого такого запроса и высокой задержки (latency), возникает эффект Lost in the Middle (потеря в середине).
Исследования показывают, что LLM отлично извлекают информацию из самого начала промпта и из его самого конца. Но точность извлечения фактов, спрятанных в середине длинного текста, резко падает — модель начинает «галлюцинировать» или просто игнорировать эти данные. Если нужный BDD-шаг для переиспользования оказался в середине огромного промпта, модель с высокой вероятностью его проигнорирует и придумает свой собственный, нарушив стандартизацию.
Мост к RAG
Мы приходим к инженерному противоречию:
- Нам нужно передать модели знания о существующих шагах Gherkin в кодовой базе банка, чтобы она их переиспользовала.
- Мы не можем передать всю кодовую базу в промпт из-за лимитов окна, стоимости, квадратичной сложности и эффекта Lost in the Middle.
Решение этой проблемы — передавать в контекстное окно не все шаги, а только релевантные для конкретной задачи. Именно эту задачу решает архитектура RAG (Retrieval-Augmented Generation), которую мы детально разберем на следующем этапе.