---
tags: [kbdb, 架構決策]
gloss: embedding 機制歸 KBDB base 的 optional 模組，有 Vectorize binding 才啟用；無則降級 LIKE keyword，API 不變。
---
# Embedding 是 Base Optional 模組

← [[decisions/00-INDEX]]

**來源**：`system-dev/wiki/decisions-summary.md`（embedding 是 base optional 模組）、`docs/3-specs/arcrun/kbdb-base/` Phase 12
**最後更新**：2026-06-27

## 摘要
語義查詢/embedding 不是獨立模組或圖插件，而是 KBDB base 層的 optional 擴展。Vectorize + AI binding 存在時啟用；缺少時降級 keyword search + capability hint（發現閉環，不假綠）。

## 重點
- **歸屬**：embedding 機制屬 base 層（核心表 entries/templates/records），不是 graph 層（triplet 插件）、不是 ingest 層（爬蟲）。
- **啟用機制**：
  - 部署時檢查 KBDB binding 是否含 `[ai]` + `[[vectorize]]` → 有則啟用 semantic search
  - 無則 API 降級為 keyword LIKE + `capability_hint`（告知使用者「語義搜尋未啟用」）
  - **API 簽名不變**（無論啟用否，查詢端點同一個 `/search`），降級轉換在後端
- **部署陷阱**：部署注入 `[ai]`/`[[vectorize]]` binding 必須在 `stripOfficialOnlyBindings` **之後**（否則 [ai] 被清）。
- **精耕策略**（非地毯式）：只 embed 標 `metadata_json.embed:true` 的 entry（wiki 段落 + gloss），不對每個 block 灌。
- **無白名單**：base 用通用 flag 判 embed:true，不寫死 entry_type 白名單（守解耦，base 對內容語意無知）。
- **向量存儲位置**：向量獨存 Vectorize，三表（entries/templates/records）不改動。
- **發現閉環**：無 embedding 時不假綠（回傳空結果假裝查到），而是明確 hint「語義未啟用」→ capability-driven 發現系統能自動 degrade。

## 實體
- **Base 層**（base layer）— KBDB 核心表（entries/templates/records）及其基本操作。
- **Optional 模組**（optional module）— 功能開/關不拆 repo，降級機制在 API 內部。
- **Vectorize**（Cloudflare Vectorize）— 向量資料庫 binding，儲存 embedding。
- **Semantic search**（語義搜尋）— 基於 embedding 的向量相似度查詢。
- **Capability hint**（能力提示）— API 回傳中明確標示「此能力未啟用」，供 client 判斷。
- **Embed flag**（embed:true）— 在 entry metadata_json 中設置，標示是否參與 embedding。

## 關聯
### 內文知識關係
- Vectorize binding >> 啟用 >> Semantic search
- 無 Vectorize >> 降級為 >> Keyword search
- Embed flag >> 控制 >> 哪些 entry 參與 embedding
- API >> 不變 >> 無論 embedding 啟用否
- Capability hint >> 發現 >> 語義搜尋未啟用
### 卡片關係
- [[embedding是base-optional模組]] >> 涉及部署 >> [[self-hosted部署-共享install加指紋跳過]]
