Шпаргалка щоб подивитись «що там у пам’яті насправді» без копання в коді. Всі запити виконуються через docker exec, нічого не треба ставити локально.
Контейнер БД:
ai-database(PostgreSQL 15 + pgvector) Юзер БД:ai_adminБаза:ai_gateway_db
Швидкі пресети
Боти — що взагалі є
|
1 2 3 4 5 6 7 8 |
docker exec ai-database psql -U ai_admin -d ai_gateway_db -c " SELECT id, name, \"aiProvider\", personality->>'name' as persona, personality->>'openrouter_model' as model, \"isActive\" FROM bots ORDER BY \"createdAt\"; " |
Корисно: побачити які боти існують, які моделі їм призначені, чи вони активні.
Знайти бота по імені персони
|
1 2 3 4 5 |
docker exec ai-database psql -U ai_admin -d ai_gateway_db -c " SELECT id, name, personality->>'name' as persona FROM bots WHERE personality->>'name' ILIKE '%солом%'; " |
Зміни солом на потрібне ім’я. Колонка name — це технічна назва (laravelbotX), а personality.name — людське ім’я персони.
Personal memory всіх ботів — статистика
|
1 2 3 4 5 6 7 8 9 |
docker exec ai-database psql -U ai_admin -d ai_gateway_db -c " SELECT b.name, b.personality->>'name' as persona, COUNT(pm.id) as memory_rows, MAX(pm.\"updatedAt\") as last_update FROM bots b LEFT JOIN personal_memories pm ON pm.\"botId\" = b.id GROUP BY b.id, b.name, b.personality->>'name' ORDER BY last_update DESC NULLS LAST; " |
Покаже: для кого пам’ять накопичується, коли останнє оновлення, хто без жодного факту.
Personal memory конкретного бота — повний вміст
|
1 2 3 4 5 6 7 8 9 10 11 12 |
BOT_ID="037c3531-1792-41f2-816f-dda4b2e418e2" docker exec ai-database psql -U ai_admin -d ai_gateway_db -c " SELECT \"userId\", facts, preferences, interests, \"conversationStyle\", \"updatedAt\" FROM personal_memories WHERE \"botId\" = '$BOT_ID' ORDER BY \"updatedAt\" DESC; " |
Підстав свій BOT_ID. Покаже всі факти що бот знає про кожного юзера.
Розмови бота — стан summary
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
BOT_ID="037c3531-1792-41f2-816f-dda4b2e418e2" docker exec ai-database psql -U ai_admin -d ai_gateway_db -c " SELECT c.id, c.\"channelType\", c.\"channelId\", c.\"updatedAt\", c.\"lastSummary\" IS NOT NULL as has_summary, c.\"lastSummaryMessageCount\" as summary_at_msg, (SELECT COUNT(*) FROM messages WHERE \"conversationId\" = c.id) as msg_count FROM conversations c WHERE c.\"botId\" = '$BOT_ID' ORDER BY c.\"updatedAt\" DESC LIMIT 20; " |
Покаже: де є summary, на якому повідомленні останнього разу згорталось, скільки повідомлень у розмові. Якщо msg_count > 10 а has_summary = f — щось не так зі згорткою.
Останні повідомлення розмови
|
1 2 3 4 5 6 7 8 9 |
CONV_ID="fd7cfc62-5235-476f-a363-45525f5de74b" docker exec ai-database psql -U ai_admin -d ai_gateway_db -c " SELECT role, \"tokenCount\", \"processingTime\", LEFT(content, 80) as preview, \"createdAt\" FROM messages WHERE \"conversationId\" = '$CONV_ID' ORDER BY \"createdAt\" DESC LIMIT 10; " |
Корисно щоб подивитись хто що сказав і коли, без повного дампу довгих повідомлень.
Knowledge chunks (RAG-база) бота
|
1 2 3 4 5 6 7 8 9 10 |
BOT_ID="037c3531-1792-41f2-816f-dda4b2e418e2" docker exec ai-database psql -U ai_admin -d ai_gateway_db -c " SELECT id, type, source, LEFT(content, 100) as preview, embedding IS NOT NULL as has_embedding, \"createdAt\" FROM knowledge_chunks WHERE \"botId\" = '$BOT_ID' ORDER BY \"createdAt\" DESC; " |
Покаже baseline-знання бота: персону, біографію, методики, FAQ. Якщо has_embedding = f — chunk без вектора, semantic search його не знайде.
Резюме (summary) розмови — повний текст
|
1 2 3 4 5 6 |
CONV_ID="fd7cfc62-5235-476f-a363-45525f5de74b" docker exec ai-database psql -U ai_admin -d ai_gateway_db -c " SELECT \"lastSummary\", \"lastSummaryMessageCount\", \"lastSummaryAt\" FROM conversations WHERE id = '$CONV_ID'; " |
Покаже як meta-модель стиснула історію розмови. Корисно щоб оцінити якість згортання.
Адміністративні
Видалити неправильну memory
Якщо STT почув щось не те і фейк потрапив у пам’ять:
|
1 2 3 4 5 |
docker exec ai-database psql -U ai_admin -d ai_gateway_db -c " DELETE FROM personal_memories WHERE \"botId\" = '037c3531-1792-41f2-816f-dda4b2e418e2' AND \"userId\" = 'desktop_alex'; " |
Обережно: немає
WHEREзі специфікою — видалить весь запис цього юзера у цього бота. Якщо там 10 правильних фактів і один фейковий — або підправляй JSON руками, або змирися (наступне оновлення meta-моделі перепише).
Скинути summary конкретної розмови (примусово згенерувати знову)
|
1 2 3 4 5 6 7 8 |
CONV_ID="fd7cfc62-5235-476f-a363-45525f5de74b" docker exec ai-database psql -U ai_admin -d ai_gateway_db -c " UPDATE conversations SET \"lastSummary\" = NULL, \"lastSummaryMessageCount\" = 0, \"lastSummaryAt\" = NULL WHERE id = '$CONV_ID'; " |
Наступне повідомлення в цій розмові згенерує summary заново.
Активні розмови за останню добу
|
1 2 3 4 5 6 7 8 9 10 |
docker exec ai-database psql -U ai_admin -d ai_gateway_db -c " SELECT b.personality->>'name' as bot, c.\"channelId\", (SELECT COUNT(*) FROM messages WHERE \"conversationId\" = c.id) as msgs, c.\"updatedAt\" FROM conversations c JOIN bots b ON b.id = c.\"botId\" WHERE c.\"updatedAt\" > NOW() - INTERVAL '24 hours' ORDER BY c.\"updatedAt\" DESC; " |
Корисно щоб побачити «що в нас сьогодні взагалі рухалось».
Розмір таблиць
|
1 2 3 4 5 6 7 8 9 |
docker exec ai-database psql -U ai_admin -d ai_gateway_db -c " SELECT schemaname, relname as table, n_live_tup as rows, pg_size_pretty(pg_total_relation_size(relid)) as size FROM pg_stat_user_tables ORDER BY n_live_tup DESC; " |
Покаже скільки рядків і скільки місця у кожній таблиці. Корисно коли проєкт росте — побачити чи embeddings займають все.
Інтерактивний режим (psql shell)
Якщо треба покопатись довше, не пишучи docker exec кожного разу:
|
1 |
docker exec -it ai-database psql -U ai_admin -d ai_gateway_db |
Корисні команди в psql:
\dt— список таблиць\d personal_memories— структура таблиці\x— увімкнути «expanded» режим (вертикальна форма, зручно для широких рядків)\q— вихід
Тригерні точки — на що звертати увагу
| Симптом | Перевірити |
|---|---|
| Бот «забуває» юзера | personal_memories — чи є запис, чи updatedAt свіжий |
| Розмова «з нуля» хоч ти писав | conversations — чи правильний channelId, чи знайшлась стара |
| Бот тупиш на 11-му повідомленні | lastSummary — чи згенерувалось, чи has_summary=t |
| Бот плутає тебе з іншим юзером | personal_memories.userId — Telegram дає laravel_user_X, desktop дає desktop_X, це різні юзери для бота |
| Knowledge не використовується | knowledge_chunks.has_embedding — якщо f, RAG його не знайде |
| Дублікати у memory | (Не має бути після UPSERT). Якщо є — баг, перевір UNIQUE(botId, userId) constraint |
Маленький лайфхак — alias
Кинь у ~/.bashrc:
|
1 2 |
alias aidb='docker exec -it ai-database psql -U ai_admin -d ai_gateway_db' alias aidbc='docker exec ai-database psql -U ai_admin -d ai_gateway_db -c' |
Тепер замість довгого docker exec ai-database psql -U ai_admin -d ai_gateway_db -c "..." пишеш:
|
1 2 |
aidbc "SELECT COUNT(*) FROM messages;" aidb # інтерактивний режим |
Економить багато сек.