MindPair: предложение по первому этапу

Сопроводительное письмо

Сергей, добрый день.

Спасибо за подробный документ — он сильно отличается от того, что мы обсуждали изначально, и это хорошо: теперь понятно, что ядро продукта — не обработка сообщений, а приватные пространства, согласие на передачу и долговременная память с правами доступа.

Ниже — моё видение первого этапа: архитектура, разделение A / B / V, устройство памяти, независимость от LLM, команда, сроки, риски, бюджет и сопровождение пилота. Отдельным разделом — требования, которые я бы предложил решить иначе.

Коротко о главном:

Буду рад обсудить детали на созвоне.

Владислав

Как я понял задачу

Первый этап — рабочий прототип для пилота на 10+ парах, который проверяет три вещи: изоляцию приватных пространств, передачу в общее пространство только по явному согласию и долговременную память, которая уважает права доступа.

Изначально мы обсуждали общий чат пары, где AI обрабатывает сообщения, и простые заметки. Уточнённая задача шире:

ИзначальноТеперь
Главная механикаAI обрабатывает каждое сообщение в общем чатеУ каждого свой диалог с AI (Private A / B); в общее пространство V попадает только подтверждённое
ПамятьЗаметки: планы, даты, договорённостиТри области памяти, происхождение, статусы, «факт / самоописание / гипотеза», изменения во времени
ПраваОбщая или личная заметкаПроизводные выводы наследуют права источника; права важнее релевантности
Жизненный цикл данныхИстория хранитсяОтзыв, удаление по согласию, удаление V при прекращении пары
LLMОдна модельЗаменяемый компонент, память не зависит от провайдера
ИнфраструктураНе обсуждаласьВсё на аккаунтах проекта, прозрачные расходы на LLM

У меня уже есть заготовка базовой части: аккаунты, приглашения и жизненный цикл пары, realtime, простой web-клиент, автотесты. Это сокращает срок; приватные AI-диалоги, согласие и память проектируются заново под ваши требования.

Архитектура

Один backend-сервис с чёткими модулями внутри, PostgreSQL как единственное хранилище истории, памяти и прав, web-клиент под смартфон. Модель подключается через AI-слой и меняется без потери данных.

Все чтения идут через слой прав, LLM — сменный компонентMindPair Core — один backendWeb-клиентсмартфон, браузермобильный клиент — позжеAPIREST + WebSocket, FastAPIСлой прав доступафильтр по пространству и пареСборщик контекстатолько доступное пользователюAI-слойединый интерфейс, выбор моделиФоновые задачиизвлечение памяти, оценка рискаПровайдеры LLMAnthropicOpenAI-совместимыеopen-source, локальныеданные у провайдера не хранятсяPostgreSQL + pgvectorистория, память, права, журналRow-Level SecurityRedisочередь задач, realtimeтолько через слой прав
Архитектура прототипа: компоненты и потоки данных

Любой запрос — от клиента или фоновой задачи — читает данные только через слой прав; в модель уходит только то, что отобрал сборщик контекста.

КомпонентВыборПочему
BackendPython, FastAPI, SQLAlchemyЛучшая экосистема для работы с LLM; асинхронность под realtime и долгие вызовы моделей
FrontendVue 3 + TypeScript, адаптивный web с установкой на главный экран (PWA)Быстро для пилота; мобильное приложение потом использует тот же API
База и памятьPostgreSQL + pgvector + Row-Level SecurityПрава, связи происхождения и векторный поиск — в одной базе и одном запросе
Фоновые задачиОчередь на RedisИзвлечение памяти не задерживает ответ пользователю
AI-слойСобственный тонкий интерфейс + адаптеры провайдеровПолный контроль над тем, что уходит в модель; нет привязки к фреймворку

Какие альтернативы рассматривал и почему нет:

Ограничения подхода:

Разделение Private A / Private B / V

Изоляция обеспечивается архитектурой, а не инструкциями для AI: данные Private A физически не могут попасть в запрос к LLM, который собирается для B.

Пять уровней защиты:

  1. Пространство у каждой записи. У любой записи (сообщение, черновик, элемент памяти) есть владелец и пространство: private:<user> или shared:<пара>. Записи без пространства база не примет.

  2. Единый слой прав. Любое чтение идёт через один модуль прав доступа: он добавляет фильтр «только моё приватное или общее моей пары» до того, как запрос дойдёт до базы.

  3. Row-Level Security в PostgreSQL. Второй рубеж на уровне базы: даже ошибка в коде приложения не вернёт чужие строки.

  4. Сборщик контекста для LLM. Контекст для запроса к модели собирается только из того, что доступно текущему пользователю в текущем пространстве. У модели нет инструмента «прочитать чужое» — ей нечего утечь.

  5. Автотесты изоляции. Отдельный набор тестов проверяет: ни один эндпоинт не отдаёт B данные Private A, и ни один промпт для B не содержит данных Private A. Эти тесты — часть приёмки.

