Экспресс-курс · No. 07

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

Только суть · Один образ на идею · Инженерия важнее магии

§ 01

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

Она очень хорошо предсказывает следующее слово

Клавиатура телефона, подсказывающая следующее слово, — но раздутая настолько, что может написать эссе, отладить код или объяснить физику, по одному правдоподобному слову за раз.

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

У неё нет памяти между вызовами

Блестящий консультант с полной амнезией — на каждой встрече ты заново вручаешь ему все документы, потому что с прошлого раза он не помнит ничего.

Модель не помнит ничего между запросами. Её единственная рабочая память — окно контекста, текст, который ты шлёшь в этом вызове. История чата, твои данные, твои инструкции: если этого нет в контексте, модель этого не знает. Весь этот курс в каком-то смысле — о том, что ты кладёшь в это окно.

Она будет выдумывать — уверенно

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

Когда модель не знает, она не останавливается — она галлюцинирует, выдавая гладкий, правдоподобный, неверный текст с той же уверенностью, что и правду. Это не баг, который можно целиком залатать; это природа угадывателя. Бóльшая часть инженерии в этом курсе существует, чтобы управлять этим одним фактом.

Она недетерминирована — так к ней и относись

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

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

LLM не знает вещей. Она их предсказывает. Всё остальное строй вокруг этой одной истины.

§ 02

Промпт — это то, как ты говоришь модели, чего хочешь. Чем яснее инструкция, тем лучше вывод — и большинство моментов «AI тупой» на деле — это нечёткие промпты.

Промпт — это бриф, а не заклинание

Передача задачи толковому новичку: кем он выступает, чего ты хочешь, ограничения и пример «хорошего». Расплывчатый бриф — расплывчатый результат.

Хороший промпт задаёт роль («ты внимательный редактор»), задачу, ограничения (длина, тон, формат) и в идеале пример. Волшебных слов нет — только ясные инструкции, те же, что ты дал бы способному человеку. Большинство проблем с промптами — на самом деле проблемы спецификации.

System vs user: постоянные правила против запроса

Постоянная политика ресторана — «мы вегетарианские, закрываемся в десять» — против конкретного заказа на сегодня. Одно задаёт рамку всему; другое — сам запрос.

System-промпт задаёт устойчивое поведение — роль, правила, тон, — которое держится через весь разговор. User-промпт — это конкретный запрос. Положив персону и guardrails в system-промпт, ты держишь их стабильными, пока сообщения пользователя меняются.

Показывай, а не только рассказывай: few-shot примеры

Научить кого-то формату, показав три готовых примера, быстрее и яснее, чем описывать его словами.

Часто лучший способ получить нужную форму ответа — включить несколько примеров входа и желаемого выхода прямо в промпт («few-shot»). Модель распознаёт их шаблон лучше, чем следует абстрактному описанию. Два-три хороших примера могут побить абзац инструкций.

Проси структуру, которую сможет использовать код

Форма с подписанными полями даёт заполняемые данные; «напиши абзац про это» даёт прозу, которую потом ещё надо парсить.

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

Волшебных слов нет. Хороший промпт — это ясный бриф: роль, задача, ограничения, примеры.

§ 03

Когда приложения становятся серьёзными, ремесло смещается с формулировки промпта на сборку правильного контекста. Это и есть настоящая дисциплина — «инженерия контекста».

Самое сложное — что ты кладёшь в окно

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

«Инженерия промптов» была про формулировку; инженерия контекста — про сборку правильной информации (релевантных фактов, истории и инструментов) в окно для каждого вызова. Ответ модели хорош ровно настолько, насколько хорошо то, что ты положил перед ней. Большинство проблем качества — это проблемы контекста, а не формулировки.

Релевантность важнее полноты

Бриф на одну острую страницу бьёт свалку из 200 страниц — читатель находит сигнал, а не тонет в нём.

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

Окно контекста — это бюджет

Чемодан с лимитом веса — ты кладёшь то, что реально понадобится, а не весь гардероб, потому что есть жёсткий потолок и штраф.

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

