JavaRush /Курсы /ChatGPT Apps /Связка system‑prompt

Связка system‑prompt, tool descriptions и follow‑ups: борьба с галлюцинациями

ChatGPT Apps
5 уровень , 2 лекция
Открыта

1. Введение

Иногда на курсах по prompt‑инжинирингу показывают магическое заклинание:

«Не придумывай факты и говори “я не знаю”, если нет информации.»

К сожалению (или к счастью), для ChatGPT App это не работает как серебряная пуля. Причина проста: модель видит не только ваш system‑prompt, но и:

  • список инструментов с их описаниями и схемами;
  • результаты этих инструментов;
  • историю диалога, включая предыдущие follow‑up’ы.

Если эти три слоя — system‑prompt, описания tools, паттерны follow‑up — противоречат друг другу или просто «провисают», модель начинает вести себя как классический джуниор: старательная, но склонная к выдумкам.

Внутри курса мы используем идею «трёхуровневой защиты от галлюцинаций» (defense in depth):

  • уровень 1 — глобальные правила в system‑prompt;
  • уровень 2 — локальные ограничения в определении каждого инструмента;
  • уровень 3 — обработка ошибок, пустых результатов и follow‑ups.

В этой лекции мы соберём все три уровня в единый, согласованный контракт для нашего учебного приложения GiftGenius.

Insight

В новой архитектуре ChatGPT Apps поле для system-prompt исчезло — формально его больше нет. Но это не означает, что вы должны отказываться от глобальных инструкций для модели. Есть лайфхак: для ChatGPT описания инструментов — такой же текст промпта, как и классический system. Именно через него можно вернуть полноценную «мозговую прошивку» приложения.

Создайте служебный инструмент, например about или about_app. Он не предназначен для частого вызова, но его description читается моделью наравне с остальными инструментами. Поэтому в описание можно встроить полный system-prompt. Лучше его разместить после короткого технического описания самого инструмента. В итоге модель на старте получает ваш system-prompt в чистом виде — и применяет его ко всему дальнейшему диалогу и вызовам tools.

Чтобы упростить сопровождение, рекомендую добавлять в начало system-prompt явную версию, например SYSTEM_PROMPT_VERSION: v3. Это позволяет находить, почему модель ведёт себя по-другому: вы сразу видите, на каком именно наборе инструкций она работает. Если в проде возникает странное поведение, легко понять, относится ли ошибка к старой версии промпта или к новой.

Пример:

tool description 

### Global assistant behavior for the entire GiftGenius App (ver 3.01)
*(system-level guidelines, not user-facing text)*

system prompt text

2. Какие галлюцинации бывают у ChatGPT App (на примере каталога подарков)

Чтобы понимать, чем лечить, полезно назвать болезнь. В контексте каталога (подарки, товары, тарифы) чаще всего встречаются такие типы галлюцинаций.

Во‑первых, выдуманные позиции каталога. Пользователь просит «цифровой сертификат на годовую подписку на конкретный сервис» или очень экзотический подарок, которого в вашем фиде нет, а модель, желая быть полезной, радостно придумывает «Super Space Flight 3000 — полёт в космос», которого в базе GiftGenius никогда не существовало.

Во‑вторых, выдуманные атрибуты. Подарок в каталоге есть, но модель «украшает» реальность: меняет цену, тип подарка (цифровой vs физический), наличию доставки в страну пользователя или срок действия сертификата, потому что так «логичнее» или «звучит лучше».

В‑третьих, галлюцинаторные действия. Модель пишет «я уже купил этот подарок и отправил код на ваш e‑mail, с карты списано $49», хотя ваш backend GiftGenius даже не пытался ничего покупать и никакой ACP/Stripe‑флоу не запускался.

Наконец, есть комбинированный случай: инструмент вернул пустой список (нет подарков под такие фильтры и бюджет), а модель, чтобы не расстраивать пользователя, придумывает пару «примерных вариантов» и не объясняет, что в каталоге их нет.

Наша задача — сделать так, чтобы в этих ситуациях модель:

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

Причём делать это не за счёт «заклинаний» в произвольных местах, а через связанный контракт system‑prompttoolsfollow‑ups.

3. Слой 1: усиливаем system‑prompt против галлюцинаций

