Всем привет! Мне 34, из них больше десяти лет я в коммерческой разработке. Примерно столько же я женат на Катюше. За это время мы прошли через всё: от внезапных сюрпризов, которые категорически «не зашли» (самый эпичный фейл — подаренная мной картина-портрет, о которой Катюша очень тактично промолчала, но по её взгляду я всё понял), до прагматичных, но до боли скучных списков в телефонных заметках или капитуляции в духе: «милая, вот деньги, купи себе что-нибудь сама».

Каждый год 7 марта(и ещё ~5 дат) я ловил себя на мысли, что стою в торговом центре с пустым взглядом. Цветы — клише. Очередной айфон — отлично, но в году ещё ~5 праздников, так часто новые модели не выходят.

В этом году я решил подойти к проблеме не как муж в панике, а как программист. Я прочитал книгу Гэри Чепмена «Пять языков любви», поймал пару инсайтов и... пошел кодить идеальный вишлист.


Пять языков любви: почему мы промахиваемся с подарками

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

  1. Слова поощрения — «я горжусь тобой», «ты молодец».

  2. Время вдвоём — быть рядом, без телефонов и рабочих чатов.

  3. Подарки — фокус не на цене, а на факте «он обо мне подумал».

  4. Акты помощи — забрал из садика, приготовил ужин, починил кран.

  5. Прикосновения — объятия, тактильный контакт.

Самая важная мысль книги: мы выражаем любовь на СВОЁМ языке, а не на языке партнёра. Мой язык любви — «Прикосновения» и «Время вдвоём».

Язык Катюши — «Слова», «Подарки» и тоже «Время вдвоём». Десять лет я мог вкладывать ресурс во что-то одно, в то время как её «эмоциональный бак» (термин Чепмена) требовал совершенно другого топлива.

Проблема в том, что сказать партнёру: «Мне нужны прикосновения, а не твои подарки» — неловко. Идея родилась мгновенно: нужен сервис, который выступит переводчиком. Она проходит короткий тест, выбирает свой язык любви и конкретные хотелки. ИИ генерирует персональную «инструкцию к сердцу» и отправляет ссылку мне. Я прохожу свой тест, а под капотом ИИ сравнивает профили и выдает план на 8 марта.

Сервис Wish-лист на основе книги "Пять языков любви"
Сервис Wish-лист на основе книги "Пять языков любви"

Стек: Flask + Vanilla JS + DeepSeek

Выбор стека был максимально прагматичным — у меня была ровно одна неделя до праздника.

  • Бэкенд: Flask + MySQL + SQLAlchemy. Скучно, надежно, пуленепробиваемо. Flask — это pip install, один файл, и API готово.

  • Фронтенд: Vanilla JS. Никакого React, Vue или даже jQuery. Один файл app.js на 675 строк. В 2025 году это звучит как дичь, но аргументацию я приведу ниже.

  • ИИ: DeepSeek API. OpenAI-совместимый, дешевый, быстрый. Для генерации коротких русскоязычных текстов — идеален.

  • Визуал: Внешний API с классическими картинками в стиле вкладышей «Love Is...» для создания нужного настроения.

Формирование и отправка wish-листа
Формирование и отправка wish-листа

Модель данных: два потока, одна пара

Ключевая мысль — в сервисе два потока: Её и Его. Они связываются через уникальный короткий код (чтобы ссылки выглядели по-человечески, например /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 марта

Prompt engineering: заставляем ИИ писать «Love is...»

Самая веселая часть — промпты. Я переписывал их десяток раз. Первая версия от ИИ звучала как диагноз: «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,
)

Ключевые хаки:

  1. Стоп-слова. LLM обожают психологический жаргон. Пришлось жестко забанить «триггеры» и «паттерны».

  2. temperature=0.9. Для лирики нужен рандом. На 0.3 модель выдает скучные штампы.

  3. П��имер в промпте. Без него ИИ льет воду («проявлять любовь через коммуникацию»). С примером дает конкретику («написать первым в 10 утра»).

Парный матчинг: не перепутай ЕЁ и ЕГО

Когда я перехожу по ссылке от жены, я попадаю на Gate Screen. Прохожу свой мини-тест, и тут магия ИИ собирает нам план на вечер.

Здесь всплыла забавная бага: ИИ в 30% случаев путал профили и писал, что «Его язык любви — Подарки», хотя это был язык Катюши.

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

"ВАЖНО: не путай ЕЁ и ЕГО профили! Всегда чётко указывай, кто есть кто по имени/местоимению."

Ошибка упала до 5%. ИИ получает массив конкретных желаний жены (например, «ужин в ресторане» и «новые кроссовки») и строит план вокруг них, учитывая мой язык любви (например, предлагая мне подарить кроссовки во время долгой пешей прогулки — комбо!).

Я использовал грязный хак с маркером ===PLAN=== для разделения вывода на анализ совместимости и сам список действий. Для двух текстовых блоков настраивать строгий JSON mode было оверкиллом.

Вместо итогов: что я понял за эту неделю

  1. Про отношения. Катюша прошла тест первой. Выбрала «Слова» и «Подарки». В конкретных желаниях (которые подтягивались динамически из JS) отметила не вещи, а «Письмо от руки» и «Мастер-класс по керамике вместе». Я 10 лет пытался удивить её вещами, а ей нужны были эмоции и контекст.

  2. Про разработку. MVP за неделю — это реально, если отсечь инфраструктурный жир. Vanilla JS для микро-SPA — это нормально. DeepSeek — шикарная и дешевая альтернатива OpenAI для ру-сегмента (переезд занял ровно одну строку — замену base_url).

  3. Про результаты. Когда я прошел тест вторым, ИИ выдал нам идеальный сценарий выходного. Катя прочитала и с улыбкой сказала: «Ну вот, нейросеть поняла меня быстрее, чем ты за 10 лет. Но закодил-то её ты!».

Гэри Чепмен написал свою книгу в 1992 году. С тех пор мы изобрели нейросети, написали миллионы строк кода, но до сих пор с трудом читаем мысли самых близких людей. Если мой код помог хотя бы одной паре (нам) нормально поговорить о желаниях — значит, сервер крутится не зря.


А теперь вопросы к Вам:

  • А вы знаете языки любви (свои и партнера)?

  • Как решаете проблему подарков, когда вместе уже целую вечность?

  • Vanilla JS vs фреймворки для weekend-project — на чьей вы стороне в 2025 году?

Буду рад обсудить в комментариях! И с наступающим праздником всех причастных!

PS: При разработке сервиса консультировался с хорошей знакомой, увлекающейся психологией, сервис доступен по ссылке https://wish.inevskaya-ai.ru/

Анимация - ссылка на стикерпак https://t.me/addstickers/GumLoveIs

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Какой ваш язык любви?
12.5%Подарки1
62.5%Время вдвоём5
75%Прикосновения6
62.5%Помощь5
25%Слова2
Проголосовали 8 пользователей. Воздержались 9 пользователей.