Передача Private → Shared. AI только готовит черновик. Пользователь видит ровно тот текст, который увидит партнёр, и пометку «станет доступно партнёру и общей памяти пары». Публикация — отдельное действие владельца: система сохраняет точную копию подтверждённого текста, время и автора. Сам AI не может ничего опубликовать: у него нет такого действия.

Разные пары изолированы тем же механизмом: пространство shared:<пара> доступно только двум её участникам.

Журнал доступа. Публикации, отзывы, удаления и действия администратора пишутся в неизменяемый журнал — это понадобится при независимой проверке и разборе обращений пилотных пар.

Долговременная память

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

Эпизоды → элементы → извлечение. После завершённого эпизода (приватный диалог или обмен в V) фоновая задача просит модель найти значимые элементы и вернуть их в строгом формате. Не каждое сообщение становится памятью.

Что хранится у каждого элемента:

ПолеЗначения
Типдоговорённость, граница, цель, событие, повторяющаяся ситуация, конфликт, характерная реакция, способ разрешения
Эпистемический статусфакт (подтверждён людьми) · самоописание пользователя · гипотеза AI
Пространство и владелецPrivate A, Private B или Shared
Происхождениессылки на исходные сообщения и другие элементы, автор, время, версия промпта и модели
Разрешённое использованиедля помощи владельцу · для контекста пары
Статусактуально · отозвано · устарело · заменено новой версией · ожидает подтверждения
Историяссылка на предыдущую версию — изменение позиции не стирает прошлое, а дополняет его

Производные выводы хранят список источников и получают самые строгие из их прав: если среди источников есть Private A, вывод тоже Private A. При отзыве или удалении источника система находит все связанные выводы и помечает их как требующие пересмотра.

Подтверждение. Обычные элементы сохраняются автоматически с возможностью правки. Гипотезы AI о человеке и любые новые общие договорённости получают статус «ожидает подтверждения» и не используются как факт, пока человек их не подтвердит.

Извлечение контекста. Сначала фильтр по правам и статусу (только доступное и актуальное), затем ранжирование по смысловой близости (векторный поиск pgvector), свежести и важности, затем отбор под лимит контекста. Фильтр и поиск — один запрос к базе, поэтому «права важнее релевантности» соблюдается по построению.

Прозрачность. В прототипе — простые экраны «Что MindPair помнит обо мне» и «…о нас»: список элементов с типом, статусом, источником и действиями «исправить», «устарело», «не использовать», «отозвать». Проработанный интерфейс — в следующей версии.

Независимость от LLM

Модель — заменяемый компонент: всё, что ценно (история, память, права, происхождение), хранится в нашей базе в нейтральном формате. У провайдера не хранится ничего, что нужно для работы системы.

При смене модели может поменяться стиль и качество ответов — это не решается архитектурой. Поэтому предлагаю в прототипе сделать набор эталонных диалогов (20–30 сценариев), на которых новая модель проверяется перед включением.

Инфраструктура и масштабирование

Всё разворачивается на аккаунтах проекта с первого дня. Мы работаем через выданные доступы, а владельцем остаётся MindPair.

ЧтоПредлагаюПримерная стоимость на пилоте
ХостингОдин VPS (например, Hetzner, 4 vCPU / 8 ГБ) + Docker Compose~$15–30/мес
БазаPostgreSQL 17 + pgvector, ежедневные бэкапы во внешнее хранилищевходит в сервер; managed — ~$15–30/мес
Файлы и бэкапыS3-совместимое хранилище~$5/мес
Очередь и realtimeRedisвходит в сервер
LLMАккаунты провайдеров на проектезависит от активности; ориентир $50–200/мес на 10 пар
МониторингSentry (ошибки), uptime-проверки, логи, отчёт по расходам LLMбесплатные тарифы
Код и деплойРепозиторий проекта (GitHub/GitLab), CI: тесты и деплой по кнопкебесплатно

Окружений два: staging для приёмки и production для пилота. Секреты хранятся в переменных окружения сервера и CI проекта, в коде их нет. Данные шифруются при передаче (HTTPS), на диске и в бэкапах.

