Skip to content

ナレッジベース

ナレッジベースはエージェントの回答を 接地された ものに感じさせる仕組みです —— LLM はトレーニングデータから推測する必要がなく、毎ターンあなたの runbook、過去のポストモーテム、チームドキュメントを検索できます。

ストレージの形

1 つのベクトルストア、3 つのソースタイプ。

ソースタイプ出所読み取り専用?
vault組み込みの ongridio/vault プレイブックコレクション(2026-05-29 時点で 96 件の markdown ドキュメント)はい
repo登録した git URL —— public HTTPS またはリポジトリごとの SSH identityいいえ(設定編集 + 再同期)
uploadSPA の /knowledge ページ経由の直接アップロード(md / txt / pdf / docx)いいえ(行の編集 / 削除)
manualインラインエディタで markdown を貼り付けいいえ

4 つのタイプすべてが 1 つ の Qdrant コレクション(ongrid_knowledge) と 1 つ の埋め込みモデルを共有します。検索ヒットは payload フィールド source_type を返すので、UI が「from vault」/「from your repos」の正しい バッジを描画できます。

ADR-028 —— ナレッジソース、階層化

なぜ 1 コレクションか:代替案(ソースタイプごとに 1 コレクション)は LLM に カバレッジを得るためクエストごとに N 個の検索を呼ばせ、ツール呼び出し 予算を爆発させました。1 コレクション + source_type フィルターなら同じ 分離を 1 クエリで達成できます。

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 がバックエンド、テストでは fake 可能。 Qdrant は docker-compose に同梱されます。外部 Qdrant は ONGRID_QDRANT_URL でサポートされます。

Vault

vault は事前キュレーションされた診断プレイブックを同梱する 公開 git リポジトリ(認証不要)です。カバーするトピック(2026-05-29 時点):

  • ネットワーク:DNS / TCP / TLS / HTTP デバッグレシピ。
  • Kubernetes:pod / node / kubelet の症状 → 原因マップ。
  • Linux:プロセス / メモリ / ディスク / journald の調査パス。
  • データベース:MySQL slow-log トリアージ、PostgreSQL レプリケーション ラグ。
  • 診断:70+ の症状キー付きプレイブック。

ADR-029 はクラウド同期を追加しました:manager がスケジュール(デフォルト 24 時間、SPA 設定で構成可能)で最新の vault を pull し、変更時に再 埋め込みします。ディスク上のチェックアウトは /var/lib/ongrid/repos/<vault_id>/ 下にあり、qdrant ポイントは source=vault でタグ付けされているので Sync は vault ポイントだけを 削除し、自前のものは決して削除しません。

vault を自分のリポとして扱わないでください

vault は組み込みソースです —— /knowledge/repos の CRUD ページには 決して現れません。コードは isBuiltinVault() / is_builtin でゲート します。ongridio/vault を substring 一致させないでください(recurring- pitfalls フィードバック参照)。

自前のリポジトリ

POST /v1/knowledge/repos{ url, name } ボディで git リポジトリを 登録します。次の同期 tick で manager は:

  1. /var/lib/ongrid/repos/<id>/git clone --depth=1(dir が既に ある場合は git pull)。
  2. ツリーを .md / .txt / .rst / .yaml / .yml / .toml / .json ファイルで walk。
  3. 各ファイルを設定された埋め込みモデルで埋め込む。
  4. そのリポジトリのポイントセット(source=reporepo_id=<id>)を アトミックに置き換える。

SSH 認証

リポジトリごとの identity を ssh_identities テーブルと SPA の /knowledge/identities ページで管理します。Repository 行は provider フィールドを持ちません —— identity テーブルが git 認証情報の 単一情報源です (ADR-023)。

GIT_SSH_COMMAND は同期ごとに identity の鍵ファイルを指すよう設定される ので、各リポジトリの clone は $HOME/.ssh/ を汚染せずに自分の鍵を使い ます。

HTTPS 認証

公開 HTTPS リポは未認証で clone します。プライベート HTTPS 認証は保留中: オリジナルの GitHub-PAT パスは SSH が現実的なユースケースをカバーした ときに削除されました。ADR-018 の RepoFetcher がランディングするまで、 プライベートには SSH を使ってください。

アップロード

/knowledge/upload ページが受け付けるのは:

フォーマット抽出器
.md, .txt生読み + チャンク
.pdfdocextract (internal/pkg/docextract)
.docxdocextract

各アップロードは knowledge_docs の行と、source=upload の qdrant ポイントになります。「Organization knowledge」ツリーから行ごとのインライン 編集と削除が可能です。

検索

LLM は query_knowledge BaseTool を持ちます —— スキーマは query_knowledge_basetool.go にあります。引数:query、オプションの source_type フィルター、 オプションの top_k。返り値:{score, source, title, snippet, url?} のヒットリスト。

coordinator ペルソナは「どうやって…」/「なぜ X が起きる」/「Y の runbook は何か」のような質問では 早期に これを呼ぶよう指示されています —— 1 回のナレッジ検索のコストは、プレイブックがすでに持っている答えに辿り 着く 5 ツール調査より遥かに低いからです。

チャット UI は「Search knowledge」というクイックアクションボタンも公開 していて、operator はチャットを経由せず同じインデックスを叩けます。

関連

  • スキル —— query_knowledge はスキルレジストリに浮上する 18 のブリッジ BaseTool の 1 つ。
  • RCA —— ナレッジ検索を第一手段ツールとして呼ぶ investigator ペルソナ。
  • アーキテクチャ —— Qdrant が L1 スタック のどこに座るか。