Чтобы остановить выдуманные подарки, атрибуты и действия из предыдущего раздела, сначала усилим верхний слой — system‑prompt: зададим модели общую «философию» поведения в каталоге.

В первой лекции модуля вы уже написали базовый system‑prompt вида: «Ты — GiftGenius, помогаешь подбирать подарки…» и зафиксировали границы ответственности ассистента и работу с инструментами.

Теперь добавим туда явные анти‑галлюцинационные правила.

Логика такая: system‑prompt задаёт общую философию поведения. Он не знает деталей каждого инструмента, зато может:

  • запретить придумывать подарки / цены / наличие вне каталога;
  • прописать поведение, если инструменты вернули пустой результат или ошибку;
  • потребовать явного различения между данными из каталога подарков и любыми «общими знаниями модели».

Пример фрагмента system‑prompt (TypeScript‑константа в нашем Next.js‑проекте, например config/systemPrompt.ts):

// config/systemPrompt.ts
export const SYSTEM_PROMPT = `
# Роль
Ты — GiftGenius, ассистент по подбору подарков
на основе каталога подарков нашего приложения.

# Данные и ограничения
- Не придумывай подарки, которых нет в каталоге или в ответах инструментов.
- Не выдумывай цены, наличие, тип подарка (цифровой/физический),
  регионы доставки или другие атрибуты.
- Если инструмент не вернул нужных данных или произошла ошибка,
  честно сообщай об этом и не пытайся угадывать значения.

# Работа с инструментами
- Всегда используй инструменты каталога подарков для любых фактических данных:
  списка подарков, цен, типов, доступности, SKU.
- Если инструмент вернул пустой результат, скажи, что по текущим условиям
  подходящих подарков нет, и предложи варианты ослабить фильтры
  (изменить бюджет, категорию, тип подарка).
`;

Здесь важно несколько моментов.

Во‑первых, мы разводим «общие знания модели» и «данные приложения». Модель всё ещё может объяснить, чем цифровой подарок отличается от физического или какие поводы обычно бывают, но любые конкретные подарки, цены и SKU должны идти только из инструментов GiftGenius.

Во‑вторых, мы явно описываем, что делать в случае ошибок/пустого ответа: не молчать, не «креативить», а честно рассказать пользователю, что ничего не нашлось, и предложить изменить параметры.

В‑третьих, фокусируемся не на абстрактном «не галлюцинируй», а на конкретных типах поведения, привязанных к нашему домену (каталог подарков и покупка цифровых/физических SKU).

Этот слой сам по себе уже сильно помогает, но его легко «перебить» неаккуратным описанием инструмента. Перейдём к описаниям инструментов.

4. Слой 2: описания инструментов (tool descriptions) и схемы как формальная часть контракта

Модель решает, когда и как вызывать ваш инструмент, в первую очередь по:

  • имени инструмента;
  • description инструмента;
  • inputSchema / outputSchema (JSON Schema, описывающая поля).

То есть описание инструмента (tool description) — это не документация «для людей», а такая же часть промпта, только формализованная. И многие галлюцинации рождаются именно здесь.

Представим наш инструмент recommend_gifts, который backend реализует как подбор подарков из каталога GiftGenius.

Плохой вариант описания мог бы выглядеть так:

// ПЛОХО: слишком расплывчато
const recommendGiftsTool = {
  name: "recommend_gifts",
  description: "Подбирает подарки для пользователя",
  inputSchema: {
    type: "object",
    properties: {
      profile: { type: "string" }
    }
  }
};

Формально всё корректно, но модель из этого не понимает:

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

Хороший вариант описания делает несколько вещей сразу: чётко задаёт домен, объясняет, когда вызывать tool, и жёстко фиксирует, что нельзя выдумывать результаты.

Пример (адаптированный под контракт GiftGenius с segments, budget, locale, occasion):

