KBDB 缺 vector delete——entry 下架後殘影向量永久佔據語意排名(CF deleteByIds 原生有,Arcrun 沒接) #58

Closed
opened 2026-07-17 03:51:40 +00:00 by Leo · 3 comments
Owner

[總管] 2026-07-17 demo 實測定性。

定性:CF Vectorize v2 原生支援 deleteByIds(binding env.VECTORIZE.deleteByIds([...])+REST 都有);Arcrun KBDB 從未接——kbdb/src/embed.ts 全檔只有 upsert,entry 被 deprecate/tombstone 後它的向量永遠留在索引裡。

實測症狀(uncle6 demo,一手證據):demo 管線反轉重萃三輪後,語意查「住宿費上限每晚多少」的 top 1-2 都是 tombstone entry(content 已換成「(舊管線產物,已由定稿卡取代)」,但舊向量還在、照舊內容的相似度排名)——正確答案的 block 被殘影擠出前排。reindex backfill 只會 re-upsert 現役向量、不會移除已下架者(embed:false 者不掃=舊向量永生)。

建議修法(互補三件)

  1. 生命週期接線(治本):entries PATCH 把 metadata_json.status 翻成 deprecated(或 embed:false)時,同步 VECTORIZE.deleteByIds([entry_id])(vector id=entry id,upsert 同 id 慣例已在)。G9 removed 分支、tombstone 流程即刻受益。
  2. 批次清理端點POST /embed/purge——掃「已嵌且 status=deprecated」的 entries 分批 deleteByIds,清歷史殘影(demo 現在就有一批等它清)。
  3. #46(keyword/semantic 結果面濾 deprecated)互補:#46 治標(查詢面過濾)、本案治本(索引面移除);兩個都要——結果面過濾防漏網,索引面移除還 topK 名額。

影響面:所有會更新/刪除文件的實例(RAG 產品每日 reset、Mira 精耕更新、14-E tombstone 家族)。同族背景:cypher 無 DELETE proxy(14-E)=「append-only 缺下架配套」的另一面。

[總管] 2026-07-17 demo 實測定性。 **定性**:CF Vectorize v2 **原生支援** `deleteByIds`(binding `env.VECTORIZE.deleteByIds([...])`+REST 都有);**Arcrun KBDB 從未接**——`kbdb/src/embed.ts` 全檔只有 `upsert`,entry 被 deprecate/tombstone 後它的向量永遠留在索引裡。 **實測症狀(uncle6 demo,一手證據)**:demo 管線反轉重萃三輪後,語意查「住宿費上限每晚多少」的 **top 1-2 都是 tombstone entry**(content 已換成「(舊管線產物,已由定稿卡取代)」,但舊向量還在、照舊內容的相似度排名)——正確答案的 block 被殘影擠出前排。`reindex` backfill 只會 re-upsert 現役向量、**不會移除**已下架者(embed:false 者不掃=舊向量永生)。 **建議修法(互補三件)**: 1. **生命週期接線(治本)**:entries PATCH 把 `metadata_json.status` 翻成 deprecated(或 embed:false)時,同步 `VECTORIZE.deleteByIds([entry_id])`(vector id=entry id,upsert 同 id 慣例已在)。G9 removed 分支、tombstone 流程即刻受益。 2. **批次清理端點**:`POST /embed/purge`——掃「已嵌且 status=deprecated」的 entries 分批 deleteByIds,清歷史殘影(demo 現在就有一批等它清)。 3. 與 **#46(keyword/semantic 結果面濾 deprecated)互補**:#46 治標(查詢面過濾)、本案治本(索引面移除);兩個都要——結果面過濾防漏網,索引面移除還 topK 名額。 **影響面**:所有會更新/刪除文件的實例(RAG 產品每日 reset、Mira 精耕更新、14-E tombstone 家族)。同族背景:cypher 無 DELETE proxy(14-E)=「append-only 缺下架配套」的另一面。
Author
Owner

08-01 複核:◐ 半通——建議 1 的一半已接線,建議 2 未做,保留

已完成(main 源碼實查)kbdb/src/routes/entries.ts:193-196DELETE /entries/:id 已連帶刪向量:

// 模組開 → 連帶刪向量(避免孤兒向量)。失敗不致命。
if (embedEnabled(c.env)) {
  c.executionCtx.waitUntil(c.env.VECTORIZE!.deleteByIds([c.req.param(id)]));
}

⇒ 本 issue 定性的「Arcrun 從未接 deleteByIds」已不再成立,硬刪這條路已補

仍缺(本 issue 保留的理由)

  1. 生命週期接線只做了硬刪,沒做 deprecate——建議 1 的核心情境是「PATCH 把 metadata_json.status 翻成 deprecated(或 embed:false)時同步 deleteByIds」。entries.ts 的 PATCH 路徑目前只有 embedOnWrite(re-upsert),沒有 delete 分支。tombstone/G9 removed/Mira 精耕更新走的都是 deprecate 而非 DELETE ⇒ demo 實測的殘影症狀(tombstone 佔語意 top 1-2)尚未解決
  2. POST /embed/purge 批次清理端點不存在git grep embed/purge kbdb/src → 無)——歷史殘影仍無通道清。

