База знаний
База знаний — это то, что заставляет ответы агента казаться обоснованными — LLM не приходится гадать на основе обучающих данных, потому что он может искать в ваших runbook, ваших прошлых postmortem и документации вашей команды на каждом ходе.
Форма хранения
Один векторный store, три типа источников.
| Тип источника | Откуда берётся | Read-only? |
|---|---|---|
vault | Встроенная коллекция playbook ongridio/vault (96 markdown-документов на 2026-05-29) | Да |
repo | Git-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:
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:
git clone --depth=1(илиgit pull, если директория уже существует) в/var/lib/ongrid/repos/<id>/.- Обходит дерево для файлов
.md/.txt/.rst/.yaml/.yml/.toml/.json. - Эмбедит каждый файл сконфигурированной embedding-моделью.
- Заменяет 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 |
.pdf | docextract (internal/pkg/docextract) |
.docx | docextract |
Каждая загрузка становится строкой в 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», чтобы операторы могли попасть в тот же индекс без захода в чат.
См. также
- Skills —
query_knowledge— один из 18 bridged BaseTool, выставленных в реестре скиллов. - RCA — персона investigator, которая вызывает knowledge-поиск как инструмент первой инстанции.
- Архитектура — где Qdrant сидит в L1-стеке.