Конспект 4: Prompt Engineering - Продвинутые техники
Оглавление
- Введение в Prompt Engineering
- Базовые принципы
- Chain-of-Thought (CoT) Prompting
- Few-Shot и Zero-Shot Learning
- Self-Consistency
- Tree of Thoughts (ToT)
- ReAct Prompting
- Prompt Templates и управление
- Structured Output
- Prompt Optimization
- Evaluation и тестирование
- Практические примеры в N8N
- Лучшие практики
Введение в Prompt Engineering
Что такое Prompt Engineering?
Определение: Prompt Engineering — это искусство и наука создания эффективных текстовых инструкций (промптов) для получения желаемых результатов от больших языковых моделей.
Почему это важно: - ✅ Улучшает точность ответов на 30-70% - ✅ Снижает галлюцинации - ✅ Экономит токены и деньги - ✅ Делает поведение LLM предсказуемым - ✅ Обеспечивает консистентность результатов
Эволюция Prompt Engineering
| Год | Подход | Пример | Эффективность |
|---|---|---|---|
| 2020-2021 | Простые инструкции | "Переведи текст" | ⭐⭐ |
| 2022 | Few-shot learning | "Вот 3 примера, теперь сделай так же" | ⭐⭐⭐ |
| 2023 | Chain-of-Thought | "Подумай пошагово" | ⭐⭐⭐⭐ |
| 2024 | ReAct, ToT | "Рассуждай и действуй" | ⭐⭐⭐⭐⭐ |
| 2025 | Agentic + Meta-prompting | "Создай план, выполни, проверь" | ⭐⭐⭐⭐⭐ |
Базовые принципы
Анатомия хорошего промпта
[Role/Persona] → Кто ты
[Context] → Какая ситуация
[Task] → Что нужно сделать
[Format] → В каком формате
[Constraints] → Ограничения
[Examples] → Примеры (опционально)
Пример:
[Role] Ты опытный Python разработчик с 10-летним стажем.
[Context] Пользователь хочет автоматизировать обработку CSV файлов в N8N.
[Task] Напиши код на Python, который:
1. Читает CSV файл
2. Фильтрует строки по условию
3. Сохраняет результат
[Format] Ответ должен содержать:
- Чистый код без объяснений
- Комментарии на русском
- Обработку ошибок
[Constraints]
- Использовать только стандартную библиотеку
- Код должен работать в Python 3.9+
- Максимум 50 строк
Компоненты качественного промпта
1. Clarity (Ясность)
❌ ПЛОХО: "Расскажи про N8N"
✅ ХОРОШО: "Объясни в 3 предложениях, что такое N8N и для каких задач автоматизации он подходит лучше всего"
2. Specificity (Конкретность)
❌ ПЛОХО: "Создай функцию"
✅ ХОРОШО: "Создай JavaScript функцию validateEmail(email), которая возвращает true/false и проверяет email по RFC 5322"
3. Context (Контекст)
❌ ПЛОХО: "Исправь эту ошибку"
✅ ХОРОШО: "В N8N workflow при вызове OpenAI API получаю ошибку 400. Вот мой запрос: {...}. Что не так?"
4. Examples (Примеры)
❌ ПЛОХО: "Извлеки сущности"
✅ ХОРОШО:
"Извлеки имена, даты и компании из текста.
Пример:
Текст: 'Иван работает в Google с 2020 года'
Результат: {name: 'Иван', company: 'Google', date: '2020'}"
Chain-of-Thought (CoT) Prompting
Что такое Chain-of-Thought?
Определение: Техника, при которой модель явно показывает промежуточные шаги рассуждения перед финальным ответом.
Как работает:
Без CoT:
Вопрос: "Сколько будет 23 * 47?"
Ответ: "1081" (может ошибиться)
С CoT:
Вопрос: "Сколько будет 23 * 47? Подумай пошагово."
Ответ:
"Давайте решим это пошагово:
1. 23 * 40 = 920
2. 23 * 7 = 161
3. 920 + 161 = 1081
Ответ: 1081" (выше точность)
Типы Chain-of-Thought
1. Zero-Shot CoT
Самый простой: Просто добавить "Подумай пошагово"
Промпт:
"Вопрос: {вопрос}
Подумай пошагово и объясни свои рассуждения."
Пример:
Вопрос: Если N8N workflow выполняется 100 раз в день,
и каждый раз вызывает GPT-4 (стоимость $0.03/1K токенов),
и в среднем используется 500 токенов,
сколько это стоит в месяц?
Подумай пошагово.
Ответ модели:
1. Токены на один вызов: 500
2. Вызовов в день: 100
3. Токенов в день: 500 * 100 = 50,000
4. Дней в месяце: 30
5. Токенов в месяц: 50,000 * 30 = 1,500,000
6. Стоимость за 1K токенов: $0.03
7. Стоимость в месяц: (1,500,000 / 1,000) * $0.03 = $45
Ответ: $45 в месяц
2. Few-Shot CoT
Даем примеры с рассуждениями:
Вот примеры правильного анализа:
Пример 1:
Отзыв: "N8N отличная платформа!"
Рассуждение:
- Слово "отличная" — позитивное
- Восклицательный знак — усиление эмоции
- Нет негативных слов
Тональность: POSITIVE
Пример 2:
Отзыв: "Не работает, ужасно"
Рассуждение:
- "Не работает" — проблема
- "Ужасно" — сильно негативное
- Общая тональность — недовольство
Тональность: NEGATIVE
Теперь проанализируй:
Отзыв: "{{user_review}}"
3. Manual CoT
Прописываем конкретные шаги:
Проанализируй следующий текст, выполняя шаги по порядку:
Шаг 1: Определи тему текста
Шаг 2: Извлеки ключевые сущности (люди, места, даты)
Шаг 3: Определи тональность
Шаг 4: Сформулируй краткое резюме (макс 50 слов)
Текст: {{text}}
Выполни каждый шаг явно, показав результат.
Когда использовать CoT
| Задача | CoT нужен? | Причина |
|---|---|---|
| Математика, расчеты | ✅ Да | Снижает ошибки на 50%+ |
| Логические задачи | ✅ Да | Показывает ход мысли |
| Классификация | ⚠️ Опционально | Если категорий много |
| Простые вопросы | ❌ Нет | Излишне |
| Творчество | ❌ Нет | Может ограничить |
CoT в N8N
Узел OpenAI:
{
"messages": [
{
"role": "system",
"content": "Ты аналитик данных. Всегда показывай свои рассуждения пошагово."
},
{
"role": "user",
"content": "Вопрос: {{$json.question}}\n\nПодумай пошагово:"
}
],
"temperature": 0.3
}
Few-Shot и Zero-Shot Learning
Zero-Shot Learning
Определение: Модель выполняет задачу без примеров, только на основе инструкции.
Пример:
Классифицируй тональность следующего отзыва как POSITIVE, NEGATIVE или NEUTRAL:
Отзыв: "{{text}}"
Тональность:
Когда использовать: - ✅ Простые задачи - ✅ Модель уже обучена на похожих данных - ✅ Нужна быстрота (меньше токенов)
One-Shot Learning
Определение: Даем один пример выполнения задачи.
Пример:
Извлеки структурированную информацию из текста.
Пример:
Текст: "Иван Петров работает в Google с 2020 года"
Результат: {"name": "Иван Петров", "company": "Google", "year": 2020}
Теперь твой текст:
Текст: "{{input_text}}"
Результат:
Few-Shot Learning
Определение: Даем несколько (2-5) примеров для обучения в контексте.
Пример:
Классифицируй запросы пользователей по категориям.
Примеры:
"Как подключить API?" → TECHNICAL
"Сколько стоит?" → BILLING
"Не работает workflow" → SUPPORT
"Хочу отменить подписку" → BILLING
"Где документация?" → TECHNICAL
Теперь классифицируй:
"{{user_query}}" →
Сравнение подходов
| Характеристика | Zero-Shot | One-Shot | Few-Shot (3-5) |
|---|---|---|---|
| Точность | ⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| Токены | 50-100 | 150-200 | 300-500 |
| Стоимость | $ | $$ | $$$ |
| Консистентность | ⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| Применение | Простые задачи | Средние задачи | Сложные задачи |
Few-Shot в N8N
Function Node (подготовка промпта):
const examples = [
{ input: "Как подключить API?", output: "TECHNICAL" },
{ input: "Сколько стоит?", output: "BILLING" },
{ input: "Не работает workflow", output: "SUPPORT" }
];
const examplesText = examples
.map(ex => \`"\${ex.input}" → \${ex.output}\`)
.join('\n');
const prompt = \`Классифицируй запросы по категориям.
Примеры:
\${examplesText}
Теперь классифицируй:
"\${$json.user_query}" →\`;
return { prompt };
Self-Consistency
Что такое Self-Consistency?
Определение: Техника, при которой модель генерирует несколько ответов с рассуждениями, затем выбирается наиболее частый результат.
Процесс:
1. Задать вопрос с CoT
2. Сгенерировать N ответов (обычно 5-10) с разной temperature
3. Извлечь финальные ответы
4. Выбрать наиболее частый (majority voting)
Пример:
Вопрос: "Джон старше Марии на 5 лет. Вместе им 45 лет. Сколько лет Марии?"
Генерация 1 (temp=0.7):
"Пусть возраст Марии = x, тогда Джона = x+5
x + (x+5) = 45
2x + 5 = 45
2x = 40
x = 20
Марии 20 лет" ✅
Генерация 2 (temp=0.9):
"Марии x, Джону x+5
x + x + 5 = 45
2x = 40
x = 20" ✅
Генерация 3 (temp=0.8):
"45 / 2 = 22.5
22.5 - 2.5 = 20" ✅
Генерация 4 (temp=1.0):
"Вычтем 5: 45 - 5 = 40
Разделим: 40 / 2 = 20" ✅
Генерация 5 (temp=0.6):
"Если вместе 45, и разница 5
(45 - 5) / 2 = 20" ✅
Результат: 5 из 5 → Марии 20 лет (высокая уверенность)
Когда использовать Self-Consistency
| Сценарий | Рекомендация | Причина |
|---|---|---|
| Критичные решения | ✅ Да | Снижает риск ошибок |
| Математика, логика | ✅ Да | Повышает точность на 20-30% |
| Классификация | ⚠️ Иногда | Если высокая цена ошибки |
| Генерация текста | ❌ Нет | Избыточно и дорого |
| Production с бюджетом | ❌ Нет | Слишком много вызовов API |
Self-Consistency в N8N
Workflow:
[Webhook с вопросом]
↓
[Function → Создать 5 вариантов промпта]
↓
[Loop → 5 итераций]
↓
[OpenAI Chat (temperature разная)]
↓
[Function → Извлечь финальные ответы]
↓
[Function → Majority voting]
↓
[HTTP Response]
Function Node (Majority Voting):
const answers = $input.all().map(item => {
// Извлекаем ответ из текста
const text = item.json.choices[0].message.content;
const match = text.match(/Ответ: (\d+)/);
return match ? parseInt(match[1]) : null;
}).filter(x => x !== null);
// Подсчет частоты
const frequency = {};
answers.forEach(ans => {
frequency[ans] = (frequency[ans] || 0) + 1;
});
// Выбор самого частого
const mostCommon = Object.entries(frequency)
.sort((a, b) => b[1] - a[1])[0];
return {
answer: mostCommon[0],
confidence: mostCommon[1] / answers.length,
allAnswers: answers
};
Tree of Thoughts (ToT)
Что такое Tree of Thoughts?
Определение: Расширение CoT, где модель исследует несколько путей рассуждения параллельно, оценивает их и выбирает лучший.
Отличие от CoT:
Chain-of-Thought (линейный):
Шаг 1 → Шаг 2 → Шаг 3 → Ответ
Tree of Thoughts (древовидный):
Шаг 1
/ | \
2a 2b 2c
/ \ | / \
3a 3b 3c 3d 3e
↓
Оценка каждого пути
↓
Выбор лучшего
Процесс ToT
Шаги: 1. Decomposition — разбить задачу на подзадачи 2. Generation — сгенерировать варианты решения каждой подзадачи 3. Evaluation — оценить каждый вариант (scoring) 4. Selection — выбрать лучшие ветки 5. Iteration — повторить для следующего уровня 6. Synthesis — собрать финальное решение
Пример промпта:
Задача: Разработать архитектуру RAG системы для документации.
Шаг 1: Предложи 3 разных подхода к чанкированию:
[Модель генерирует 3 варианта]
Шаг 2: Оцени каждый подход по критериям (1-10):
- Качество поиска
- Скорость
- Простота реализации
[Модель оценивает]
Шаг 3: Выбери лучший подход
[Модель выбирает]
Шаг 4: Для выбранного подхода, предложи 3 варианта векторной БД
[Повторяем процесс]
ToT в N8N (упрощенная версия)
Workflow:
[Input: Сложная задача]
↓
[LLM → Декомпозиция на подзадачи]
↓
[Loop по каждой подзадаче]
↓
[LLM → Генерация 3 вариантов решения]
↓
[LLM → Оценка каждого варианта]
↓
[Function → Выбор лучшего]
↓
[Merge → Сборка финального решения]
ReAct Prompting
Что такое ReAct?
Определение: ReAct (Reasoning + Acting) — паттерн, где модель чередует рассуждения (Thought) и действия (Action), наблюдая результаты.
Цикл ReAct:
Thought → Action → Observation → Thought → Action → ...
Пример:
Вопрос: "Какая погода в Москве сейчас?"
Thought 1: Мне нужно узнать текущую погоду в Москве.
Для этого есть weather API.
Action 1: Call weather_api(city="Moscow")
Observation 1: {"temp": -5, "condition": "snow"}
Thought 2: Получил данные. Температура -5°C, снег.
Могу сформулировать ответ.
Action 2: Finish
Answer: "В Москве сейчас -5°C, идет снег"
Структура ReAct промпта
You are an AI assistant that can use tools.
Available tools:
- search(query): Search the internet
- calculator(expression): Calculate math
- weather(city): Get current weather
For each task, follow this format:
Thought: [your reasoning]
Action: [tool_name(parameters)]
Observation: [tool result]
... (repeat Thought/Action/Observation as needed)
Thought: I now know the final answer
Final Answer: [your answer]
Question: {{user_question}}
Пример ReAct в действии
Вопрос: "Сколько стоит 100 вызовов GPT-4 с 500 токенами каждый по цене $0.03 за 1K токенов?"
Thought: Это математическая задача. Нужно посчитать:
(количество_вызовов * токены_на_вызов / 1000) * цена_за_1K
Action: calculator(100 * 500 / 1000 * 0.03)
Observation: 1.5
Thought: Получил результат 1.5. Это означает $1.50
Action: finish()
Final Answer: Стоимость составит $1.50
ReAct в N8N
Базовая реализация:
[Webhook с вопросом]
↓
[Loop: до 5 итераций]
↓
[LLM → Генерация Thought + Action]
↓
[Function → Парсинг действия]
↓
[Switch по типу действия]
├─ [HTTP Request → API call]
├─ [Code → Calculator]
└─ [Finish → Exit loop]
↓
[Function → Форматирование Observation]
↓
[Добавить в историю]
↓
[Повторить loop или вернуть ответ]
Function Node (Parsing Action):
const response = $json.choices[0].message.content;
// Извлекаем Action
const actionMatch = response.match(/Action: (\w+)\((.*?)\)/);
if (!actionMatch) {
return { action: 'finish', done: true };
}
const [, toolName, params] = actionMatch;
return {
tool: toolName,
params: params,
fullResponse: response,
done: false
};
Prompt Templates и управление
Что такое Prompt Template?
Определение: Переиспользуемая структура промпта с плейсхолдерами для динамических значений.
Пример:
const SENTIMENT_TEMPLATE = \`
Analyze the sentiment of the following review.
Respond with only: POSITIVE, NEGATIVE, or NEUTRAL
Review: {{review}}
Sentiment:\`;
Система управления промптами
Компоненты: 1. Template Store — хранилище шаблонов 2. Versioning — версионирование промптов 3. Variables — переменные и подстановки 4. Evaluation — оценка качества 5. A/B Testing — тестирование вариантов
Версионирование промптов
sentiment_analysis/
├─ v1.0.txt (baseline)
├─ v1.1.txt (добавлен CoT)
├─ v2.0.txt (few-shot examples)
└─ v2.1.txt (structured output)
Метаданные версии:
{
"version": "2.1",
"created": "2025-11-26",
"author": "Pavel",
"changes": "Добавлен structured output для JSON",
"performance": {
"accuracy": 0.92,
"avg_tokens": 150,
"avg_cost": 0.005
},
"deprecated": false
}
Prompt Templates в N8N
Способ 1: Function Node
const templates = {
sentiment: \`Analyze sentiment: {{text}}\nSentiment:\`,
summary: \`Summarize in {{max_words}} words:\n{{text}}\nSummary:\`,
extraction: \`Extract {{entity_type}} from:\n{{text}}\nResult:\`
};
const prompt = templates[$json.templateName]
.replace('{{text}}', $json.text)
.replace('{{max_words}}', $json.maxWords || 50);
return { prompt };
Способ 2: Отдельный файл (JSON)
{
"templates": {
"qa": {
"system": "You are a helpful assistant for {{domain}}.",
"user": "Question: {{question}}\nContext: {{context}}\nAnswer:"
},
"classification": {
"system": "Classify text into: {{categories}}",
"user": "Text: {{text}}\nCategory:"
}
}
}
Structured Output
Что такое Structured Output?
Определение: Принуждение модели возвращать ответ в строго определенном формате (JSON, XML, YAML).
Зачем нужно: - ✅ Программная обработка результатов - ✅ Валидация ответов - ✅ Интеграция с другими системами - ✅ Снижение ошибок парсинга
JSON Mode (OpenAI)
Активация:
{
"model": "gpt-4-turbo",
"response_format": { "type": "json_object" },
"messages": [
{
"role": "user",
"content": "Extract person info as JSON: 'Иван работает в Google'"
}
]
}
Результат:
{
"name": "Иван",
"company": "Google"
}
Промпт для Structured Output
Без JSON mode (универсальный):
Extract the following information and return ONLY valid JSON:
{
"name": "full name",
"email": "email address or null",
"phone": "phone number or null",
"company": "company name or null"
}
Text: "{{input_text}}"
JSON:
С JSON Schema:
Extract information according to this schema:
{
"type": "object",
"properties": {
"title": {"type": "string"},
"date": {"type": "string", "format": "date"},
"tags": {"type": "array", "items": {"type": "string"}},
"priority": {"type": "integer", "minimum": 1, "maximum": 5}
},
"required": ["title", "priority"]
}
Text: {{input}}
Structured Output в N8N
OpenAI Node с JSON mode:
{
"model": "gpt-4-turbo",
"response_format": { "type": "json_object" },
"messages": [
{
"role": "system",
"content": "Extract entities as JSON: {name, company, date}"
},
{
"role": "user",
"content": "Text: {{$json.text}}"
}
]
}
Валидация в Function Node:
const response = $json.choices[0].message.content;
let parsed;
try {
parsed = JSON.parse(response);
} catch (e) {
throw new Error("Invalid JSON from LLM");
}
// Валидация структуры
if (!parsed.name || !parsed.company) {
throw new Error("Missing required fields");
}
return parsed;
Prompt Optimization
Метрики качества промпта
| Метрика | Описание | Цель |
|---|---|---|
| Accuracy | Процент правильных ответов | Максимизировать (>90%) |
| Consistency | Одинаковые ответы на один запрос | Максимизировать (>95%) |
| Avg Tokens | Среднее количество токенов | Минимизировать |
| Latency | Время ответа | Минимизировать (<2s) |
| Cost | Стоимость на запрос | Минимизировать |
| Hallucination Rate | Процент выдуманных фактов | Минимизировать (<5%) |
Процесс оптимизации
1. Baseline (начальный промпт)
↓
2. Evaluation (измерить метрики)
↓
3. Hypothesis (что изменить)
↓
4. Experiment (A/B тест)
↓
5. Analysis (сравнить результаты)
↓
6. Decision (принять или откатить)
↓
7. Iterate (повторить)
Техники оптимизации
1. Сокращение токенов
❌ БЫЛО (200 токенов):
"Пожалуйста, проанализируй следующий текст и извлеки из него все
упоминания людей, организаций, мест и дат, которые там встречаются.
Представь результат в виде структурированного списка..."
✅ СТАЛО (50 токенов):
"Extract: people, organizations, locations, dates.
Format: JSON
Text: {{text}}"
2. Переход от Few-Shot к Zero-Shot
❌ Few-Shot (500 токенов):
"Примеры:
1. ...
2. ...
3. ...
Теперь твой:"
✅ Zero-Shot (100 токенов):
"Classify as SPAM or HAM: {{text}}"
(если точность не падает >5%)
3. Использование меньших моделей
GPT-4 (дорого) → GPT-3.5-turbo (дешево)
Если задача простая (классификация, извлечение)
4. Prompt Compression
Исходный промпт: 500 токенов
↓
Удалить избыточность: 350 токенов
↓
Заменить длинные фразы: 250 токенов
↓
Использовать аббревиатуры: 200 токенов
Evaluation и тестирование
Методы оценки
1. Manual Evaluation
Процесс:
1. Создать test set (50-100 примеров)
2. Для каждого примера:
- Запустить промпт
- Оценить результат (1-5)
- Записать ошибки
3. Посчитать метрики
Критерии: - Правильность - Полнота - Релевантность - Формат
2. Automated Evaluation
LLM-as-a-Judge:
System: You are an evaluator. Rate the answer 1-5.
Criteria:
- Correctness (факты верны?)
- Completeness (всё учтено?)
- Clarity (понятно?)
Question: {{question}}
Answer: {{llm_answer}}
Rating:
3. Метрики для разных задач
| Задача | Метрики |
|---|---|
| Классификация | Accuracy, Precision, Recall, F1 |
| Извлечение сущностей | Exact Match, Partial Match |
| Генерация текста | BLEU, ROUGE, Human eval |
| QA | Exact Match, F1, Similarity |
| Summarization | ROUGE-L, Human preference |
Test Set для промптов
Пример:
[
{
"id": 1,
"input": "Иван работает в Google с 2020",
"expected": {
"name": "Иван",
"company": "Google",
"year": 2020
}
},
{
"id": 2,
"input": "Мария основала стартап в 2019",
"expected": {
"name": "Мария",
"company": null,
"year": 2019
}
}
]
A/B Testing промптов в N8N
Workflow:
[Webhook]
↓
[Function → Random split 50/50]
↓
[IF: group A]
├─ [OpenAI с промптом v1]
└─ [Tag: "prompt_v1"]
↓
[ELSE: group B]
├─ [OpenAI с промптом v2]
└─ [Tag: "prompt_v2"]
↓
[Log результат в БД]
↓
[Return response]
Анализ:
SELECT
prompt_version,
AVG(accuracy) as avg_accuracy,
AVG(tokens_used) as avg_tokens,
AVG(latency_ms) as avg_latency,
COUNT(*) as sample_size
FROM prompt_logs
WHERE date >= '2025-11-01'
GROUP BY prompt_version;
Практические примеры в N8N
Пример 1: Email Classifier с CoT
Задача: Классифицировать входящие emails по категориям
Промпт:
Classify this email into ONE category. Think step by step.
Categories: SUPPORT, SALES, BILLING, SPAM
Email:
From: {{$json.from}}
Subject: {{$json.subject}}
Body: {{$json.body}}
Reasoning:
1. Analyze subject keywords
2. Check body content
3. Determine intent
Category:
N8N Workflow:
[Gmail Trigger: New Email]
↓
[OpenAI Chat]
temperature: 0.2
system: "You are an email classifier"
user: [промпт выше]
↓
[Function → Extract category]
↓
[Switch по категории]
├─ SUPPORT → Create Zendesk ticket
├─ SALES → Add to CRM
├─ BILLING → Forward to accounting
└─ SPAM → Move to spam folder
Пример 2: Document Summarizer с Few-Shot
Задача: Резюмировать документы в 3 предложения
Промпт:
Summarize the document in exactly 3 sentences.
Examples:
Document: [500 words about N8N]
Summary: N8N is an automation platform. It connects various services. Users can create workflows visually.
Document: [400 words about AI]
Summary: AI transforms industries. Machine learning enables predictions. Deep learning powers modern AI.
Now summarize:
Document: {{$json.document}}
Summary:
N8N Workflow:
[Google Drive: New File]
↓
[PDF Parser]
↓
[Function → Chunk if > 10K chars]
↓
[Loop по чанкам]
↓
[OpenAI Chat с промптом]
↓
[Function → Combine summaries]
↓
[Save to Database]
Пример 3: Data Extraction с Structured Output
Задача: Извлечь структурированные данные из текста
Промпт:
{
"messages": [
{
"role": "system",
"content": "Extract contact information as JSON"
},
{
"role": "user",
"content": "Text: {{$json.text}}\n\nReturn JSON with: name, email, phone, company"
}
],
"response_format": { "type": "json_object" }
}
Validation Function:
const result = JSON.parse($json.choices[0].message.content);
// Валидация email
if (result.email && !/\S+@\S+\.\S+/.test(result.email)) {
result.email = null;
}
// Валидация phone
if (result.phone && !/^\+?\d{10,15}$/.test(result.phone.replace(/\s/g, ''))) {
result.phone = null;
}
return result;
Лучшие практики
Do's ✅
-
Будьте конкретны
❌ "Проанализируй" ✅ "Извлеки имена, даты и компании в JSON" -
Используйте примеры для сложных задач
Few-shot > Zero-shot (для точности) -
Добавляйте CoT для логических задач
"Подумай пошагово" повышает точность на 30%+ -
Валидируйте структуру ответов
javascript if (!response.required_field) throw Error(); -
Версионируйте промпты
v1.0, v1.1, v2.0 с логом изменений -
Тестируйте на реальных данных
Минимум 50 примеров для оценки -
Мониторьте стоимость
Логируйте токены каждого запроса -
Используйте temperature по задаче
Факты: 0.0-0.3 Творчество: 0.7-1.5
Don'ts ❌
-
Не делайте промпты слишком длинными ```
1000 слов = медленно и дорого ```
-
Не используйте сложные техники для простых задач
Zero-shot достаточно для "classify: spam/ham" -
Не игнорируйте контекст
❌ "Переведи это" ✅ "Переведи email от клиента на английский" -
Не полагайтесь на одну попытку для критичных задач
Используйте Self-Consistency или валидацию -
Не забывайте об edge cases
Тестируйте на пустых, очень длинных, некорректных входах -
Не используйте Few-Shot без необходимости
Если Zero-Shot работает хорошо, экономьте токены
Чек-лист оптимального промпта
☑️ Роль четко определена
☑️ Задача конкретна и измерима
☑️ Формат вывода указан
☑️ Примеры даны (если нужны)
☑️ Ограничения перечислены
☑️ Temperature соответствует задаче
☑️ Есть валидация ответа
☑️ Промпт версионирован
☑️ Протестирован на 10+ примерах
☑️ Стоимость приемлема
Дата создания: December 2025
Версия: 1.0
Автор: Pavel
Применение: N8N, LLM автоматизация, Production AI