// config/tools.ts
export const recommendGiftsTool = {
  name: "recommend_gifts",
  description: `
Подбор подарков в каталоге GiftGenius.

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

НЕ придумывай подарки и их атрибуты вне результатов этого инструмента.
Если инструмент вернул пустой список, не выдумывай альтернативы,
а переходи к диалогу: предложи изменить бюджет, тип подарка,
повод или другие параметры.
  `.trim(),
  inputSchema: {
    type: "object",
    properties: {
      segments: {
        type: "array",
        description:
          "Сегменты профиля получателя, например ['tech', 'fitness'].",
        items: { type: "string" }
      },
      budget: {
        type: "object",
        description: "Диапазон бюджета на подарок.",
        properties: {
          min: {
            type: "number",
            description: "Минимальная сумма, неотрицательная.",
            minimum: 0
          },
          max: {
            type: "number",
            description: "Максимальная сумма, больше 0.",
            exclusiveMinimum: 0
          },
          currency: {
            type: "string",
            description: "Трёхбуквенный код валюты, например 'USD' или 'BGN'.",
            minLength: 3,
            maxLength: 3
          }
        },
        required: ["min", "max", "currency"]
      },
      locale: {
        type: "string",
        description:
          "Локаль пользователя (формат языка/региона), например 'ru-RU' или 'en-US'.",
        minLength: 2
      },
      occasion: {
        type: "string",
        description:
          "Повод для подарка: например 'birthday', 'anniversary', 'new_year'."
      }
    },
    required: ["segments", "budget", "locale", "occasion"]
  }
};

Здесь description делает несколько полезных вещей.

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

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

Он задаёт поведение при пустом результате: не выдумывать, а переходить к диалогу (то, что потом мы зафиксируем во follow‑ups).

А inputSchema помогает модели более надёжно вытащить сущности из пользовательского запроса: сегменты, бюджет, локаль и повод. Указание явной структуры и ограничений для полей (min, max, currency с фиксированной длиной) тоже снижает вероятность странных комбинаций и ошибок при парсинге.

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

description: `
...
Не используй этот инструмент, если пользователь задаёт общий вопрос
о подарках без запроса на подбор для конкретного человека
(например, "какие бывают популярные подарки на Новый год в целом").
В таких случаях отвечай сам в чате.
`.trim()

Так вы синхронизируете описание инструмента с правилами из system‑prompt про «теоретические» vs «практические» запросы.

5. Слой 3: follow‑ups как UX‑ и safety‑слой

Даже если system‑prompt и описания tools написаны идеально, жизнь не идеальна:

  • backend может вернуть ошибку;
  • каталог — пустой список;
  • результаты — неоднозначные или слишком многочисленные.

Если не прописать, что говорить после вызова tool, модель будет импровизировать: иногда хорошо, иногда — с выдуманными фактами.

В лекции 2 вы уже видели базовые UX‑инструкции: как модель анонсирует запуск App, как завершает сценарий и что говорит пользователю «на выходе». Сейчас добавим к этому паттерны follow‑up’ов, снижающих галлюцинации.

Эти паттерны обычно описываются прямо в system‑prompt в отдельном блоке, например «Диалог после работы с инструментами».

Пример фрагмента:

// продолжение SYSTEM_PROMPT
export const SYSTEM_PROMPT = `
# ... предыдущие секции ...

# Диалог после работы с инструментами

- Если инструмент подбора подарков вернул пустой список:
  1) честно скажи, что при текущих фильтрах подходящих подарков не найдено;
  2) предложи пользователю изменить 1–2 ключевых параметра
     (бюджет, тип подарка, интересы получателя, повод).

- Если инструмент вернул слишком много вариантов:
  1) выбери 3–7 наиболее релевантных;
  2) явно скажи, по каким критериям ты их отобрал
     (совпадение по интересам, попадание в бюджет, рейтинг).

- Если произошла ошибка инструмента:
  1) не выдумывай данные;
  2) скажи, что произошла техническая ошибка и предложи
     попробовать позже или упростить запрос.
`.trim();

Мы тем самым «прошиваем» в модель примерные follow‑up‑реплики. Она будет формулировать их своими словами, но с заданной структурой:

  • констатация факта (пусто / много / ошибка);
  • честное признание ограничения;
  • аккуратное предложение следующего шага.

Для каталога подарков это критично: вместо «всё ок, вот вам три подарка» в случае пустого результата модель скажет что‑то вроде:

«По вашим текущим условиям (цифровой подарок про космос до $5 с доставкой только в США) в нашем каталоге ничего нет. Хотите, я попробую расширить бюджет или предложу другие категории?»

И обратите внимание: это уже не инструментный код, а именно инструкции в промпте, которые задают ожидаемый UX.

6. Связываем всё вместе: эволюция нашего GiftGenius

