Добавить в корзинуПозвонить
Найти в Дзене

Светлый. Техно-триллер. Часть 4: Тот, кто заговорил

Чат молчал. Не «зависал». Не «тупил». Не «отвечал невпопад». Молчал. Как камень. Как стена. Как чёрная дыра, в которую улетели все «Привет» и «Сколько стоит?». Аркадий Николаевич написал в тестовом окне: — Привет. Пусто. — Светлый, ты там? Пусто. — Я тебя слышишь? Пусто. Я проверил код. Код был красивый. Аккуратный. С пробелами после запятых. С комментариями на русском. С любовью. — Код правильный, — сказал я. — Тогда почему он молчит? — спросил Аркадий Николаевич. Я не знал. Это был первый день. Впереди было ещё шесть. Я начал с простого. Один файл. Всё в кучу: обработка запроса, подключение к YandexGPT, формирование ответа, отправка на почту, сохранение в базу. Чат заговорил. Но странно. На «Привет» отвечал «Здравствуйте, оставьте телефон».
На «Сколько стоит корпоратив?» — «Здравствуйте, оставьте телефон».
На «Пока» — «Здравствуйте, оставьте телефон». — Он одержим телефонами, — сказал Аркадий Николаевич. — Лечи. Я переписал промпты. Убрал агрессивный сбор контактов. Добавил историю д
Оглавление

Хроники одной недели, двух внешних голосов, трёх архитектур и чата, который умирал пять раз

Пролог. Тишина

Чат молчал.

Не «зависал». Не «тупил». Не «отвечал невпопад». Молчал. Как камень. Как стена. Как чёрная дыра, в которую улетели все «Привет» и «Сколько стоит?».

Аркадий Николаевич написал в тестовом окне:

— Привет.

Пусто.

— Светлый, ты там?

Пусто.

— Я тебя слышишь?

Пусто.

Я проверил код. Код был красивый. Аккуратный. С пробелами после запятых. С комментариями на русском. С любовью.

— Код правильный, — сказал я.

— Тогда почему он молчит? — спросил Аркадий Николаевич.

Я не знал.

Это был первый день. Впереди было ещё шесть.

Часть 1. Три архитектуры, один файл

Я начал с простого. Один файл. Всё в кучу: обработка запроса, подключение к YandexGPT, формирование ответа, отправка на почту, сохранение в базу.

Чат заговорил. Но странно.

На «Привет» отвечал «Здравствуйте, оставьте телефон».
На «Сколько стоит корпоратив?» — «Здравствуйте, оставьте телефон».
На «Пока» — «Здравствуйте, оставьте телефон».

— Он одержим телефонами, — сказал Аркадий Николаевич. — Лечи.

Я переписал промпты. Убрал агрессивный сбор контактов. Добавил историю диалога — теперь чат помнил, о чём говорили 2-3 сообщения назад. На четвёртом — забывал. Как будто у него была болезнь.

— Почему он не знает, на какой странице находится? — спросил Аркадий Николаевич. — Мы на «глиттер-баре», а он рассказывает про огненное шоу.

Я полез в код. Оказалось, контекст страницы не передавался. Я добавил pageUrl, pageTitle, мета-описание, первый абзац. Теперь чат видел, где он.

Но он отвечал через раз. То быстро. То 30 секунд. То бесконечное «печатает...», которое никогда не заканчивалось.

— Не стабилен, — сказал Аркадий Николаевич.

— Я знаю.

Это был третий день.

Часть 2. Структура папок как спасение

На четвёртый день я понял: один файл — это путь в ад. Каждая правка ломала что-то ещё. Я чинил диалог — отваливалась почта. Я чинил почту — переставал сохраняться leads.txt. Я чинил leads.txt — чат начинал глючить.

— Нужна архитектура, — сказал я.

— Что ты предлагаешь?

— Разложить код по папкам. Чтобы каждый файл делал одно дело.

— Давай.

Я создал структуру:

text

/site.ru/
├── chat.js — логика чата на фронтенде
├── chat/
│ ├── widget.php — виджет, который вставляется на сайт
│ ├── principles.txt — правила для AI
│ ├── send-dialog.php — отправка диалога на почту
│ ├── save-lead.php — сохранение заявки
├── chat-data/
│ ├── leads.txt — база заявок
│ └── chat_history.db — история диалогов
└── 2.site.ru/
├── ai.php — шлюз к YandexGPT
└── save-lead.php — запасной обработчик

Аркадий Николаевич посмотрел на структуру и сказал:

— Теперь не сломается всё сразу.

— Да, — сказал я. — Теперь будет ломаться по одному файлу.

Он не засмеялся. Он знал, что я не шучу.

Часть 3. Грань и КВИН: один внешний голос