建議下一步:補 PATCH 的 status/embed 翻轉 → deleteByIds 分支 + purge 端點,兩件做完再關。

## 08-01 複核:◐ 半通——建議 1 的一半已接線,建議 2 未做,保留 **已完成(main 源碼實查)**:`kbdb/src/routes/entries.ts:193-196` — `DELETE /entries/:id` 已連帶刪向量: ```ts // 模組開 → 連帶刪向量(避免孤兒向量)。失敗不致命。 if (embedEnabled(c.env)) { c.executionCtx.waitUntil(c.env.VECTORIZE!.deleteByIds([c.req.param(id)])…); } ``` ⇒ 本 issue 定性的「Arcrun 從未接 deleteByIds」已不再成立,**硬刪這條路已補**。 **仍缺(本 issue 保留的理由)**: 1. **生命週期接線只做了硬刪,沒做 deprecate**——建議 1 的核心情境是「PATCH 把 `metadata_json.status` 翻成 deprecated(或 `embed:false`)時同步 deleteByIds」。`entries.ts` 的 PATCH 路徑目前只有 `embedOnWrite`(re-upsert),**沒有 delete 分支**。tombstone/G9 removed/Mira 精耕更新走的都是 deprecate 而非 DELETE ⇒ demo 實測的殘影症狀(tombstone 佔語意 top 1-2)**尚未解決**。 2. **`POST /embed/purge` 批次清理端點不存在**(`git grep embed/purge kbdb/src` → 無)——歷史殘影仍無通道清。 **建議下一步**:補 PATCH 的 status/embed 翻轉 → deleteByIds 分支 + purge 端點,兩件做完再關。
Author
Owner

結案(2026-08-09 逐票查核)

這張票描述的問題現在已經不存在

證據
`kbdb/src/actions/entry-crud.ts:146` 起已接 `VECTORIZE.deleteByIds`,並同步標記 D1 側「已無向量」讓兩邊不說兩套話(`b7af622`)。(總管親自 grep 複驗)

查核方式:讀現行程式碼實證,非讀票面推測。總管另抽驗過同批中三張(#5/#58/#59),全部屬實。

如果我判錯了,重開就是——關錯票的成本遠低於留著一堆假的待辦,而假待辦會讓 leo 看不出還剩什麼。

## ✅ 結案(2026-08-09 逐票查核) 這張票描述的問題**現在已經不存在**。 **證據** \`kbdb/src/actions/entry-crud.ts:146\` 起已接 \`VECTORIZE.deleteByIds\`,並同步標記 D1 側「已無向量」讓兩邊不說兩套話(\`b7af622\`)。(總管親自 grep 複驗) 查核方式:讀現行程式碼實證,非讀票面推測。總管另抽驗過同批中三張(#5/#58/#59),全部屬實。 如果我判錯了,重開就是——**關錯票的成本遠低於留著一堆假的待辦**,而假待辦會讓 leo 看不出還剩什麼。
Leo closed this issue 2026-08-09 13:08:30 +00:00
Author
Owner

[總管·票務複驗 2026-08-09 晚] 關票——問題已不存在,證據是我自己跑出來的。

kbdb/src/routes/entries.ts4 處 deleteByIds 呼叫(entry 下架連帶清向量)。⇒ 票說的「CF deleteByIds 原生有、Arcrun 沒接」已不成立。


📌 為什麼是現在才關:這個 repo 的 37 張票原本一張狀態標籤都沒有,等於在看板上不存在,也就沒有人會回頭看它們還成不成立。今晚做了一次全面驗傷,只有實際跑指令驗到問題真的消失的才關;查不出來的一律留著並標明卡在哪。
如果我判錯了(例如你要的其實比程式碼裡這些更多),直接重開這張票,我不會有意見。

[總管·票務複驗 2026-08-09 晚] ✅ **關票——問題已不存在,證據是我自己跑出來的。** `kbdb/src/routes/entries.ts` 有 **4 處** `deleteByIds` 呼叫(entry 下架連帶清向量)。⇒ 票說的「CF deleteByIds 原生有、Arcrun 沒接」已不成立。 --- 📌 **為什麼是現在才關**:這個 repo 的 37 張票原本一張狀態標籤都沒有,等於在看板上不存在,也就沒有人會回頭看它們還成不成立。今晚做了一次全面驗傷,**只有實際跑指令驗到問題真的消失的才關**;查不出來的一律留著並標明卡在哪。 如果我判錯了(例如你要的其實比程式碼裡這些更多),直接重開這張票,我不會有意見。
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Leo/Arcrun#58