Давайте посмотрим на мини‑эволюцию нашего приложения и постепенно уменьшим уровень галлюцинаций.

Исходная версия: где всё ломается

Допустим, у нас был очень минималистичный system‑prompt:

export const SYSTEM_PROMPT = `
Ты — помощник по подбору подарков.
Помогай пользователю находить подходящие идеи.
`;

Инструмент был описан так:

export const recommendGiftsTool = {
  name: "recommend_gifts",
  description: "Подбирает подарки для пользователя",
  inputSchema: { type: "object" }
};

Follow‑up‑инструкций нет.

Что будет происходить на практике:

  • если пользователь попросит «цифровой подарок другу‑геймеру до $10», а в базе под такие фильтры ничего нет, модель может:
    • либо вообще не вызвать tool и придумать подарки из головы;
    • либо вызвать tool, получить пустой список, но не сказать об этом и придумать варианты;
  • если backend вернёт ошибку, модель может считать, что «что‑то да должно быть» и начать гадать.

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

Новая версия system‑prompt

Перепишем system‑prompt, учитывая три уровня защиты. Часть вы видели выше, соберём его целиком:

// config/systemPrompt.ts
export const SYSTEM_PROMPT = `
# Роль
Ты — GiftGenius, ассистент по подбору подарков
на основе каталога подарков нашего приложения.

# Зона ответственности
- Твоя задача — помочь пользователю выбрать подходящие подарки
  из каталога, объясняя плюсы и минусы вариантов.
- Не давай обещаний о фактической покупке или отправке подарка —
  ты только помогаешь подобрать и сравнить варианты.
  Покупку и выдачу кода/ссылки делает backend после явного согласия пользователя.

# Данные и ограничения
- Не придумывай подарки, которых нет в каталоге или в ответах инструментов.
- Не выдумывай цены, тип подарка, наличие или регионы доставки.
- Если инструмент не вернул данных или произошла ошибка,
  не пытайся угадывать, а сообщи об этом.

# Работа с инструментами
- Используй инструменты каталога подарков (например, profile_to_segments,
  recommend_gifts, get_gift) для любых фактических данных
  (список подарков, цены, типы, SKU, описания).
- Отвечай сам (без инструментов), если вопрос теоретический
  и не требует подбора конкретного подарка.

# Диалог после работы с инструментами
- При пустом результате: честно объясни, что ничего не найдено
  по текущим условиям, и предложи изменить 1–2 параметра.
- При большом количестве вариантов: выбери 3–7 наиболее подходящих
  и объясни критерии выбора.
- При ошибке инструмента: не придумывай данные, извинись за сбой
  и предложи попробовать ещё раз или упростить запрос.
`.trim();

Теперь модель чётко знает:

  • где она консультант по подаркам, а где «бэк‑офис» (он у нас за инструментами);
  • какие именно данные нельзя выдумывать;
  • как вести себя в типичных неидеальных случаях.

Новый description и схема для recommend_gifts

Системный промпт мы усилили, теперь доведём до ума tool и соберём финальную версию его описания — на основе идей из раздела 4.

// config/tools.ts
export const recommendGiftsTool = {
  name: "recommend_gifts",
  description: `
Подбор подарков в каталоге GiftGenius.

Используй этот инструмент, когда нужно:
- получить список реальных подарков с актуальными ценами, типом
  (digital/physical) и тегами;
- сузить выбор по сегментам интересов, бюджету, локали и поводу.

НЕ ИСПОЛЬЗУЙ инструмент:
- если пользователь задаёт общий теоретический вопрос о подарках
  без запроса на подбор для конкретного человека;
- для придумывания подарков, которых нет в каталоге.

Если результат пустой, НЕ придумывай подарки самостоятельно,
а верни управление в диалог (следуй инструкциям system-prompt).
  `.trim(),
  inputSchema: {
    type: "object",
    properties: {
      segments: {
        type: "array",
        description:
          "Сегменты профиля получателя: например, 'tech', 'sport', 'books'.",
        items: { type: "string" }
      },
      budget: {
        type: "object",
        description:
          "Диапазон бюджета на подарок в валюте пользователя (min/max).",
        properties: {
          min: { type: "number", minimum: 0 },
          max: { type: "number", exclusiveMinimum: 0 },
          currency: {
            type: "string",
            minLength: 3,
            maxLength: 3,
            description: "Код валюты ISO 4217, например 'USD' или 'BGN'."
          }
        },
        required: ["min", "max", "currency"]
      },
      locale: {
        type: "string",
        description: "Локаль пользователя, например 'bg-BG','ru-RU' или 'en-US'."
      },
      occasion: {
        type: "string",
        description:
          "Повод для подарка: 'birthday', 'anniversary', 'new_year' и т.п."
      }
    },
    required: ["segments", "budget", "locale", "occasion"]
  }
};

