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, ключ ідемпотентності - source —
profile|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 - direction —
incoming|outgoing|null(для conversation chunks) - compose_mode —
reply|both, для фільтрації при retrieval - tags —
string[], наївна regex-категоризація:sexual/trust/emotional+ source - client_id, woman_id, favorite_id — IDs сторін діалогу:
client_id= RU,woman_id= TU,favorite_id= favorite/dialog/cache fallback - language —
nullзараз, не використовується - note_date, sent_at — для нотаток і повідомлень
- metadata — JSON
{ originalChunkId, scoreAtIngestion }
Нюанси
embeddingзараз — це Gemini semantic embedding 768 dimensions (gemini-embedding-001). RPCmatch_client_memory_chunksчерез pgvector cosine similarity вже працює як semantic retrieval, не lexical key-overlap.source = 'photo'доданий окремою міграцією. Уmatch_client_memory_chunksвін має невеликий boost0.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.
Зв’язки
- Записує і читає memory-service.
- Зберігається у supabase.