Всем привет! Мне 34, из них больше десяти лет я в коммерческой разработке. Примерно столько же я женат на Катюше. За это время мы прошли через всё: от внезапных сюрпризов, которые категорически «не зашли» (самый эпичный фейл — подаренная мной картина-портрет, о которой Катюша очень тактично промолчала, но по её взгляду я всё понял), до прагматичных, но до боли скучных списков в телефонных заметках или капитуляции в духе: «милая, вот деньги, купи себе что-нибудь сама».
Каждый год 7 марта(и ещё ~5 дат) я ловил себя на мысли, что стою в торговом центре с пустым взглядом. Цветы — клише. Очередной айфон — отлично, но в году ещё ~5 праздников, так часто новые модели не выходят.
В этом году я решил подойти к проблеме не как муж в панике, а как программист. Я прочитал книгу Гэри Чепмена «Пять языков любви», поймал пару инсайтов и... пошел кодить идеальный вишлист.
Если вы не читали Чепмена, вот суть системы: у каждого человека есть основной язык любви — канал, через который он чувствует заботу:
Слова поощрения — «я горжусь тобой», «ты молодец».
Время вдвоём — быть рядом, без телефонов и рабочих чатов.
Подарки — фокус не на цене, а на факте «он обо мне подумал».
Акты помощи — забрал из садика, приготовил ужин, починил кран.
Прикосновения — объятия, тактильный контакт.
Самая важная мысль книги: мы выражаем любовь на СВОЁМ языке, а не на языке партнёра. Мой язык любви — «Прикосновения» и «Время вдвоём».
Язык Катюши — «Слова», «Подарки» и тоже «Время вдвоём». Десять лет я мог вкладывать ресурс во что-то одно, в то время как её «эмоциональный бак» (термин Чепмена) требовал совершенно другого топлива.
Проблема в том, что сказать партнёру: «Мне нужны прикосновения, а не твои подарки» — неловко. Идея родилась мгновенно: нужен сервис, который выступит переводчиком. Она проходит короткий тест, выбирает свой язык любви и конкретные хотелки. ИИ генерирует персональную «инструкцию к сердцу» и отправляет ссылку мне. Я прохожу свой тест, а под капотом ИИ сравнивает профили и выдает план на 8 марта.
Выбор стека был максимально прагматичным — у меня была ровно одна неделя до праздника.
Бэкенд: Flask + MySQL + SQLAlchemy. Скучно, надежно, пуленепробиваемо. Flask — это pip install, один файл, и API готово.
Фронтенд: Vanilla JS. Никакого React, Vue или даже jQuery. Один файл app.js на 675 строк. В 2025 году это звучит как дичь, но аргументацию я приведу ниже.
ИИ: DeepSeek API. OpenAI-совместимый, дешевый, быстрый. Для генерации коротких русскоязычных текстов — идеален.
Визуал: Внешний API с классическими картинками в стиле вкладышей «Love Is...» для создания нужного настроения.
Ключевая мысль — в сервисе два потока: Её и Его. Они связываются через уникальный короткий код (чтобы ссылки выглядели по-человечески, например /r/a3f2b1c7).
def short_uuid(): return uuid.uuid4().hex[:8] class QuizResult(db.Model): unique_code = db.Column( db.String(36), unique=True, nullable=False, default=short_uuid ) love_language = db.Column(db.String(200), nullable=False) # через запятую, если несколько attachment_type = db.Column(db.String(50), nullable=False) ai_text = db.Column(db.Text, nullable=True) wishes = db.Column(db.Text, nullable=True) # JSON-массив желаний is_partner = db.Column(db.Boolean, default=False)
Обратите внимание на love_language — это String(200). В реальности у человека редко бывает только один язык любви (у нас с Катей их по несколько). Я разрешил множественный выбор, сохраняя данные через запятую. Да, M2M-связь была бы академически правильнее, но для MVP работает и так.
Вторая модель — PairMatch — связывает два результата и хранит сгенерированный план:
class PairMatch(db.Model): her_result_id = db.Column(db.Integer, db.ForeignKey("quiz_results.id"), nullable=False) his_result_id = db.Column(db.Integer, db.ForeignKey("quiz_results.id"), nullable=False) match_plan = db.Column(db.Text, nullable=True) # Сгенерированный план на 8 марта
Самая веселая часть — промпты. Я переписывал их десяток раз. Первая версия от ИИ звучала как диагноз: «Love is... когда партнёр учитывает ваш избегающий тип привязанности». Спасибо, но мы тут 8 марта празднуем, а не на терапии сидим.
Финальный промпт для карточек:
response = client.chat.completions.create( model="deepseek-chat", messages=[ { "role": "system", "content": ( "Ты — остроумный и дерзкий копирайтер. Пишешь тёплые, но с перчинкой " "фразы в стиле стикеров «Love is...». Без занудства, без психологических " "терминов. Только живой русский язык. Максимум 2 предложения." ), }, { "role": "user", "content": ( f"Язык любви человека: {ll_ru}.\n" f"Тип привязанности: {at_ru}.\n\n" f"Напиши одну фразу в формате «Love is... [конкретное действие партнёра]».\n" f"Фраза должна учитывать оба параметра. Будь конкретной, с юмором. " f"Не используй слова: триггер, паттерн, привязанность, когнитивный.\n" f"Пример: «Love is... написать ей первым в 10 утра, чтобы она не успела накрутить себя.»" ), }, ], temperature=0.9, max_tokens=200, )
Ключевые хаки:
Стоп-слова. LLM обожают психологический жаргон. Пришлось жестко забанить «триггеры» и «паттерны».
temperature=0.9. Для лирики нужен рандом. На 0.3 модель выдает скучные штампы.
Пример в промпте. Без него ИИ льет воду («проявлять любовь через коммуникацию»). С примером дает конкретику («написать первым в 10 утра»).
Когда я перехожу по ссылке от жены, я попадаю на Gate Screen. Прохожу свой мини-тест, и тут магия ИИ собирает нам план на вечер.
Здесь всплыла забавная бага: ИИ в 30% случаев путал профили и писал, что «Его язык любви — Подарки», хотя это был язык Катюши.
Пришлось добавить в системный промпт капсом:
Ошибка упала до 5%. ИИ получает массив конкретных желаний жены (например, «ужин в ресторане» и «новые кроссовки») и строит план вокруг них, учитывая мой язык любви (например, предлагая мне подарить кроссовки во время долгой пешей прогулки — комбо!).
Я использовал грязный хак с маркером ===PLAN=== для разделения вывода на анализ совместимости и сам список действий. Для двух текстовых блоков настраивать строгий JSON mode было оверкиллом.
Про отношения. Катюша прошла тест первой. Выбрала «Слова» и «Подарки». В конкретных желаниях (которые подтягивались динамически из JS) отметила не вещи, а «Письмо от руки» и «Мастер-класс по керамике вместе». Я 10 лет пытался удивить её вещами, а ей нужны были эмоции и контекст.
Про разработку. MVP за неделю — это реально, если отсечь инфраструктурный жир. Vanilla JS для микро-SPA — это нормально. DeepSeek — шикарная и дешевая альтернатива OpenAI для ру-сегмента (переезд занял ровно одну строку — замену base_url).
Про результаты. Когда я прошел тест вторым, ИИ выдал нам идеальный сценарий выходного. Катя прочитала и с улыбкой сказала: «Ну вот, нейросеть поняла меня быстрее, чем ты за 10 лет. Но закодил-то её ты!».
Гэри Чепмен написал свою книгу в 1992 году. С тех пор мы изобрели нейросети, написали миллионы строк кода, но до сих пор с трудом читаем мысли самых близких людей. Если мой код помог хотя бы одной паре (нам) нормально поговорить о желаниях — значит, сервер крутится не зря.
А теперь вопросы к Вам:
А вы знаете языки любви (свои и партнера)?
Как решаете проблему подарков, когда вместе уже целую вечность?
Vanilla JS vs фреймворки для weekend-project — на чьей вы стороне в 2025 году?
Буду рад обсудить в комментариях! И с наступающим праздником всех причастных!
PS: При разработке сервиса консультировался с хорошей знакомой, увлекающейся психологией, сервис доступен по ссылке https://wish.inevskaya-ai.ru/
Анимация - ссылка на стикерпак https://t.me/addstickers/GumLoveIs
Источник