Инженерия промптов — это формулировка. Инженерия контекста — это документы. Качество живёт во втором.

§ 04

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

RAG: сначала достань, потом отвечай

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

Retrieval-Augmented Generation означает: взять вопрос пользователя, достать самые релевантные куски твоих документов, положить их в контекст и попросить модель ответить из них. Теперь она работает с твоими реальными данными, а не с расплывчатой памятью. Так ассистенты отвечают про твой продукт, твою документацию, твою базу знаний.

Embeddings и векторный поиск находят нужные куски

Библиотекарь, который находит книги по тому, о чём они, а не по точному заголовку, — «что-то вроде этого», по смыслу.

Чтобы найти релевантные куски, ты хранишь документы как embeddings в векторной базе и ищешь по сходству с вопросом (движок из курса по базам данных). Хорошая выборка — сердце RAG: положи правильные куски — и ответ заземлён; положи мусор — и модель уверенно отвечает из мусора.

Заземление убивает галлюцинации — почти

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

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

Мусор на входе — уверенный мусор на выходе

Дай человеку не тот файл и попроси резюмировать — он выдаст идеальное резюме не того.

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

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

§ 05

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

Использование инструментов: дай ей звать твои функции

Умный ассистент, который сам не дотянется до картотеки, — но может попросить тебя и точно указать, какой файл достать.

При использовании инструментов (function calling) ты описываешь функции, которые модель может запросить, — search_orders, send_email, get_weather, — и когда она хочет одну, она возвращает структурированный вызов, твой код его выполняет, и ты подаёшь результат назад. Модель решает, что делать; твой код держит контроль над тем, как это делается. Так LLM дотягивается за пределы текста в реальный мир.

Агент — это модель в цикле

Человек, решающий задачу: подумать, сделать действие, посмотреть на результат, снова подумать — повторяя, пока не готово, а не за один раз.

Агент вшивает модель в цикл — рассуждай, вызови инструмент, наблюдай результат, рассуждай снова — где LLM как дирижёр решает каждый следующий шаг. Это даёт ей справляться с открытыми задачами («исследуй это и набросай ответ»), которые не осилил бы один промпт. Кодинг-ассистенты и исследовательские боты работают так.

Память за пределами окна

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

Раз окно конечно, агентам нужна память: заметки, сводки и извлекаемая история, хранимые вне контекста и подтягиваемые назад, когда релевантны. Без неё агент к концу длинной задачи забывает её начало. Память — это то, что превращает чат в нечто, способное работать во времени.

Циклы мощны — и опасны

Робот-пылесос, который в основном убирает дом, но иногда застревает, крутясь в углу, или забредает в бассейн.

Цикл агента непредсказуем: он может свернуть не туда, зациклиться, нагнать стоимость или действовать по плохому решению. Поэтому держи его на поводке — лимиты шагов, права на инструменты, одобрение человека для рискованных действий, полное логирование. Тянись за агентом, только когда задаче правда нужно много адаптивных шагов; один вызов или фиксированная цепочка дешевле и безопаснее, когда их хватает.

Инструменты дают модели действовать. Цикл даёт ей упорствовать. И тому, и другому нужен поводок — возможности без ограничений опасны.

§ 06

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

Эвалы: нельзя улучшить то, что не измеряешь

Школа, которая никого не оценивает, понятия не имеет, кто учится, — и не может стать лучше.

Эвал — это набор тестов для твоего AI: входы с известными ожиданиями, оцениваемые автоматически: достал ли он нужные документы, вызвал ли нужный инструмент, ответил ли верно? Без эвалов ты крутишь промпты на ощущениях. И жди суровую правду: дойти до 80% качества быстро; домолоть оттуда до 95% — это бóльшая часть работы.

Guardrails: границы на входе и выходе

Бортики на дорожке боулинга — они не катят шар за тебя, но держат его из жёлоба.

