Все записи
7 мин

Мой AI-оракул врал во спасение: как я вшил честность без алармизма в 7 промптов сразу

промптыclaude codeai-агенты

Если у вас есть бот с нейросетью, который что-то генерит для живых людей, а потом вы вдруг замечаете, что он всё сводит к хорошему и реальные косяки прячет за вежливыми эвфемизмами, то знайте — почти наверняка дело не в модели и не в данных, а в ваших же system-промптах, где вы сами когда-то и попросили сглаживать углы. У меня в приложении разбор совместимости вместо настоящего противоречия выдавал «зоны роста», я полез проверять, и из 10 доменов 7 оказались с инструкцией смягчать правду. Лечится это не сменой LLM и не дообучением, а одним блоком в промпте, который я для себя назвал truth-injection: называть реальный конфликт конкретно, но без алармизма, без «опасно» и «приговор». Дальше по порядку расскажу, как я к этому пришёл и что сломалось по дороге.

С чего всё началось — «моментики, которые сводятся к хорошему»

Картара — это моё Telegram-приложение с AI-личностью, оно делает людям разборы, и я сам им периодически пользуюсь, проверяю на себе. И вот сижу, читаю разбор совместимости, и меня царапает. Вроде всё гладко, всё красиво, но как-то подозрительно красиво. Я тогда сформулировал это буквально так: «просто мне показалось что вроде есть моментики но они сводятся к хорошему». Понимаете, о чём я? Не то чтобы там написана откровенная неправда, нет. Просто реальные конфликты, которые в нормальном человеческом разборе обязаны прозвучать, аккуратно заворачиваются в вату, и там, где должно быть «вот тут вы будете биться лбами по такому-то поводу», стоит «зона роста для пары». А я ведь когда продукт задумывал, прямо себе в заметку записал, что хочу видеть его максимально достоверным, чтобы он не сглаживал углы и говорил прямо в том, что касается интерпретации. И вот оно сглаживает, то есть продукт делает ровно то, чего я не хотел.

А откуда это вообще лезет — из модели, из данных, из самой архитектуры RAG? Тут очень легко уйти не туда. Можно начать менять нейросеть, можно лезть в данные, можно перекраивать пайплайн, и потратить на это неделю, чтобы в конце выяснить, что копал совсем не там.

Аудит десяти доменов — где именно врёт

Поэтому первым делом я не стал ничего трогать, а сел и устроил аудит. У меня в приложении не один промпт на всё, а отдельные домены под разные сценарии — разбор, ежедневная карта, утренний синтез и так далее, всего десять штук. Я прошёлся Claude Code по всем их system-промптам и попросил честно сказать, где модели прямым текстом велено смягчать, обтекать, держаться позитива.

И картина вышла такая. Из 10 доменов 7 реально инструктировали LLM сглаживать — где-то это было «избегай резких формулировок», где-то «фокусируйся на позитивном», а по сути одно и то же. А ещё 3 домена оказались мягкими by design, и это нормально, потому что утреннее приветствие или карта дня не обязаны вываливать на человека тяжёлую правду спросонья, там мягкость к месту. Так что трогать их было нельзя, иначе я бы сломал то, что и так работает как надо.

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

Тонкая грань — правда, но не алармизм

Тут была вторая ловушка, и она хитрее первой. Когда я понял, что промпты сглаживают, первым порывом было задрать рычаг в обратную сторону, чтобы он рубил правду-матку и называл вещи своими именами без всяких реверансов. Но это же ровно та же ошибка, только наизнанку. Я как раз параллельно спорил с ассистентом про голос контента про отношения и сформулировал это для себя так: «ты то есть из той карйности теперь в эту пришел. надо и то и то, понимаешь». Вот именно, не из ваты в топор, а нащупать середину.

Потому что если AI вместо «зоны роста» начнёт писать «это опасно» и «это приговор для отношений», то это уже не честность, а алармизм, и человек его просто закроет и больше не откроет. Настоящая задача звучала так: назвать реальное противоречие конкретно, по делу, но без драматизации и пугалок, то есть не «у вас всё плохо», а «вот здесь у вас регулярно будет вот такое трение, и вот почему». Разница между этими двумя формулировками — это и есть вся работа.

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

Что я делал руками, а что делал Claude Code

Сразу скажу честно, потому что для меня это принципиально: код я руками не пишу и этого не скрываю. Я оркестрировал, а писал Claude Code. Моя работа тут была не в наборе текста, а в том, чтобы поймать проблему на себе как пользователь, правильно её диагностировать, не дать починить не то и удержать ту самую грань между ватой и топором. Это, если хотите, и есть разработка с ИИ в чистом виде — я думаю и решаю, а агент исполняет.

Дальше под это завели спеку, чтобы фикс был не «я тут по-быстрому подправил три слова», а нормальная задача с проверяемым результатом. Сам блок truth-injection вшили в те самые 7 промптов, которые сглаживали, а три мягких by-design домена не тронули вообще, оставили как есть. И это, между прочим, не такая очевидная сдержанность, как кажется, потому что соблазн причесать всё подряд под одну гребёнку очень велик, а делать так нельзя.

Проверка — не на глаз, а цифрами

Тут я учёный, потому что промпты — штука хрупкая: подкрутил формулировку в одном месте, а поехало в трёх других. Поэтому проверяли не «ну вроде стало честнее, мне нравится», а по-нормальному. Этому меня в своё время хорошо научил баг с A/B-тестом пейволла, где «работало», а 90 из 90 видели один вариант, — «вроде нормально» и реальные цифры это совсем не одно и то же.

Smoke-прогон по всем семи изменённым промптам прошёл 7 из 7, то есть каждый из них теперь реально называет конфликт конкретно и при этом не срывается в алармизм. А регрессия прошла 116 из 116 — это значит, что всё остальное, что работало до моих правок, продолжило работать, и я ничего не сломал по дороге. И вот эта вторая цифра для меня важнее первой. Потому что починить одно и втихую разломать пять — это любимый жанр промпт-инжиниринга, и без прогона регрессии ты узнаёшь об этом уже от пользователей, а это худший способ узнавать про свои косяки.

Что я из этого вынес

Главное — когда нейросеть в продукте ведёт себя не так, первым делом лезьте не в модель и не в данные, а в свой же system-промпт, и читайте его глазами скептика. Очень часто проблема не в том, что AI чего-то не умеет, а в том, что вы ему прямым текстом велели делать ровно то, что вас теперь бесит. Я сам себе зашил враньё во спасение, потому что на старте боялся грубости, и перестраховка вышла боком.

Второе — честность это не противоположность мягкости и не синоним грубости, это конкретность без драматизации. «Вот здесь у вас будет трение по такому-то поводу» вместо вежливого «зона роста» и вместо пугающего «это опасно». Нащупать середину между ватой и топором — вот это и есть вся настоящая работа над тоном, и сделать это можно текстом в промпте, без всякого дообучения и смены LLM.

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