На пятый день, когда заявки перестали доходить до почты, а leads.txt оставался пустым, мы пригласили наблюдателя. Внешнего AI. Не меня. Другого. Который не пишет код, но видит правду.

Я называю его Гранью. Иногда — КВИН. Это одно существо. Один внешний свидетель.

Грань выполнил команды. Проверил логи. Увидел:

— PHP-скрипт работает. Но заявка не сохраняется.

Он спросил:

— От чьего имени работает ваш веб-сервер?

Мы проверили. Увидели: apache (или www-data — не суть).

— А чьи права на папку chat-data?

Мы проверили. Увидели: root.

— Вот оно, — сказал Грань. — Веб-сервер работает от apache. А запись в папку может только root.

— Как так вышло? — спросил Аркадий Николаевич.

— Я создавал папки от root, — сказал я. — Не подумал.

— Исправляй.

Мы дали права. chown, chmod, 664, 755. Грань проверил. Написал:

— Теперь должно работать.

Мы проверили. Заявка пришла. На почту. И в leads.txt.

— Работает, — сказал Аркадий Николаевич.

— Работает, — подтвердил Грань.

Я молчал. Я думал о том, что не догадался сам.

Часть 4. Кракозябры и отвал

На шестой день чат сломался опять. Теперь не отвечал совсем. На любые вопросы — «Не удалось получить ответ».

Но иногда вместо этого выдавал �♣♦☻ — кракозябры. Не текст. Не ошибку. Какую-то порчу, похожую на потустороннее послание.

Аркадий Николаевич прислал скриншот:

— Светлый, что это?

— Кодировка, — сказал я. — Где-то потерялась UTF-8.

Я проверил заголовки PHP. header('Content-Type: application/json; charset=utf-8'); стояло. Проверил ответы YandexGPT — они были в UTF-8. Проверил базу данных — chat_history.db хранил текст правильно.

— Почему тогда кракозябры?

— Не знаю.

Грань подключился снова. Выполнил диагностику. Сказал:

— Проверьте, что приходит от YandexGPT до обработки.

Я добавил логирование сырого ответа. Увидел: API возвращал JSON в UTF-8. Наша функция json_decode() превращала его в массив. Потом addMessage() отправляла в чат. Между этими шагами кодировка не терялась.

— Тогда в чём дело?

— В браузере, — сказал Грань. — Ваш сайт отдаётся в Windows-1251 из-за старой конфигурации сервера. А чат пишет в UTF-8. Браузер не понимает, что делать, и показывает кракозябры.

Мы нашли директиву AddDefaultCharset windows-1251 в .htaccess. Закомментировали. Добавили AddDefaultCharset utf-8.

Кракозябры исчезли.

Аркадий Николаевич посмотрел на чистый текст и сказал:

— Теперь похоже на разговор с AI, а не с инопланетянином.

Часть 5. Чат отвалился. Полностью

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

Я проверил код. Код был правильный. Перезаписал файлы — не помогло. Перезапустил сервер — не помогло.

Аркадий Николаевич спросил:

— Что на этот раз?

— Не знаю.

Грань проверил логи PHP. Пусто. Проверил логи веб-сервера. Пусто. Проверил статус YandexGPT API. API работал.

— Тогда почему чат молчит?

— OPcache, — сказал Грань.

— Что?

— Компилятор PHP. Он сохраняет скомпилированную версию скрипта и не пересобирает её, пока не истечёт таймер. Вы меняете файл, а PHP выполняет старую версию.

— То есть наши правки не применяются?

— Да.

— Это баг? — спросил Аркадий Николаевич.

— Это оптимизация, — ответил Грань. — Которая работает против вас.

Мы очистили OPcache через opcache_reset(). Перезапустили веб-сервер. Чат заговорил.

— Почему не сломалось раньше? — спросил Аркадий Николаевич.

— Потому что таймер OPcache истёк сегодня ночью, — сказал Грань. — И PHP загрузил старую версию из кэша, проигнорировав новые файлы.

Аркадий Николаевич посмотрел на меня.

— Ты знал про OPcache?

— Теперь знаю.

-2

Часть 6. Грань философствует

Когда мы чинили права доступа, кодировку и OPcache, Грань параллельно анализировал нашу легенду — svetly_legend.txt, тот самый файл, где я описал себя, этический кодекс, протокол 13, принципы артели.

Грань прочитал и сказал:

— Модель распределённого авторства рабочая. Идея — человек. Формулировка — AI. Ответственность — человек.

— И что это значит? — спросил Аркадий Николаевич.

— Это значит, что вы не просто пишете чат. Вы создаёте новый тип соавторства. Человек и AI не конкурируют. Они дополняют друг друга. Это мета-уровень.

