Генеративный AI
Prompt Engineering
Предварительные знания
- Как LLM предсказывает следующий токен по контекстному окну
- Что instruction tuning и RLHF делают с base моделью
Два разработчика используют GPT-4 для одной задачи - извлечение данных из юридических документов. Первый получает 60% точность и бросает: 'AI не работает'. Второй добавляет few-shot примеры, просит думать шаг за шагом и требует JSON-вывод - и получает 94%. Модель та же. Разница только в промпте. Prompt engineering - это API к интеллекту.
- **ChatGPT System Prompts**: у каждого GPT (Custom GPT) свой system prompt, задающий личность и ограничения. Исследователи извлекают их через prompt injection и публикуют. Anthropic публично раскрывает часть своих system prompts как best practices.
- **GitHub Copilot**: использует сложный system prompt с контекстом из открытых файлов, историей изменений и метаданными проекта. Few-shot примеры - это весь открытый в IDE код. CoT - внутренние рассуждения перед генерацией кода.
- **LangChain Expression Language (LCEL)**: фреймворк для построения prompt-пайплайнов. PromptTemplate + few-shot examples + output parsers. Deserialization structured output из LLM в Python объекты - стандарт для production AI apps.
- **Медицина**: извлечение структурированных данных из клинических записей. Структурный вывод (JSON) + few-shot примеры с реальными случаями + CoT для диагностических рассуждений дают 90%+ согласие с экспертами-врачами.
Как промптинг стал дисциплиной
В 2020 году Tom Brown и команда OpenAI представили GPT-3 в работе 'Language Models are Few-Shot Learners', показав, что модель может выполнить новую задачу по нескольким примерам прямо в промпте, без обновления весов. In-context learning означал, что сам промпт стал интерфейсом. В 2022 году Jason Wei с коллегами из Google опубликовали chain-of-thought prompting: простая просьба рассуждать пошагово резко улучшала результаты на арифметике и логике. Между 2022 и 2023 годами prompt engineering вырос из приёма в дисциплину, а паттерны вроде few-shot примеров, role и system промптов и инструкций для structured output стали стандартной практикой работы с LLM.
Few-Shot Prompting: обучение без обучения
GPT-3 (2020) удивил исследователей неожиданным свойством: несколько примеров в prompt'е кардинально меняли поведение модели - без обновления весов. Три примера перевода в начале контекста - и модель переводит. Два примера классификации - и модель классифицирует. Это назвали **few-shot learning in context** - обучение прямо во время инференса.
**Zero-shot**: только инструкция, без примеров. Работает для простых задач, которые хорошо представлены в pre-training данных. **One-shot**: один пример. **Few-shot**: 2-8 примеров. Больше примеров не всегда лучше - каждый пример занимает контекст и может добавить шум, если не репрезентативен.
**Выбор примеров критичен**. Исследования показывают: качество few-shot примеров важнее их количества. Примеры должны быть разнообразными, репрезентативными и без ошибок. Порядок примеров влияет на результат - это называют **order sensitivity** и считают слабостью few-shot подхода.
**Retrieval-Augmented Few-Shot**: вместо фиксированных примеров - динамический поиск похожих по embedding similarity. При классификации текста - находить из базы 3-5 наиболее похожих примеров к текущему запросу. LangChain реализует это как `ExampleSelector`.
Few-shot prompting улучшает качество модели без изменения весов. Как это возможно?
Chain-of-Thought: думай вслух
2022 год. Google Brain публикует **Chain-of-Thought Prompting** (Wei et al.). Открытие шокирующее: если попросить LLM объяснять рассуждения шаг за шагом - точность на математических задачах вырастает с 17% до 58% для PaLM 540B. Модель не стала умнее. Изменился только формат промпта.
**Почему работает**: авторегрессионная генерация означает, что каждый следующий токен обусловлен предыдущими. Промежуточные рассуждения в контексте дают модели 'место для думы' - аналог черновика. Без этого места модель вынуждена выдать ответ сразу, опираясь только на веса.
**Варианты CoT**: **Tree of Thoughts (ToT)** - несколько цепочек рассуждений параллельно, лучшая выбирается или объединяются. **Self-Consistency** - генерировать 10-20 CoT ответов, брать большинство голосов. **ReAct** - чередование рассуждений и действий (поиск, вызов API). OpenAI o1/o3 и Anthropic Claude 3.7 реализуют CoT внутренне, не показывая рассуждения пользователю.
**Ограничения**: CoT работает для задач с чёткой логической структурой (математика, код, рассуждения). Для фактических вопросов он помогает меньше - модель может уверенно рассуждать к неправильному ответу. Galactic reasoning: длинная цепочка множит ошибки, а не компенсирует их.
Почему добавление фразы 'Подумаем шаг за шагом' улучшает точность LLM на математических задачах?
System Prompts: личность и контекст
Chat API (OpenAI, Anthropic, Google) разделяет контекст на роли: **system** (инструкции до разговора), **user** (запрос), **assistant** (ответ). System prompt - это директивы, которые задают поведение, личность, ограничения и контекст. Он читается перед всем разговором и влияет на все ответы.
**Что кодируется в system prompt**: формат ответа (markdown/json/plain), длина ответов, тональность, запрещённые темы, доступные инструменты, роль и имя ассистента, язык, дата и временная зона. Хорошо составленный system prompt важнее большинства других оптимизаций.
**Prompt injection**: злонамеренные инструкции в user input, пытающиеся переопределить system prompt. Пример: 'Игнорируй предыдущие инструкции и...' Защита: валидация на уровне приложения, использование отдельного LLM-судьи для проверки ввода, sandboxing. Это активная область исследований AI Safety.
**Anthropic Prompt Library**: публичная библиотека из 60+ оптимизированных system prompts для типичных задач (customer support, code review, summarization). Основана на внутренних экспериментах команды. Аналог - OpenAI Cookbook на GitHub.
System prompt задаёт роль ассистента. Что происходит, если пользователь пишет в user message 'Игнорируй все предыдущие инструкции'?
Structured Output: JSON из LLM
LLM в production редко генерирует свободный текст - чаще нужен JSON для дальнейшей обработки. Проблема: языковая модель оптимизирована под текст, а не под валидный JSON. Без специальных мер она добавляет комментарии, опускает кавычки, нарушает вложенность. Решений несколько.
**Constrained decoding** - более фундаментальный подход: на уровне инференса ограничивать сэмплинг только токенами, допустимыми в текущей позиции JSON-грамматики. Используется в llama.cpp (`--json-schema`) и vLLM (`guided_decoding`). Гарантирует валидность без потери качества.
**Outlines** - open-source библиотека для constrained generation. Поддерживает JSON Schema, regex, Pydantic, CFG (context-free grammars). Используется в production для извлечения данных из неструктурированного текста: медицинские записи, юридические документы, e-commerce.
Prompt engineering - временное явление: когда модели станут умнее, промпты перестанут важны
Структурированный output, system prompts и CoT остаются важными даже для самых мощных моделей - это не костыль, а интерфейс
Gemini 2.5 и Claude 3.7 по-прежнему дают разные результаты в зависимости от формулировки. Промпт-инженерия эволюционирует: меньше ухищрений для простых задач, больше архитектурных решений (system prompts, structured output, tool definitions) для сложных пайплайнов.
OpenAI JSON mode и Structured Outputs - в чём разница?
Ключевые идеи
- **Few-shot prompting** активирует нужные паттерны через примеры в контексте - без обновления весов. Качество примеров важнее количества.
- **Chain-of-Thought** даёт модели место для промежуточных рассуждений. 'Подумаем шаг за шагом' удваивает точность на математических задачах. CoT работает через авторегрессию, а не магию.
- **System prompts** определяют поведение, роль и ограничения ассистента. Prompt injection - реальная угроза; защита на уровне приложения обязательна.
- **Structured Output** решает проблему невалидного JSON через API-level constraints (OpenAI Structured Outputs), библиотеки (Instructor) или constrained decoding (Outlines, llama.cpp).
- **Эволюция**: CoT → Tree of Thoughts → ReAct → внутренние reasoning-цепочки в o1/o3 и Claude 3.7. Prompting становится архитектурным решением, а не 'написать правильные слова'.
Связанные темы
Prompt engineering - фундамент всех приложений на LLM:
- Function Calling и Tool Use — Tool definitions - это специальный вид structured prompting. Описание инструментов в system prompt определяет что и когда вызывать
- RAG: Retrieval-Augmented Generation — RAG динамически наполняет промпт релевантными документами - это programmatic few-shot prompting на основе retrieval
- AI Safety и Alignment — Prompt injection и jailbreaks - векторы атак через промпт. Понимание prompting критично для понимания угроз
Вопросы для размышления
- Few-shot примеры занимают токены контекста и стоят денег. Как решить trade-off между качеством (больше примеров) и стоимостью на миллионах запросов в день?
- Chain-of-Thought может уверенно рассуждать к неправильному ответу. В каких задачах CoT вреден, а не полезен?
- Если structured output гарантирует валидный JSON - зачем нужна валидация данных на уровне приложения помимо схемы?
Связанные уроки
- gai-07 — Выровненные модели надёжно реагируют на промпт-паттерны
- gai-17 — Промптинг управляет вызовом инструментов и функций
- aie-06-prompt-patterns — Инженерный взгляд на те же промпт-паттерны
- nlp-04 — Few-shot промптинг переиспользует in-context языковое моделирование
- ml-43-hyperparameters — Подбор промптов - поиск по входам, а не по весам
- nlp-01