ADR

ADR-007: Radar Local Knowledge Layer

ADR-007: Radar Local Knowledge Layer

Дата: 2026-06-17 Статус: draft (Foundation — не implementation)


Контекст

Radar — exploration-контур SprosOS. Его задача: собирать сигналы спроса, извлекать JTBD, формировать opportunity cards и питать базу гипотез. Для этого нужна инфраструктура хранения, которая:

  • Держит большие объёмы сырых данных (отзывы, страницы, выгрузки, serp snapshots)
  • Позволяет делать embedding и semantic search
  • Не сжигает бюджет на облачное хранение гигабайтов мусора

Решение: локальный knowledge layer как data refinery + cloud как control plane.


Архитектура

┌──────────────────────────────────────────────────────────────────┐
│                      Локальный ПК (Radar Node)                    │
│                                                                  │
│  ┌──────────────┐  ┌──────────────┐  ┌────────────────────────┐ │
│  │ Raw Storage  │  │  Normalized  │  │  Semantic / Vector     │ │
│  │ (MinIO/fs)   │  │  (Postgres)  │  │  (Qdrant)             │ │
│  │              │  │              │  │                        │ │
│  │ HTML, JSONL  │  │ Evidence     │  │ Embeddings             │ │
│  │ CSV, snap    │  │ Signal       │  │ Chunks                 │ │
│  │ dumps        │  │ JTBDCandidate│  │ Summaries              │ │
│  └──────────────┘  └──────────────┘  └────────────────────────┘ │
│                          ▲                                       │
│  ┌───────────────────────┴──────────────────────────────────────┐│
│  │                    n8n Orchestrator                          ││
│  │  Connectors → Evidence Pipeline → Semantic Extractors       ││
│  └──────────────────────────────────────────────────────────────┘│
│                                                                  │
│  ┌──────────────┐  ┌──────────────────┐  ┌──────────────────┐  │
│  │  Redis       │  │  Python Workers  │  │  Ollama/vLLM     │  │
│  │  (queue)     │  │  (mining)        │  │  (local LLM)     │  │
│  └──────────────┘  └──────────────────┘  └──────────────────┘  │
└──────────────────────────────────────────────────────────────────┘
                         │ sync (summary-level)
                         ▼
┌──────────────────────────────────────────────────────────────────┐
│                     Облако (SprosOS UI)                          │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────────────┐  │
│  │ Opportunity  │  │ Radar        │  │ System Console       │  │
│  │ Pipeline     │  │ Vectors      │  │ Sync/ConnectorHealth │  │
│  └──────────────┘  └──────────────┘  └──────────────────────┘  │
└──────────────────────────────────────────────────────────────────┘

3 слоя хранения

1. Raw / Cold Storage

  • Что: сырые артефакты: HTML, JSON, CSV, отзывы, serp snapshots, страницы
  • Технология: MinIO или локальная файловая система (parquet/JSONL)
  • Почему: дёшево, не надо embedding-ить весь мусор
  • Индекс: метаданные в Postgres (source, date, url, size, hash)

2. Normalized Storage

  • Что: структурированные сущности Radar
  • Технология: PostgreSQL
  • Сущности:
    • Vector — направление разведки
    • Source — источник данных
    • EvidenceItem — единица свидетельства
    • Signal — выделенный сигнал
    • PainCluster — кластер болей
    • JTBDCandidate — гипотеза JTBD
    • Opportunity — готовая возможность
    • OpportunityScore — оценка возможности
    • ConnectorRun — лог прогона коннектора
    • RadarRun — лог прогона вектора

3. Semantic / Vector Layer

  • Что: embeddings, semantic retrieval, similarity, re-clustering
  • Технология: Qdrant
  • Какие данные: summaries, cleaned chunks, extracted problem statements, JTBD candidates, opportunity cards
  • Что НЕ векторизовать: весь html, сырые архивы, мусорные страницы

Локальный стек (docker-compose outline)

services:
  postgres:
    image: postgres:16
    volumes: [radar-postgres-data:/var/lib/postgresql/data]

  qdrant:
    image: qdrant/qdrant
    volumes: [radar-qdrant-data:/qdrant/storage]

  redis:
    image: redis:7-alpine

  minio:
    image: minio/minio
    volumes: [radar-minio-data:/data]
    command: server /data --console-address :9001

  n8n:
    image: n8nio/n8n
    volumes: [radar-n8n-data:/home/node/.n8n]
    depends_on: [postgres, redis]

  worker:
    build: ./workers
    depends_on: [postgres, qdrant, redis, minio]

  ollama:       # опционально
    image: ollama/ollama
    volumes: [radar-ollama-data:/root/.ollama]

Cloud ↔ Local sync model

Тип данныхГде хранитсяЧто уходит в cloud
Raw evidenceЛокальноНичего (только метаданные)
Normalized entitiesPostgres локальноSummary-level копия для UI
EmbeddingsQdrant локальноНичего (только при поиске)
Opportunity cardsPostgres локально✅ В облачный UI
Connector logsPostgres локально✅ Health/status summary
Evidence count/scorePostgres локально✅ Агрегаты для дашборда

Безопасность

  • Raw-данные не покидают локальный ПК
  • Embeddings — локально, не уходят в облако
  • В облако: только summary, opportunity cards, статусы, агрегаты

Когда строить

NOW: Foundation (этот ADR + registries + docs)
NEXT: Radar Lite MVP — cloud-first, без локального узла
LATER: Развёртывание локального Radar Node, когда будет реальная потребность в объёмах


Решение

✅ Локальный knowledge layer — будущая инфраструктура Radar.
✅ Сейчас — foundation: ADR, registries, архитектура.
✅ Radar Lite MVP — на облаке, без локального узла.
✅ Локальный узел — после подтверждения ценности Radar.


Связанные документы

  • docs/reports/REPORT-RADAR-FOUNDATION-AUDIT.md — аудит текущего mining/radar
  • docs/registries/entity-registry.yaml — Radar entities (to be added)
  • docs/infra/RADAR-LOCAL-NODE.md — подробный план локального узла
  • docs/radar/agent-roles.md — роли субагентов