Skip to content

База знаний

База знаний — это то, что заставляет ответы агента казаться обоснованными — LLM не приходится гадать на основе обучающих данных, потому что он может искать в ваших runbook, ваших прошлых postmortem и документации вашей команды на каждом ходе.

Форма хранения

Один векторный store, три типа источников.

Тип источникаОткуда берётсяRead-only?
vaultВстроенная коллекция playbook ongridio/vault (96 markdown-документов на 2026-05-29)Да
repoGit-URL, которые вы регистрируете — публичный HTTPS или SSH через per-repo identityНет (редактирование настроек + re-sync)
uploadПрямые загрузки (md / txt / pdf / docx) через страницу /knowledge в SPAНет (редактирование / удаление строки)
manualВставить markdown через инлайн-редакторНет

Все четыре типа делят одну коллекцию Qdrant (ongrid_knowledge) и одну embedding-модель. Search-хиты возвращают поле payload source_type, так что UI может отрендерить правильный бейдж «from vault» / «from your repos».

ADR-028 — источники знаний, многоуровневые

Почему одна коллекция: альтернатива (одна коллекция на тип источника) заставляла LLM делать N поисков на вопрос, чтобы получить покрытие, взрывая бюджет вызовов инструментов. Одна коллекция + фильтр source_type даёт ту же изоляцию одним запросом.

Qdrant-клиент

Узкая поверхность, в internal/manager/biz/knowledge/usecase.go:62:

go
type QdrantClient interface {
    EnsureCollection(ctx context.Context, name string, dim int) error
    EnsurePayloadIndex(ctx context.Context, collection, field, schema string) error
    Upsert(ctx context.Context, collection string, points []qdrantx.Point) error
    DeleteByFilter(ctx context.Context, collection string, mustMatch map[string]any) error
    DeleteByID(ctx context.Context, collection string, id uint64) error
    GetPoints(ctx context.Context, collection string, ids []uint64) ([]qdrantx.SearchHit, error)
    Search(ctx context.Context, collection string, vector []float32, opts qdrantx.SearchOpts) ([]qdrantx.SearchHit, error)
    Scroll(ctx context.Context, collection string, opts qdrantx.ScrollOpts) (*qdrantx.ScrollResult, error)
}

Подкрепляется internal/pkg/qdrantx в production, fake-абельно в тестах. Qdrant поставляется в docker-compose; внешний Qdrant поддерживается через ONGRID_QDRANT_URL.

Vault

Vault — это публичный git-репозиторий (без auth), который поставляет предкурированные диагностические playbook. Покрываемые темы (на 2026-05-29):

  • Сеть: рецепты отладки DNS / TCP / TLS / HTTP.
  • Kubernetes: карты симптом-причина для pod / node / kubelet.
  • Linux: пути исследования процессов / памяти / диска / journald.
  • БД: триаж MySQL slow-log, отставание репликации PostgreSQL.
  • Diagnostics: 70+ playbook, ключованных по симптомам.

ADR-029 добавил облачную синхронизацию: manager подтягивает последний vault по расписанию (по умолчанию 24ч, настраивается через настройки SPA) и пере-эмбедит при изменениях. On-disk checkout живёт под /var/lib/ongrid/repos/<vault_id>/; точки qdrant тегированы source=vault, так что Sync удаляет только vault-точки, никогда ваши собственные.

Не относитесь к vault как к вашему репозиторию

Vault — это встроенный источник — он никогда не появляется на CRUD-странице /knowledge/repos. Код использует isBuiltinVault() / is_builtin для гейтинга; не делайте substring-match ongridio/vault (см. feedback по рецидивирующим ловушкам).

Ваши собственные репозитории

POST /v1/knowledge/repos с телом { url, name } регистрирует git-репозиторий. На следующем sync-tick manager:

  1. git clone --depth=1 (или git pull, если директория уже существует) в /var/lib/ongrid/repos/<id>/.
  2. Обходит дерево для файлов .md / .txt / .rst / .yaml / .yml / .toml / .json.
  3. Эмбедит каждый файл сконфигурированной embedding-моделью.
  4. Заменяет point-set для этого репозитория (source=repo, repo_id=<id>) атомарно.

SSH-auth

Per-repo identity, управляется через таблицу ssh_identities и страницу /knowledge/identities в SPA. Строка Repository НЕ несёт поле провайдера — таблица identity — единственный источник git-учёток (ADR-023).

GIT_SSH_COMMAND устанавливается per-sync, чтобы указать на key-файл identity, так что clone каждого репозитория использует свой ключ без загрязнения $HOME/.ssh/.

HTTPS-auth

Публичные HTTPS-репозитории клонируются без auth. Private HTTPS auth припаркован: исходный путь GitHub-PAT был удалён, когда SSH покрыл реалистичные use case. До приземления RepoFetcher из ADR-018 используйте SSH для приватных.

Загрузки

Страница /knowledge/upload принимает:

ФорматExtractor
.md, .txtСырое чтение + chunking
.pdfdocextract (internal/pkg/docextract)
.docxdocextract

Каждая загрузка становится строкой в knowledge_docs и точкой в qdrant с source=upload. Инлайн-редактирование и удаление работают per-row из дерева «Organization knowledge».

Поиск

LLM получает BaseTool query_knowledge — схема в query_knowledge_basetool.go. Аргументы: query, опциональный фильтр source_type, опциональный top_k. Возвращает: список хитов {score, source, title, snippet, url?}.

Персона coordinator проинструктирована вызывать это рано для любого вопроса «как мне» / «почему происходит X» / «какой runbook для Y» — стоимость одного knowledge-поиска значительно ниже, чем 5-инструментное расследование, которое приходит к тому же ответу, который playbook уже имел.

Чат-UI также выставляет кнопку Quick Action «Search knowledge», чтобы операторы могли попасть в тот же индекс без захода в чат.

См. также

  • Skillsquery_knowledge — один из 18 bridged BaseTool, выставленных в реестре скиллов.
  • RCA — персона investigator, которая вызывает knowledge-поиск как инструмент первой инстанции.
  • Архитектура — где Qdrant сидит в L1-стеке.