ナレッジベース
ナレッジベースはエージェントの回答を 接地された ものに感じさせる仕組みです —— LLM はトレーニングデータから推測する必要がなく、毎ターンあなたの runbook、過去のポストモーテム、チームドキュメントを検索できます。
ストレージの形
1 つのベクトルストア、3 つのソースタイプ。
| ソースタイプ | 出所 | 読み取り専用? |
|---|---|---|
vault | 組み込みの ongridio/vault プレイブックコレクション(2026-05-29 時点で 96 件の markdown ドキュメント) | はい |
repo | 登録した git URL —— public HTTPS またはリポジトリごとの SSH identity | いいえ(設定編集 + 再同期) |
upload | SPA の /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 の狭い表面:
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 は:
/var/lib/ongrid/repos/<id>/にgit clone --depth=1(dir が既に ある場合はgit pull)。- ツリーを
.md/.txt/.rst/.yaml/.yml/.toml/.jsonファイルで walk。 - 各ファイルを設定された埋め込みモデルで埋め込む。
- そのリポジトリのポイントセット(
source=repo、repo_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 | 生読み + チャンク |
.pdf | docextract (internal/pkg/docextract) |
.docx | docextract |
各アップロードは 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 はチャットを経由せず同じインデックスを叩けます。