Guardrails — это проверки вокруг модели: на входе — блокировать prompt-injection и запросы вне темы; на выходе — фильтровать небезопасный контент и валидировать формат, прежде чем он дойдёт до пользователя или другой системы. Они работают до и после модели, в твоём коде, — потому что нельзя доверить модели надзор за собой.

Стоимость и задержка — это проектные ограничения

Таксометр, тикающий всю поездку, — каждая лишняя миля контекста, каждый лишний шаг добавляют к счёту и к ожиданию.

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

Галлюцинация — это риск, вокруг которого проектируешь

Ты не даёшь блестящему, но ненадёжному рассказчику микрофон без присмотра — ты проверяешь факты, прежде чем это уйдёт в печать.

Каждый приём отсюда — заземление через RAG, структурированный вывод, эвалы, guardrails, ссылки — существует, чтобы управлять одним ключевым риском: модель убедительно заявляет ложь. Ты никогда не убираешь его целиком; ты ограничиваешь, где он может случиться, ловишь, когда случается, и не даёшь непроверенному утверждению дойти туда, где ошибаться дорого.

Демо доверяет модели. Продукт её измеряет, ограничивает и наблюдает — потому что она недетерминирована по природе.

§ 07

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

Поднимайся по лестнице ровно настолько, насколько нужно

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

Есть лестница: один хороший промпт, потом структурированный вывод, потом RAG, когда нужны твои факты, потом инструменты, потом полный цикл агента, когда задаче правда нужно много адаптивных шагов. Каждая ступень добавляет мощь, стоимость и новые способы сломаться. Начинай снизу и поднимайся, только когда задача вынуждает, — большинству фич верх не нужен никогда.

LLM — это компонент, а не архитектура

У машины мощный двигатель, но он прикручен за перегородкой, кормится чистым топливом и окружён тормозами, — он не вся машина.

Поставь модель за интерфейс, как любую другую зависимость, с валидацией вокруг её входов и выходов и свободой подменить модель или провайдера. LLM — это одна мощная, ненадёжная часть твоей системы, а не её фундамент. (Тот же урок «LLM как адаптер, а не архитектура» из дизайна систем.)

Прежде чем выкатывать LLM-фичу
  • Какая самая простая ступень — промпт, структурированный вывод, RAG, инструменты, агент — решает это? - Откуда берутся факты — из памяти модели (рискованно) или из извлечённых данных со ссылками? - Что будет, когда она ошибётся, и это место дёшево или дорого ошибаться? - Как я буду мерить качество — что за эвал? - Какие guardrails на входе и выходе? - Сколько это стоит за вызов и насколько медленно?
Признаки, что ты перестроил
  • Цикл агента для того, на что ответил бы один промпт. - RAG над тремя документами, которые можно было просто вставить в промпт. - Кручение промптов на ощущениях, без эвала, который скажет, стало ли лучше. - Отправка всей базы знаний в контекст на каждый вызов. - Доверие выводу модели прямо в базу или в письмо, без валидации.
Признаки, что ты построил хорошо
  • Вывод структурирован и провалидирован, прежде чем код его использует. - Ответы заземлены и со ссылками, а не взяты из воздуха. - У тебя есть эвал, который говорит, помогает изменение или вредит. - Guardrails стоят и на входе, и на выходе. - Ты использовал самую простую ступень, которая работает, — и модель сидит за интерфейсом, который можно подменить.

Построение на LLM — не магия промптов. Это обычная инженерия — контекст, выборка, валидация, эвалы — вокруг необычного, ненадёжного компонента.

Конец экспресс-курса · 7 глав · инженерия важнее магии

Дальше — практика: читай документацию своего провайдера моделей — гайды Anthropic и OpenAI по промптингу, инструментам и эвалам — и собери что-то небольшое от начала до конца: промпт, потом RAG, потом инструмент. Но держи одну мысль выше прочих. Модель — лёгкая часть. Инженерия вокруг неё — контекст, заземление, измерение, ограничения — это то, где делается настоящий продукт.