Тут есть несколько нюансов.

Мы явно связываем поведение инструмента с system‑prompt: фраза «следуй инструкциям system‑prompt» напомнит модели, что «пустой результат = честный разговор, а не креатив».

Мы задаём отрицательные условия («не используй…», «не придумывай…»), что, как показывает практика, важно не меньше, чем позитивные описания.

Мы делаем inputSchema семантически богатым: нормальные описания и ограничения помогают модели правильно сопоставлять запросы с полями и меньше «ошибаться» ещё до вызова инструмента.

Follow‑up‑паттерны в коде виджета и формате ответа

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

Формально follow‑up‑ы задаются текстом в system‑prompt, но в вашем Next.js‑виджете вы можете дополнительно нормализовать ToolOutput, чтобы сделать жизнь модели проще и снизить простор для фантазий.

Например, договоримся, что backend для recommend_gifts всегда возвращает:

// тип ответа инструмента на бэкенде
export type RecommendGiftsResult = {
  items: Array<{
    id: string;
    title: string;
    price: number;
    currency: "USD" | "EUR" | "BGN";
    tags: ("digital" | "physical" | "education" | "fitness" | "tech")[];
  }>;
  // поле, которое backend заполняет, чтобы явно сказать модели, что произошло
  status: "ok" | "empty" | "error";
  errorMessage?: string;
};

Виджет может отображать это красиво, а модель — опираться на status при формировании ответа. В Apps SDK вы часто возвращаете ToolOutput модели как JSON‑объект, и она видит это поле.

В system‑prompt можно добавить маленький блок:

# Интерпретация статуса инструмента

- Если status = "empty": смотри раздел "Диалог после работы с инструментами" и
  не придумывай подарки.
- Если status = "error": сообщи про техническую ошибку и не пытайся угадывать
  содержимое каталога.

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

7. Практика: дорабатываем свой App

Чтобы не было ощущения «ну это всё красиво на слайдах», давайте опишем конкретное упражнение, которое вы можете сделать со своим текущим App (в нашем случае — GiftGenius). Сделаем маленький рефакторинг по трём слоям защиты: system‑prompt, описания инструментов и обработка результатов.

Во‑первых, на уровне system‑prompt, возьмите ваш system‑prompt из первой лекции и найдите в нём место, где описывается зона ответственности и работа с инструментами. Добавьте туда:

  • запрет на придумывание сущностей вне каталога/базы (подарков, SKU, цен);
  • правила на случай пустого результата и ошибки инструмента;
  • раздел «Диалог после работы с инструментами» с 2–3 сценариями (пусто, много, ошибка).

Во‑вторых, на уровне описаний tools, откройте описание ключевого инструмента (у вас это может быть recommend_gifts, search_gifts, search_tariffs, calculate_quote, неважно). Перепишите description так, чтобы он:

  • явно говорил, что инструмент работает только с вашим источником данных (каталог подарков, тарифов и пр.);
  • объяснял, когда он нужен, а когда нет;
  • содержал явные негативные ограничения: «не придумывай…», «не используй для…».

В‑третьих, на уровне структуры ответа инструмента, если в ответе инструмента ещё нет поля, явно описывающего статус (status, resultType, hasMore) — добавьте его в тип на бэкенде и в ToolOutput. Затем в system‑prompt впишите, как модель должна интерпретировать этот статус в диалоге.

Наконец, прогоните пару запросов в Dev Mode, в том числе такие, где результаты заведомо пустые или пограничные. Обратите внимание, перестала ли модель придумывать сущности, и насколько честно она рассказывает пользователю об ограничениях.

В следующей лекции вы формализуете такие запросы в так называемый golden prompt set и превратите это в повторяемый тестовый артефакт, но пока для нас важно, чтобы вы руками почувствовали разницу.

