Files
pegas-memory/README.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

6.8 KiB
Raw Blame History

Pegas Memory

Подсистема памяти и базы знаний агента Alicorn (рабочее имя «Pegas»).

  • PostgreSQL — единственный источник истины (текст, метаданные, трейсы, верификация).
  • Qdrant — векторный срез (EmbeddingGemma 2, dim=768).
  • Memgraph — графовый срез (связи атомов, зависимости кода).
  • Единица знания — типизированный атом: text | definition | logical_rule | code | table | fact.

Документация

  • AGENTS.md — инструкция для агента (English): какой инструмент для какого вопроса, цикл исследования, типичные ошибки.
  • ARCHITECTURE.md — архитектура: слои хранения, модель данных, потоки, MCP-инструменты.
  • EXAMPLES.md — примеры работы с базой знаний (English), включая анти-примеры.
  • ROADMAP.md — план развития.

Структура

pegas_memory/
  config.py        — конфиг (адреса сервисов, имена коллекций)
  db.py            — PostgreSQL (источник истины)
  embedding.py     — EmbeddingGemma 2 через Ollama (dim=768)
  qdrant_store.py  — векторный срез
  memgraph_store.py— графовый срез
  distill.py       — дистилляция чанка в атомы (LLM)
  ingest.py        — парсеры text/pdf/epub/web
  outbox_sync.py   — PG → Qdrant + Memgraph
  research.py      — цикл исследования пробелов
  code_symbols.py  — tree-sitter извлечение символов
  code_graph.py    — граф зависимостей кода (calls/imports/inherits)
  inference.py     — логическая инференция (forward-chaining в Memgraph)
  dedup.py         — семантическая дедупликация атомов (эмбеддинги, порог 0.90)
  verify.py        — верификация: self-critique (LLM) + кросс-подтверждение
schema.sql         — DDL PostgreSQL

Подключение к DeepSeek Harness (dsh)

Память подключается как MCP-сервер (паттерн dsh, как Gitea/Outline/Playwright):

  • Сервер: mcp_server.py — чистый stdlib, JSON-RPC 2.0, stdio.
  • Инструменты (видны модели как mcp__pegas-memory__*): memory_search, memory_store, memory_ingest, memory_stats, memory_get_context, memory_verify, memory_store_code, memory_search_code, memory_code_graph, memory_infer, memory_query_graph, memory_add_gap, memory_list_gaps, memory_get_gap, memory_update_gap, memory_delete_gap, memory_commit, memory_stale.
  • Регистрация: в ~/.dsh/profiles/web/cordis.patch.yml через @deepseek-ai/dsh-mcp-client.
  • Live-reload: профиль web имеет patchReload: live — изменения конфига подхватываются без рестарта (проверено: сервер спавнится автоматически).
- id: mcp-pegas-memory
  name: '@deepseek-ai/dsh-mcp-client'
  config:
    serverName: pegas-memory
    transport: stdio
    command: /home/neo/workspace/pegas-memory/.venv/bin/python
    args:
      - /home/neo/workspace/pegas-memory/mcp_server.py
    toolCallTimeoutMs: 180000

Доступность зарубежных сайтов и прокси

Прямое подключение работает для большинства сайтов (github, wikipedia, postgresql.org), но часть блокирует по российскому IP (memgraph.com — ConnectTimeout) или ставит Cloudflare anti-bot (neo4j.com — 403). Поведение research-цикла:

  1. Полная загрузка URL (httpx, таймаут 30s).
  2. При блокировке — fallback на сниппет из веб-поиска.

Для заблокированных сайтов можно включить SOCKS5/HTTP-прокси:

export PROXY_URL="socks5://127.0.0.1:1080"   # hysteria2

Когда прокси задан, parse_web ходит через него; иначе — напрямую. Поддержка SOCKS5 уже установлена (httpx[socks]).

Управление пробелами (gaps)

Пробел — вопрос, на который в базе пока нет ответа. Полный жизненный цикл:

Операция Инструмент
Создать memory_add_gap(question, reason, priority)
Список (с фильтром) memory_list_gaps(status?, limit?)
Прочитать один memory_get_gap(gap_id)
Редактировать memory_update_gap(gap_id, question?/reason?/priority?/status?)
Удалить memory_delete_gap(gap_id)

Статусы: open → researching → resolved | dismissed. Причины: low_coverage, low_confidence, stale, contested, user_query.

Работает целиком на PostgreSQL — без веб-поиска. Поиск выполняет модель встроенным web_search.

Самообучение (self-improvement)

Два инструмента закрывают петлю commit/maintain (см. ROADMAP.md):

Операция Инструмент
Записать верифицированный answer закрытого пробела в атомы memory_commit(gap_ids, dedup?)
Пометить устаревшие атомы в stale memory_stale(atom_id?/all?, limit?, sample?, min_confidence?, age_only?, max_age_days?)
  • memory_commit — для каждого gap_id ищет верифицированные атомы-ответы, дистиллирует канонический атом (обязательный dedup) и закрывает пробел. Если верифицированного ответа нет — пробел не трогает (skipped_empty).
  • memory_stale — два сигнала: content-staleness (рефетч источника + LLM-вердикт, для зарубежных сайтов нужен PROXY_URL) и age-staleness (proxy-free, по fetched_at, порог max_age_days, default 90). Лимит LLM-вызовов — limit + sample.

Источники: web/text/epub/pdf. Проверено: рефетч memgraph.com без прокси → ConnectTimeout.