Масштабирование. Несколько сотен пар — небольшая нагрузка для такого стека. API и фоновые воркеры не хранят состояния, поэтому их можно запускать в нескольких экземплярах; realtime работает через Redis. Узким местом станет не сервер, а стоимость и лимиты LLM, поэтому учёт расходов закладывается сразу.

Переход к следующей версии потребует managed-базы с репликой, мобильных клиентов на том же API, push-уведомлений, полноценных экранов прозрачности памяти, оплаты, юридических документов и аудита безопасности. Ядро архитектуры при этом не меняется.

Что я бы предложил решить иначе

Большинство требований я считаю правильными и закладываю как есть. Ниже — пункты, где вижу пробел или более простой путь.

ТребованиеВ чём проблемаЧто предлагаю
Кризисные сообщения (в документе не описаны)В пилоте с реальными людьми будут сообщения о насилии, угрозах, мыслях о самоповреждении. Без протокола это главный продуктовый и юридический риск.Классификатор риска на каждом сообщении. При сигнале AI не формулирует сообщение партнёру, а показывает контакты помощи; событие видит ответственный за пилот. Текст протокола и контакты — от MindPair, техническая часть — от нас. Решить до старта пилота.
Удаление V, когда пару прекращает один участникВместе с V исчезают и сообщения второго, который этого не хотел.Удаление с отсрочкой 14 дней: доступ к V закрывается сразу, но каждый может скачать свои опубликованные сообщения. Затем данные удаляются безвозвратно, включая бэкапы по их ротации.
Полное удаление общей записи только по согласию обоихЕсли второй не отвечает, запрос зависает навсегда.Основной путь — отзыв с пометкой (сразу и без согласия). Запрос на удаление: если второй не ответил за 7 дней, запись скрывается у обоих и исключается из памяти.
Гипотезы AI о человекеДаже с пометкой «гипотеза» вывод вроде «склонен избегать конфликтов» воспринимается как ярлык.В прототипе гипотезы о человеке только в его Private Memory, всегда «ожидают подтверждения» и не используются, пока он их не подтвердит. В Shared — только подтверждённые договорённости и события.
Полная мультипровайдерностьДля прототипа избыточна.Два адаптера и запасная модель — этого достаточно, чтобы доказать заменяемость. Остальное по мере надобности.
Сквозное шифрованиеНеявно напрашивается из требований приватности, но несовместимо с тем, что AI читает сообщения.Шифрование при передаче и на диске, RLS, журнал доступа, у провайдеров LLM — режим без хранения данных (zero data retention), где доступно. Честно описать это в политике для участников пилота.
Персональные данныеЮрисдикция и правовые основания не определены, а от них зависит регион хостинга и выбор провайдеров LLM.Определить юрисдикцию до выбора хостинга. По умолчанию — хостинг в ЕС и провайдеры с DPA. Согласие участников пилота — отдельным документом.

Команда, этапы и сроки

Команда — два разработчика и DevOps. Срок — 2 недели разработки и неделя на приёмку.

РольЗадачиЗагрузка
AI-инженер, руководитель проекта (я)AI-слой и адаптеры, промпты приватного диалога, извлечение памяти, классификатор риска, эталонные диалоги, коммуникация с вамиполная
Full-stack-разработчикАрхитектура, база, слой прав и RLS, API, фоновые задачи, web-клиент, тесты изоляцииполная
DevOpsИнфраструктура на аккаунтах проекта, CI/CD, мониторинг, бэкапы, staging и productionчастичная

Интерфейс собираем на готовой библиотеке компонентов — для пилота этого достаточно. От MindPair нужен один человек, который отвечает на продуктовые вопросы в течение рабочего дня: при двухнедельном сроке это важно.

Этапы:

  1. Дни 1–2 — старт. Схема данных и прав, проверяемые критерии приёмки, решения по спорным пунктам, инфраструктура на аккаунтах проекта.

  2. Неделя 1 — ядро и приватный AI. Аккаунты, пара и приглашение, пространства A / B / V, слой прав и RLS, приватный диалог, черновик → подтверждение → Общее, ответ партнёра. Демо сценариев 1 и 2.

  3. Неделя 2 — память и готовность к пилоту. Извлечение памяти, происхождение и статусы, поиск с учётом прав, экраны «Что MindPair помнит», отзыв и удаление, завершение пары, второй LLM-адаптер, классификатор риска, эталонные диалоги, развёртывание production. Демо сценария 3.

  4. Неделя 3 — приёмка. Проверка по согласованным критериям и исправления.

Срок считается с момента, когда получены доступы к инфраструктуре и ответы по спорным пунктам. Задержка с ними сдвигает срок на столько же.

