Files
pegas-memory/ROADMAP.md
T
n1kt4r eca8a11e23 feat(pegas-memory): Tier-1 self-improvement tools (commit + staleness)
- memory_commit: closes the 'commit hole' — writes verified answers from
  closed gaps back into atoms (mandatory dedup); leaves gap open if no
  verified answer exists. Reads verified status from PostgreSQL (source of
  truth), not the Qdrant projection.
- memory_stale: staleness guard with two signals — content-staleness
  (re-fetch + LLM verdict, needs proxy for foreign sites) and age-staleness
  (proxy-free fallback by pm_document.fetched_at, max_age_days).
- db: populate pm_document.fetched_at on upsert (freshness signal).
- docs: README/AGENTS/ARCHITECTURE/EXAMPLES updated (18 tools).
- self_improve.py: new module (227 lines).
2026-10-15 22:06:30 +05:00

165 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Pegas Memory — Roadmap
Подсистема памяти и базы знаний агента Alicorn («Pegas»). Реализация на Python как отдельный
сервис, который Rust-ядро Alicorn вызывает через MCP/HTTP. Спецификация — в
`alicorn-agent/ARCHITECTURE.md` (ADR-4, ADR-11, ADR-12).
## Принятые решения (по итогам обсуждения)
1. **PostgreSQL = единственный источник истины.** Текст, метаданные, трейсы, верификация, outbox.
2. **Qdrant = векторный срез** (EmbeddingGemma 2, dim=768). Замена pgvector.
3. **Memgraph = графовый срез** (связи атомов, зависимости кода). Замена Apache AGE.
4. **pgvector и AGE — НЕ используем.** Векторы только в Qdrant, граф только в Memgraph.
5. **Единица знания — типизированный «атом»**, не чанк сырого текста.
Типы: `text | definition | logical_rule | code | table | fact`.
6. **Память агента (episodic) ≠ база знаний (curated).** Разные таблицы/субсистемы.
7. **Код хранится отдельно**: content-addressed исходники + tree-sitter символы + граф зависимостей.
8. **Логические знания** — структурные правила (pattern→conclusion) с инференцией в графе.
9. **Исследование пробелов** — замкнутый цикл: detect→plan→acquire→parse→extract→value→verify→commit.
## Инфраструктура (проверено на сервере)
| Компонент | Адрес | Состояние |
|---|---|---|
| PostgreSQL 16 | atom-db :5434 (user atom, db content_atom) | работает |
| Qdrant | :6333 | работает |
| Memgraph (bolt) | :7687 | работает |
| Ollama | :11434 | работает |
| EmbeddingGemma 2 | `embeddinggemma-2-740m-Q8_0` | dim=768, R@1 0.922 (лучшая на ru) |
| LLM-генерация | `lfm25-24b-a2b:128k`, `qwen3.5:4b`, `gemma4:E4B` | работает |
> EmbeddingGemma 2: полная размерность 768 (проверено curl-тестом). Q8_0 — оптимальный
> баланс качество/память (MRR 0.944, не теряет качество). Не путать с v1 `embeddinggemma:300m`.
## Модель данных (PostgreSQL — канон)
```
document — источники (web|pdf|epub|text|code_repo), uri, authority, content_hash
chunk — сырые сегменты (доказательства, locator) — НЕ для retrieval напрямую
atom — типизированные единицы знания (claim + content + confidence + status)
atom_link — связи (inference|cause|reference|contradicts|depends_on|calls|defines)
citation — доказательная база (atom → document → locator → quoted_text)
code_symbol — tree-sitter символы (repo, path, language, name, kind, signature)
episodic_trace— память агента (шаги/действия) — отдельно от базы знаний
research_gap — выявленные пробелы для исследования
outbox — CDC-журнал для синка в Qdrant + Memgraph
```
Статусы атома: `candidate → verified | stale | contested`.
Векторы НЕ хранятся в Postgres — только в Qdrant (payload: type/confidence/status/doc_id).
## Фазы
### Фаза 1 — Фундамент (MVP) ✅ ЗАВЕРШЕНА
- [x] Структура проекта + venv + зависимости
- [x] DDL Postgres (schema.sql)
- [x] Клиент эмбеддингов EmbeddingGemma 2 (dim=768)
- [x] Клиент Qdrant (коллекция `alicorn_atoms`)
- [x] Клиент Memgraph (узлы atom + рёбра atom_link)
- [x] Ингест: text/pdf/epub/web → чанки
- [x] Дистилляция чанка → атомы (LLM)
- [x] Outbox-синк PG → Qdrant + Memgraph
- [x] Smoke-тест end-to-end
### Фаза 2 — Исследование пробелов ✅ (реализовано, snippet-fallback)
- [x] Детект пробелов (research_gap + add_gap/list_gaps)
- [x] Планирование (приоритизированная очередь пробелов)
- [x] Acquire: web-поиск (3 источника) + pdf/epub/text
- [x] Оценка ценности (verify_atom + min_confidence)
- [~] Верификация (verify_atom готов; полный автономный прогон требует прокси для зарубежных сайтов)
### Фаза 3 — Код ✅ / Логика ✅
- [x] tree-sitter: извлечение символов (function/class/method/type) — 43 символа сохранено
- [x] Граф зависимостей кода (calls/imports/inherits) — 310 зависимостей, 162 узла CodeSymbol
- [x] Логические правила + инференция в Memgraph (forward-chaining до fixpoint, 38 рёбер выведено)
### Фаза 4 — Интеграция с DSH (MCP) ✅ ВЫПОЛНЕНА
- [x] MCP-сервер (memory_search/store/ingest/add_gap/list_gaps/research/stats/get_context)
- [x] Подключение к DSH через @deepseek-ai/dsh-mcp-client (cordis.patch.yml, live-reload)
- [ ] Подключение к Rust-ядру Alicorn (Planner/Researcher) — когда ядро будет готово
## Дополнительно реализовано
- Опциональный прокси (PROXY_URL, SOCKS5/HTTP) + улучшенный User-Agent для полной загрузки страниц.
- Фильтрация артефактов графа кода (dst="." от относительных импортов).
- Дедупликация в memory_store (опциональный dedup).
(после MVP)
- Семантическая дедупликация атомов (эмбеддинги EmbeddingGemma 2, порог 0.90, конфигурируемо).
- Фильтрация шумных logical_rule (только kind-рёбра) в инференции.
## Критические риски
- EmbeddingGemma 2 dim=768 — не совместима с bge-m3 (1024) → отдельная коллекция, без миграции.
- Memgraph in-memory: объём графа ограничен RAM.
- Дистилляция зависит от качества локальной LLM — нужна верификация.
## Самообучение (self-improvement) — статус и планы
### Что работает (4 механизма, но НЕ замкнутый loop)
1. **Верификация** (`verify_atom`/`memory_verify` + `verify.py`). LLM self-critique
(`duplicate | corroborates | contradicts`) + **межисточная конфирмация** (≥1 другой
`doc_id`, cosine ≥ 0.90) → ставка растёт, статус `verified`. Самое зрелое звено.
2. **Логическая инференция** (`memory_infer` + `inference.py`). Применение правил к рёбрам
графа до fixpoint (`imports → depends_on` и т.д.). ⚠️ Даст **только связи**, не новые факты.
Правила **статичные/вручную написанные**, новых не выводит сама.
3. **Синтез контекста** (`memory_get_context`). Ищет Qdrant, кластеризует + суммирует атомы.
Может **создавать gap** из исходного текста → есть *реактивное* появление вопроса из источника.
4. **Эпизодические следы** (`pm_episodic_trace`). План/действие/наблюдение/рефлексия —
отдельно от БЗ. Самый «рефлексивный», но **условный**, не привязанный к gap.
### Что не хватает (дыры в петлях, а не в примитивах)
| Пробел | Почему критично |
|---|---|
| **① Цепочка gap↛answer («дыра commit»)** | При закрытии gap **ответ не автоматически
пишется обратно в атомы** → знания улетучиваются, приходится пере-исследовать. |
| **② Самообучение схемы инференции** | Ничего не *предлагает новые правила* из повторяющихся
`verified`-атомов. Это как раз слабое место Hermes-аналога. |
| **③ Сталкнутость/забвение (staleness guard)** | `verify` ставит `verified`, но **ничто не
помечает `stale`** пере-проверкой по свежему источнику. Путь →`stale` не идёт автоматически. |
| **④ Поверхность противоречий** | `verify` ловит конфликт только в окрестности атома. Ничего
не сканирует весь граф → противоречия не переходят в gap автоматически. |
| **⑤ Процедурная/рецепт-память** | Повторяющиеся успешные воркфлоу не ловятся как переиспользуемые атомы. |
| **⑥ Пассивное создание gap** | Gap создаются через `add_gap` (вручную) или из `memory_get_context`.
Нет авто-обнаружения из не-верифицированного/переносного контента. |
### Приоритет
Hermes-анализ показал: Pegas сильна в **«detect»** (verify, infer), слаба в **«commit»** и
**«maintain»**. Слабые места — **feedback-петли**, а не примитивы. Поэтому максимальный выигрыш:
① дыра «commit» × ③ гвард сталкнутости × ② самообучение правил инференции — это **закрывает loop**.
### Планируемые улучшения (Tier)
- **Tier 1 — высокий приоритет, безопасно / small**
- ① **Закрыть дыру** — после `verify`, подняв атомы из gap, запустить синтез обратно в
`memory_ingest/synthesis` (письмо верифицированного ответа в атомы).
- ③ **Гвард сталкнутости** — `update_status`: пере-`web_search` по URL/date атома;
противоречит/устарел → `stale`. Внедряет путь →`stale`, который сейчас не ходит.
- **Tier 2 — средний приоритет**
- ② **Самообучение правил инференции** — `memory_infer` **предлагает кандидаты**
`logical_rule` на ревью (никогда не применяет автоматически).
- ⑤ **Атомные паттерны действий** — агент действует (это я через `mcp__pegas-memory__*`),
поэтому повторы успешных `/запрос` или воркфлоу ≥N раз с `verified`-результатом →
**атомный** паттерн-рецепт (не файлы Hermes, а атомно с dedup).
- **Tier 3 — структурные**
- ④ **Скунт-скан** — периодический бэч-проход графа на противоречия → авто gap.
- ⑥ **Авто-обнаружение gap** — `verify` открывает gap на конфликт/дыру в источнике.
### Atom-efficiency guardrail (обязательное)
Чтобы self-improvement **не скатился в гермесовский файловый балласт**, все записи и
обновления подчинены лимитам эффективности атомной памяти (преимущество Peras над Hermes):
- **Dedup обязателен** при записи (`memory_store`/synthesis): cosine ≥ 0.90, без дублей.
- **Лимит web/пере-записей** (staleness-③): batchами + сэмплом, не per-atom без порога.
- **Bound на рост графа/атомов**: Memgraph in-memory → RAM-лимит, авто-`stale`/архив старых.
- **Атомно, а не файльно**: паттерны-рецепты хранятся как типизированные атомы, не как
накопитель markdown-файлов (как у Hermes) → no prompt-bloat.
### Как проверять
- recall@k на реальных запросах против существующей `knowledge_base` (bge-m3 384-dim).
- Latency эмбеддинга + потребление GPU параллельно с LLM (a2000 12 GB).
- **Самоеобучение**: доля авто-закрытых gap «commit»-петлёй, доля атомов, ушедших в `stale`
за квартал, доля предложенных → принято правил инференции (ревью-соотношение).