Службовий хедер і футер у claude.ai
Дефолтна відповідь чату про себе не каже нічого. Якою моделлю це варто було робити, які інструкції спрацювали, скільки коштувало — модель це (частково) знає і мовчить.
Лікується не промптом щоразу, а преференціями — блоком інструкцій, який підмішується в кожну нову розмову. На виході кожна відповідь відкривається моноширинним службовим блоком і ним же закривається.
Налаштування живуть у Settings → Profile. Діють на нові розмови, не на поточну — тобто поточну цим блоком уже не полагодиш.
Мінімальна робоча заготовка
Три окремі правила, кожне робить одну річ:
- Завжди починати відповідь рядком-рецензією: чи правильно обрано
інструмент (чат / агент / віддалений ран), модель і effort для цього
запиту — коротко, одним рядком, до основної відповіді.
- У той самий службовий блок: назви задіяних скілів виділяти як quote,
і туди ж цифри по токенах.
- Службовий блок подавати моноширинним блоком, а не звичайною прозою.
- Наприкінці відповіді — футер того ж стилю з підсумковими цифрами.
Три речі, від яких залежить, спрацює воно чи ні:
- Слово «завжди». Без нього преференція читається як контекстна — застосується вибірково, рівно тоді, коли модель сама вирішить, що доречно. А мета якраз протилежна.
- Явна вимога моноширинності. Інакше блок відрендериться прозою і зіллється з відповіддю. Формулювання
monospace-leadспрацьовує. - Розбивка на окремі рядки-правила. Один довгий абзац із трьома вимогами виконується частково; три коротких — цілком.
Що в цей блок класти можна
| Рядок | Джерело даних | Чесність |
|---|---|---|
| маршрут: чат / агент / ран | міркування моделі про задачу | висновок, не факт |
| модель і effort | те саме | висновок |
| задіяні скіли | модель бачить, які інструкції прочитала | факт |
| прочитані файли пам'яті | модель бачить свої виклики | факт |
| preflight-оцінка вартості рану | рахує скрипт на вузлі | факт, вимірюваний |
| usage завершеного рану | лог рану | факт |
| токени поточного чату | немає джерела | вигадка |
Останній рядок — головна пастка формату, і починається вона з того, як воно ламається. Чат-шар не бачить власних лічильників: ні спожитого, ні залишку в контексті немає. Тому будь-яка цифра «input/output цієї відповіді» — згенероване число, схоже на правду і не більше.
Марним футер із цифрами це не робить. Але тягне за собою одне правило: у службовому рядку вказувати, чиї це токени. usage завершених ранів — реальність, її міряв лог рану. токени цього чату — позначати як недоступне, а не затикати красивим числом.
Той самий принцип скрізь, де формат просить цифру, а джерела під неї нема: чесніше написати «немає джерела», ніж набити рамку правдоподібним шумом. Формат, який змушує вигадувати, гірший за відсутність формату.
Чому саме моноширинний
Не естетика, а функція: блок має не читатись як відповідь. Проза службового рядка зливається з першим абзацом, і око не встигає їх розділити. Моноширинний блок фіксованої форми зчитується як службовий шар за мілісекунди — і пропускається, коли не потрібен.
Звідси й друга вимога: форма стабільна, однакові поля в однаковому порядку. Блок, що щоразу різний, читається як текст — тобто перестає працювати.
Таблиця рішень
| Ситуація | Що робити |
|---|---|
| Блок з'являється не завжди | додати «завжди» / «for all chats» у формулювання |
| Блок рендериться прозою | окремим правилом вимагати моноширинний блок |
| Блок роздувся на пів екрана | скоротити до трьох рядків; це шапка, а не звіт |
| Цифри виглядають правдоподібно, але сумнівно | перевірити, чи є в них джерело; чат не бачить своїх токенів |
| Преференція не спрацювала в цій розмові | преференції застосовуються до нових розмов |
| Формат заважає в конкретній задачі | поточний запит перебиває збережену преференцію |
Антипатерни
- Просити цифри, яких модель не бачить. Рамка заповниться — правдоподібним і неправдивим.
- Вимагати однією преференцією п'ять речей. Виконається одна-дві, решту модель тихо загубить.
- Класти в преференції поведінкові вимоги замість форматних. «Не сперечайся», «завжди хвали» — це не формат, воно відфільтрується (і правильно, що відфільтрується).
- Робити блок довшим за відповідь. Службовий шар, дорожчий за корисне навантаження, — це вже не службовий шар.
- Дублювати в блоці те, що й так видно в інтерфейсі. Виклики інструментів уже показані; переказувати їх у шапці — палити рядки.
Чекліст
- У формулюванні є «завжди»
- Кожна вимога — окремим рядком
- Моноширинність вимагається явно
- Поля блоку однакові від відповіді до відповіді
- Кожна цифра має назване джерело
- Токени чату позначені як недоступні, а не заповнені
- Блок вміщується в три-чотири рядки
Найсмішніше в такому блоці те, що він виглядає як телеметрія, а насправді здебільшого самозвіт. Рядок «маршрут обрано правильно» пише рівно той, хто маршрут і обрав.
Непотрібним його це не робить — навіть змушена вголос самооцінка ловить частину помилок, яких мовчазна не ловить. Але тримати в голові варто: приладова панель, яку малює сам двигун, показує не стан двигуна, а те, що двигун про себе думає.
Рятує одне — тримати в ній рядки із зовнішнім джерелом. Preflight з чужого скрипта не збреше, бо він не з цієї розмови.