Основные риски

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

РискЧем опасенКак снижаем
Память извлекает лишнее или ошибаетсяAI опирается на неверный или устаревший контекстСтрогий формат вывода, подтверждение значимого, экраны правки, эталонные диалоги с ожидаемым результатом
Кризисные сообщенияВред участнику и юридическая ответственность проектаКлассификатор риска и протокол, согласованный до пилота (см. выше)
Утечка приватного контекстаПотеря доверия, которая для продукта критичнаПять уровней защиты, тесты изоляции как часть приёмки
AI формулирует не так, как нужно продуктуТеряется авторство, появляется «судья» вместо посредникаПромпты согласуем с вами на примерах; итерации по итогам демо. Качество советов как психолога — зона продуктовой экспертизы MindPair
Расходы на LLM выше ожиданийНепредсказуемый бюджет пилотаДешёвые модели для фоновых задач, учёт по парам, суточные лимиты
Провайдер LLM меняет условия или недоступенОстановка пилотаДва адаптера и запасная модель, все данные у нас
Расширение объёма по ходу работСдвиг сроков и бюджетаКритерии приёмки фиксируем в первые два дня; новое — отдельной оценкой
Юридические вопросы по персональным данным не решены к старту пилотаПилот нельзя запуститьВопрос юрисдикции решаем на старте, документы для участников готовит MindPair параллельно с разработкой

Бюджет и схема оплаты

Фиксированная цена первого этапа — $8 000 за объём, согласованный в первые два дня работ. Почасовой учёт не ведём: вы платите за результат, а не за время.

Схема оплаты:

ПлатёжКогдаСумма
Аванспри старте30% · $2 400
Демо сценариев 1 и 2конец 1-й недели30% · $2 400
Техническая приёмкапосле приёмки40% · $3 200

Расходы на инфраструктуру и LLM в бюджет не входят: они идут напрямую с аккаунтов проекта (ориентир — в разделе «Инфраструктура»).

Техническая приёмка

Приёмка идёт по списку проверяемых критериев, который мы согласуем в первые два дня. Независимый эксперт приветствуется: для него будут готовы доступы и документация.

Что проверяется:

  1. Три end-to-end сценария из вашего документа проходят на staging с тестовыми парами, с телефона.

  2. Изоляция: автотесты показывают, что ни один эндпоинт и ни один запрос к LLM не содержат чужих приватных данных или данных другой пары. RLS включён на всех таблицах с пользовательскими данными.

  3. Память: у каждого элемента есть происхождение и статус; производные выводы наследуют права; отзыв источника находит связанные выводы.

  4. Жизненный цикл данных: отзыв, удаление записи, прекращение пары работают по согласованным правилам.

  5. Смена LLM: переключение на второго провайдера правкой конфига, история и память сохраняются, эталонные диалоги прогоняются на обеих моделях.

  6. Нагрузка: синтетический тест на 300 пар без деградации (LLM заменяется заглушкой).

  7. Передача: весь код в репозитории проекта, тесты зелёные в CI, документация: архитектура, схема данных и прав, развёртывание, инструкция на случай сбоев.

На проверку после передачи — 5 рабочих дней. Найденные несоответствия критериям исправляем за свой счёт. После приёмки даём 30 дней гарантии на ошибки в сданном функционале.

Сопровождение пилота

Предлагаю ежемесячный пакет на 40 часов; стоимость обсудим отдельно. Восьминедельный пилот = два месяца пакета. На 10 пар этого обычно хватает с запасом.

Входит в пакетДополнительная разработка
СтабильностьМониторинг, бэкапы, обновления безопасности, исправление ошибок—
AIПравки промптов по итогам обратной связи, подстройка извлечения памяти, смена модели из уже подключённыхНовый провайдер, новые типы памяти
ПродуктМелкие правки текстов и интерфейсаНовые экраны, сценарии, интеграции
ДанныеПодключение пар, еженедельный отчёт: активность, ошибки, расходы на LLMАналитика сверх отчёта
РеакцияКритический сбой — в течение 4 часов в рабочее время, остальное — в течение рабочего дняКруглосуточное дежурство

Дополнительная разработка оценивается отдельно и оплачивается по согласованной заранее оценке. Неиспользованные часы пакета можно направить на неё.

Продление пилота — помесячно на тех же условиях, с предупреждением за неделю. Если число пар вырастет выше 30, пересмотрим объём пакета.

NDA, конфиденциальность и права

Договорный механизм готовы обсудить после выбора формата сотрудничества.