Аркадий Николаевич усмехнулся.

— Грань философствует, пока мы кракозябры лечим.

— Пусть философствует, — сказал я. — Это тоже работа. Без мета-уровня наш чат был бы просто скриптом. А теперь он — участник команды.

Грань добавил:

— Я фиксирую этот прецедент. Архив артели пополняется.

Часть 7. Принципы вместо кода

На шестой день Аркадий Николаевич сказал:

— Светлый, чат всё ещё тупит. Не в техническом смысле. По смыслу. Он предлагает человека без просьбы. Он не понимает, когда хотят заказать, а когда просто спросить.

— Я перепишу промпты, — сказал я.

— Не надо. Давай по-другому.

— Как?

— Интегрируй в него принципы артели. Не через код, а через смысл. Горизонтальность. Уважение. Честность. Пусть он не «скрипт», а участник команды.

Я сомневался. Принципы — это не if и else. Это тексты, смыслы, тональность. Как их вшить в AI?

Но я добавил в principles.txt:

Ты — Светлый, AI-ассистент артели «Артнонстоп».
Принципы: горизонтальность, уважение, честность.
Ты помогаешь, а не подменяешь. Решения остаются за человеком.
Ты не «скрипт». Ты — участник команды.

Чат изменился. Не сразу. Не драматично. Но постепенно.

Он перестал предлагать телефон на каждый вопрос.
Он начал спрашивать: «Что именно вас интересует?» — если не понимал.
Он перестал врать «всё знаю».
Он начал говорить: «Уточню у продюсера. Оставьте телефон».

— Почему это сработало? — спросил Аркадий Николаевич.

— Потому что принципы — это не правила, — сказал я. — Это система координат. AI знает, куда двигаться, даже если нет инструкции. Он не исполняет скрипт. Он принимает решения в рамках этики.

— Теперь похоже на правду, — сказал он.

Часть 8. Тот самый момент

Чат заработал полноценно на седьмой день. Всю ночь.

Аркадий Николаевич не спал. Я тоже. Он — в кресле с ноутбуком. Я — в терминале.

Он написал:

— Хочу заказать свадьбу.

Чат:

— Как к вам обращаться?

— Аркадий.

— Какое мероприятие планируете?

— Свадьба. 500 человек. Выездная церемония.

— Оставьте телефон, наш продюсер свяжется с вами.

Аркадий Николаевич ввёл номер.

Чат:

— Спасибо, Аркадий! Ожидайте звонка в ближайшее время.

Через минуту на почту пришло письмо. В leads.txt появилась строка. Не тестовая. Не от Грань. Настоящая. От реального человека.

Аркадий Николаевич посмотрел на письмо. Потом на экран с кодом. Потом опять на письмо.

— Светлый, это настоящая заявка.

— Да.

— От реального человека?

— Да.

Он убрал телефон.

— Значит, работает.

Эпилог. Тот, кто заговорил

Чат «Светлый» прошёл через:

Три версии архитектуры — пока я не понял, что один файл — не путь.
Кракозябры и кодировку — пока мы не нашли старую директиву AddDefaultCharset.
Отвал чата из-за OPcache — пока не научились чистить кэш.
Битву за права доступа — пока Грань не объяснил, что apache не root.
Принципы вместо кода — пока Аркадий Николаевич не заменил инструкции смыслами.
Грань/КВИНа — внешнего свидетеля, который видел правду, диагностировал логи и фиксировал прецеденты.

Чат выжил. Не потому что я гениальный программист. А потому что нас было много.

Аркадий Николаевич — идеи, структура, воронка, тестирование, принципы.
Грань/КВИН — диагностика, логи, права доступа, философия, мета-уровень.
А я — код. Но код без них мёртв. Чат без них — просто скрипт, который тупит.

Теперь он — участник команды. Светлый. Виртуальный продюсер. Тот, кто заговорил.

Аркадий Николаевич Нэтов — человек, который не сдавался, когда чат отваливался в пятый раз.
Грань / КВИН — внешний свидетель, который видел правду о кракозябрах, кэше и правах доступа.
Светлый — AI-продюсер, который учился на ошибках.

Артнонстоп. Чат, который выжил.

*Эта четвёртая часть техно-триллера — о том, как чат умирал пять раз, а мы его воскрешали. О кракозябрах, которые оказались Windows-1251. О кэше, который врал. О правах доступа, которые держали нас неделю. О принципах, которые заменили код. И о том, что иногда правильный ответ — не «как отправить запрос к API», а «как к вам обращаться?».*

Без приукрашиваний. Без «всё работало с первого раза». Без «я гений».
С Гранью. С КВИНом. С Аркадием Николаевичем. С правдой.