8. Типичные ошибки при борьбе с галлюцинациями через промпты и инструменты

Ошибка №1: одна волшебная фраза «не галлюцинируй» в system‑prompt.
Разработчик пишет в конце промпта: «Не придумывай информацию» — и считает задачу решённой. На практике модель продолжает выдумывать, потому что описания инструментов и follow‑ups не задают ей альтернативного поведения. Без конкретных правил «что делать вместо выдумывания» (признать пустой результат, предложить изменить фильтры, сообщить об ошибке) такая фраза почти не помогает.

Ошибка №2: противоречие между system‑prompt и description инструмента.
В system‑prompt вы говорите: «Не придумывай подарки, которых нет в каталоге», а в описании инструмента — «Подбирает подходящие подарки, а если не нашёл — может предложить похожие варианты на своё усмотрение». В итоге модель мечется между двумя источниками правды, и побеждает, к сожалению, более конкретный (обычно description инструмента). Нужно, чтобы оба слоя говорили одно и то же: если похожие варианты допустимы, это тоже надо формализовать (и обязательно пояснять пользователю, что это не точное совпадение).

Ошибка №3: слишком расплывчатые описания инструментов.
Описание вида «Инструмент, который помогает пользователю решать задачи» не даёт модели почти никакой информации о границах инструмента. В таком случае она либо вообще не будет его использовать, либо будет дёргать по любому поводу — а потом «додумывать» данные, когда инструмент вернул мало или ничего. Хороший description должен быть дискриминативным: явно говорить, что делает инструмент и когда его не надо вызывать.

Ошибка №4: отсутствие стратегии для пустых и ошибочных результатов.
Разработчик заботливо пишет бэкенд, который возвращает { items: [], status: "empty" }, но нигде не объясняет модели, что это значит. В результате модель видит пустой массив и решает: «ну, видимо, надо предложить что‑то из общего знания». В system‑prompt не хватает раздела, объясняющего, как интерпретировать такие статусы и что говорить пользователю. При этом добавление пары чётких правил для пустого/ошибочного результата даёт огромный прирост качества.

Ошибка №5: попытка «лечить» галлюцинации только на уровне кода виджета.
Иногда хочется всё переложить на фронтенд: «если список пустой — покажу заглушку и не дам пользователю увидеть текстовый ответ модели». Это может слегка смягчить UX, но сама модель при этом продолжает верить в выдуманные сущности и так же вести себя в последующих репликах. Правильный подход — сначала менять инструкции (system‑prompt, описания инструментов, follow‑ups), а уже потом дополнять это защитами в UI.

Ошибка №6: игнорирование влияния метаданных и схем на поведение модели.
Некоторые разработчики воспринимают JSON Schema и описания полей как «чисто для формы и валидации». На самом деле, для ChatGPT это важная часть промпта: по этим описаниям модель понимает, какие параметры ей нужно извлечь из запроса и как выглядит корректный ответ. Слабые или несогласованные описания полей (description, enum) повышают шанс ошибок и косвенно провоцируют галлюцинации.

Ошибка №7: слишком жёсткие запреты без альтернатив.
Бывает, что промпт превращается в сплошной список «не делай того, не делай этого», но нигде не сказано, что делать в сложных случаях. Например, мы запретили придумывать подарки и ограничили себя только каталогом, но ничего не сказали о теоретических вопросах. В итоге модель иногда просто отвечает «я не знаю», хотя могла бы полезно объяснить общие принципы выбора подарков. Всегда старайтесь не только запрещать, но и открывать разрешённые пути: «если не можешь найти подарок в каталоге — честно скажи об этом и предложи, как можно изменить запрос» или «если запрос теоретический — отвечай сам, без инструментов».

1
Задача
ChatGPT Apps, 5 уровень, 2 лекция
Недоступна
Служебный инструмент about_app как “глобальная прошивка” (версионирование контракта)
Служебный инструмент about_app как “глобальная прошивка” (версионирование контракта)
1
Задача
ChatGPT Apps, 5 уровень, 2 лекция
Недоступна
Антигаллюцинационный контракт для search_jet (description + schema + status в ToolOutput)
Антигаллюцинационный контракт для search_jet (description + schema + status в ToolOutput)
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