MindPair: предложение по первому этапу
Сопроводительное письмо
Сергей, добрый день.
Спасибо за подробный документ — он сильно отличается от того, что мы обсуждали изначально, и это хорошо: теперь понятно, что ядро продукта — не обработка сообщений, а приватные пространства, согласие на передачу и долговременная память с правами доступа.
Ниже — моё видение первого этапа: архитектура, разделение A / B / V, устройство памяти, независимость от LLM, команда, сроки, риски, бюджет и сопровождение пилота. Отдельным разделом — требования, которые я бы предложил решить иначе.
Коротко о главном:
Срок первого этапа — 2 недели разработки и неделя на приёмку.
В документе не описан протокол действий при кризисных сообщениях. Для пилота на реальных людях это нужно решить до старта.
Буду рад обсудить детали на созвоне.
Владислав
Как я понял задачу
Первый этап — рабочий прототип для пилота на 10+ парах, который проверяет три вещи: изоляцию приватных пространств, передачу в общее пространство только по явному согласию и долговременную память, которая уважает права доступа.
Изначально мы обсуждали общий чат пары, где AI обрабатывает сообщения, и простые заметки. Уточнённая задача шире:
| Изначально | Теперь | |
|---|---|---|
| Главная механика | AI обрабатывает каждое сообщение в общем чате | У каждого свой диалог с AI (Private A / B); в общее пространство V попадает только подтверждённое |
| Память | Заметки: планы, даты, договорённости | Три области памяти, происхождение, статусы, «факт / самоописание / гипотеза», изменения во времени |
| Права | Общая или личная заметка | Производные выводы наследуют права источника; права важнее релевантности |
| Жизненный цикл данных | История хранится | Отзыв, удаление по согласию, удаление V при прекращении пары |
| LLM | Одна модель | Заменяемый компонент, память не зависит от провайдера |
| Инфраструктура | Не обсуждалась | Всё на аккаунтах проекта, прозрачные расходы на LLM |
У меня уже есть заготовка базовой части: аккаунты, приглашения и жизненный цикл пары, realtime, простой web-клиент, автотесты. Это сокращает срок; приватные AI-диалоги, согласие и память проектируются заново под ваши требования.
Архитектура
Один backend-сервис с чёткими модулями внутри, PostgreSQL как единственное хранилище истории, памяти и прав, web-клиент под смартфон. Модель подключается через AI-слой и меняется без потери данных.
Любой запрос — от клиента или фоновой задачи — читает данные только через слой прав; в модель уходит только то, что отобрал сборщик контекста.
| Компонент | Выбор | Почему |
|---|---|---|
| Backend | Python, FastAPI, SQLAlchemy | Лучшая экосистема для работы с LLM; асинхронность под realtime и долгие вызовы моделей |
| Frontend | Vue 3 + TypeScript, адаптивный web с установкой на главный экран (PWA) | Быстро для пилота; мобильное приложение потом использует тот же API |
| База и память | PostgreSQL + pgvector + Row-Level Security | Права, связи происхождения и векторный поиск — в одной базе и одном запросе |
| Фоновые задачи | Очередь на Redis | Извлечение памяти не задерживает ответ пользователю |
| AI-слой | Собственный тонкий интерфейс + адаптеры провайдеров | Полный контроль над тем, что уходит в модель; нет привязки к фреймворку |
Какие альтернативы рассматривал и почему нет:
Микросервисы — избыточны для сотен пар, дороже в разработке и поддержке. Модули внутри одного сервиса можно выделить позже.
Отдельная векторная база (Pinecone, Qdrant) — фильтр по правам пришлось бы дублировать вне основной базы, а это и есть место для утечки.
Готовые системы памяти (Mem0, Zep) и LangChain — хранят память в своём формате и плохо подчиняются вашей модели прав и происхождения.
Графовая база для связей памяти — связи происхождения хорошо ложатся в таблицы; граф нужен, если анализ связей станет частью продукта.
Ограничения подхода:
На пилоте один сервер — единая точка отказа; защита — ежедневные бэкапы и отработанное восстановление.
RLS усложняет миграции и отладку — это цена второго рубежа защиты.
pgvector при десятках миллионов элементов потребует настройки или отдельного хранилища — это далеко за пределами пилота и следующей версии.
Разделение Private A / Private B / V
Изоляция обеспечивается архитектурой, а не инструкциями для AI: данные Private A физически не могут попасть в запрос к LLM, который собирается для B.
Пять уровней защиты:
Пространство у каждой записи. У любой записи (сообщение, черновик, элемент памяти) есть владелец и пространство:
private:<user>илиshared:<пара>. Записи без пространства база не примет.Единый слой прав. Любое чтение идёт через один модуль прав доступа: он добавляет фильтр «только моё приватное или общее моей пары» до того, как запрос дойдёт до базы.
Row-Level Security в PostgreSQL. Второй рубеж на уровне базы: даже ошибка в коде приложения не вернёт чужие строки.
Сборщик контекста для LLM. Контекст для запроса к модели собирается только из того, что доступно текущему пользователю в текущем пространстве. У модели нет инструмента «прочитать чужое» — ей нечего утечь.
Автотесты изоляции. Отдельный набор тестов проверяет: ни один эндпоинт не отдаёт 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
Модель — заменяемый компонент: всё, что ценно (история, память, права, происхождение), хранится в нашей базе в нейтральном формате. У провайдера не хранится ничего, что нужно для работы системы.
AI-слой с единым интерфейсом: диалог, структурированный ответ (извлечение памяти, классификация риска), эмбеддинги. Под ним — адаптеры провайдеров. В прототипе — два адаптера (например, Anthropic и OpenAI-совместимый, через который подключаются и open-source модели), чтобы смена модели была проверена на практике, а не только на бумаге.
Маршрутизация по задачам в конфигурации: диалог — одна модель, извлечение памяти — другая, дешевле; запасная модель на случай отказа основной. Смена — правка конфига, без изменения кода.
Промпты в репозитории с версиями. Версия промпта и модели записывается в происхождение каждого элемента памяти — видно, какая модель сделала какой вывод.
Эмбеддинги пересчитываемы. У каждого вектора хранится модель, которая его построила; при смене модели фоновая задача перестраивает индекс из исходных текстов, без потери данных.
Учёт расходов. Каждый вызов модели пишется в журнал: пара, задача, модель, токены, стоимость, задержка, ошибки. Простой админ-отчёт показывает расходы по дням и парам, есть лимиты на пару в сутки.
При смене модели может поменяться стиль и качество ответов — это не решается архитектурой. Поэтому предлагаю в прототипе сделать набор эталонных диалогов (20–30 сценариев), на которых новая модель проверяется перед включением.
Инфраструктура и масштабирование
Всё разворачивается на аккаунтах проекта с первого дня. Мы работаем через выданные доступы, а владельцем остаётся MindPair.
| Что | Предлагаю | Примерная стоимость на пилоте |
|---|---|---|
| Хостинг | Один VPS (например, Hetzner, 4 vCPU / 8 ГБ) + Docker Compose | ~$15–30/мес |
| База | PostgreSQL 17 + pgvector, ежедневные бэкапы во внешнее хранилище | входит в сервер; managed — ~$15–30/мес |
| Файлы и бэкапы | S3-совместимое хранилище | ~$5/мес |
| Очередь и realtime | Redis | входит в сервер |
| 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–2 — старт. Схема данных и прав, проверяемые критерии приёмки, решения по спорным пунктам, инфраструктура на аккаунтах проекта.
Неделя 1 — ядро и приватный AI. Аккаунты, пара и приглашение, пространства A / B / V, слой прав и RLS, приватный диалог, черновик → подтверждение → Общее, ответ партнёра. Демо сценариев 1 и 2.
Неделя 2 — память и готовность к пилоту. Извлечение памяти, происхождение и статусы, поиск с учётом прав, экраны «Что MindPair помнит», отзыв и удаление, завершение пары, второй LLM-адаптер, классификатор риска, эталонные диалоги, развёртывание production. Демо сценария 3.
Неделя 3 — приёмка. Проверка по согласованным критериям и исправления.
Срок считается с момента, когда получены доступы к инфраструктуре и ответы по спорным пунктам. Задержка с ними сдвигает срок на столько же.
Основные риски
Самый серьёзный технический риск — качество извлечения памяти, самый серьёзный продуктовый — кризисные сообщения в пилоте.
| Риск | Чем опасен | Как снижаем |
|---|---|---|
| Память извлекает лишнее или ошибается | AI опирается на неверный или устаревший контекст | Строгий формат вывода, подтверждение значимого, экраны правки, эталонные диалоги с ожидаемым результатом |
| Кризисные сообщения | Вред участнику и юридическая ответственность проекта | Классификатор риска и протокол, согласованный до пилота (см. выше) |
| Утечка приватного контекста | Потеря доверия, которая для продукта критична | Пять уровней защиты, тесты изоляции как часть приёмки |
| AI формулирует не так, как нужно продукту | Теряется авторство, появляется «судья» вместо посредника | Промпты согласуем с вами на примерах; итерации по итогам демо. Качество советов как психолога — зона продуктовой экспертизы MindPair |
| Расходы на LLM выше ожиданий | Непредсказуемый бюджет пилота | Дешёвые модели для фоновых задач, учёт по парам, суточные лимиты |
| Провайдер LLM меняет условия или недоступен | Остановка пилота | Два адаптера и запасная модель, все данные у нас |
| Расширение объёма по ходу работ | Сдвиг сроков и бюджета | Критерии приёмки фиксируем в первые два дня; новое — отдельной оценкой |
| Юридические вопросы по персональным данным не решены к старту пилота | Пилот нельзя запустить | Вопрос юрисдикции решаем на старте, документы для участников готовит MindPair параллельно с разработкой |
Бюджет и схема оплаты
Фиксированная цена первого этапа — $8 000 за объём, согласованный в первые два дня работ. Почасовой учёт не ведём: вы платите за результат, а не за время.
Схема оплаты:
| Платёж | Когда | Сумма |
|---|---|---|
| Аванс | при старте | 30% · $2 400 |
| Демо сценариев 1 и 2 | конец 1-й недели | 30% · $2 400 |
| Техническая приёмка | после приёмки | 40% · $3 200 |
Расходы на инфраструктуру и LLM в бюджет не входят: они идут напрямую с аккаунтов проекта (ориентир — в разделе «Инфраструктура»).
Техническая приёмка
Приёмка идёт по списку проверяемых критериев, который мы согласуем в первые два дня. Независимый эксперт приветствуется: для него будут готовы доступы и документация.
Что проверяется:
Три end-to-end сценария из вашего документа проходят на staging с тестовыми парами, с телефона.
Изоляция: автотесты показывают, что ни один эндпоинт и ни один запрос к LLM не содержат чужих приватных данных или данных другой пары. RLS включён на всех таблицах с пользовательскими данными.
Память: у каждого элемента есть происхождение и статус; производные выводы наследуют права; отзыв источника находит связанные выводы.
Жизненный цикл данных: отзыв, удаление записи, прекращение пары работают по согласованным правилам.
Смена LLM: переключение на второго провайдера правкой конфига, история и память сохраняются, эталонные диалоги прогоняются на обеих моделях.
Нагрузка: синтетический тест на 300 пар без деградации (LLM заменяется заглушкой).
Передача: весь код в репозитории проекта, тесты зелёные в CI, документация: архитектура, схема данных и прав, развёртывание, инструкция на случай сбоев.
На проверку после передачи — 5 рабочих дней. Найденные несоответствия критериям исправляем за свой счёт. После приёмки даём 30 дней гарантии на ошибки в сданном функционале.
Сопровождение пилота
Предлагаю ежемесячный пакет на 40 часов; стоимость обсудим отдельно. Восьминедельный пилот = два месяца пакета. На 10 пар этого обычно хватает с запасом.
| Входит в пакет | Дополнительная разработка | |
|---|---|---|
| Стабильность | Мониторинг, бэкапы, обновления безопасности, исправление ошибок | — |
| AI | Правки промптов по итогам обратной связи, подстройка извлечения памяти, смена модели из уже подключённых | Новый провайдер, новые типы памяти |
| Продукт | Мелкие правки текстов и интерфейса | Новые экраны, сценарии, интеграции |
| Данные | Подключение пар, еженедельный отчёт: активность, ошибки, расходы на LLM | Аналитика сверх отчёта |
| Реакция | Критический сбой — в течение 4 часов в рабочее время, остальное — в течение рабочего дня | Круглосуточное дежурство |
Дополнительная разработка оценивается отдельно и оплачивается по согласованной заранее оценке. Неиспользованные часы пакета можно направить на неё.
Продление пилота — помесячно на тех же условиях, с предупреждением за неделю. Если число пар вырастет выше 30, пересмотрим объём пакета.
NDA, конфиденциальность и права
NDA готовы подписать до старта работ, на вашей форме или на нашей. Оно распространяется на всех участников команды.
Данные участников пилота. Доступ к production — только у одного человека из команды. Переписку пар мы не читаем; отладка идёт на тестовых данных, а каждый доступ к реальным данным пишется в журнал. После окончания работ доступы отзываются.
Права на результат. Исключительные имущественные права на всё, что создано в проекте (код, промпты, схемы данных, документация), переходят к MindPair после оплаты соответствующего этапа. Код с первого дня лежит в вашем репозитории.
Готовая базовая часть (аккаунты, приглашения, realtime, тестовая инфраструктура) входит в проект на тех же условиях и без отдельной оплаты.
Open-source библиотеки остаются под своими лицензиями. Используем только разрешающие коммерческое применение (MIT, Apache, BSD), список — в документации.
Договорный механизм готовы обсудить после выбора формата сотрудничества.