Генеративный AI

Prompt Engineering

Предварительные знания

  • Как LLM предсказывает следующий токен по контекстному окну
  • Что instruction tuning и RLHF делают с base моделью
  • Архитектура GPT
  • RLHF и DPO

Два разработчика используют 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
Prompt Engineering

0

1

Войти