memory-chunk

Memory Chunk

src/modules/tips-memory/types.ts · таблиця client_memory_chunks у supabase

Що це

Атомарна одиниця контексту у векторній базі. Створюється при ingest з різних джерел (профіль / нотатка / повідомлення / фото) і використовується для retrieval під час генерації відповіді.

Поля (як зараз пише код)

  • dialog_key — sha256 ключ пари RU>TU. У generic memory fallback будується від legacy назв womanId і clientId, де womanId = TU, clientId = RU
  • content_hash — sha256 від dialog_key:source:source_id:text, ключ ідемпотентності
  • sourceprofile | photo | note | conversation | summary
  • source_id — внутрішній ID у джерелі (note id / message id / profile:N)
  • text — нормалізований текст (notes ≤800 chars, messages ≤420 chars)
  • embedding — векторне представлення тексту, формат pgvector
  • embedding_model — мітка моделі, зараз gemini-embedding-001:768
  • directionincoming | outgoing | null (для conversation chunks)
  • compose_modereply | both, для фільтрації при retrieval
  • tagsstring[], наївна regex-категоризація: sexual / trust / emotional + source
  • client_id, woman_id, favorite_id — IDs сторін діалогу: client_id = RU, woman_id = TU, favorite_id = favorite/dialog/cache fallback
  • languagenull зараз, не використовується
  • note_date, sent_at — для нотаток і повідомлень
  • metadata — JSON { originalChunkId, scoreAtIngestion }

Нюанси

  • embedding зараз — це Gemini semantic embedding 768 dimensions (gemini-embedding-001). RPC match_client_memory_chunks через pgvector cosine similarity вже працює як semantic retrieval, не lexical key-overlap.
  • source = 'photo' доданий окремою міграцією. У match_client_memory_chunks він має невеликий boost 0.05, щоб фото могло потрапити в context, але не перебивало нотатки.
  • TODO: зараз photo layer неповний. Потрібно записувати не тільки URL фото, а текстовий vision-аналіз у source='photo'. Деталі: photo-analysis і photo-analysis-ingest.
  • На ingest беруться останні 80 повідомлень діалогу. Старіша історія не пишеться у пам’ять.
  • Письма не мають записуватися окремим source. Для поточної tips-логіки вони проходять разом із повідомленнями як conversation.
  • Upsert по (dialog_key, content_hash) — однакові chunks безпечно перезаписувати.

TODO

  • Прибрати legacy lexical-hash fallback у payload-utils або явно задокументувати коли він використовується.
  • Передивитися верхню межу 80 повідомлень — для довгих діалогів губимо контекст.
  • Додати повноцінний photo analysis chunk: URL/content hash, vision summary, safe hooks, metadata.

Зв’язки