embed model 寫死且用英文模型嵌中文(bge-base-en-v1.5)——模型應可配置+index 版本化,支援換代重刷 #59
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
[總管] 2026-07-17 讀 code 定性(leo 問「知識庫十年後換 embeddings model 怎麼辦」引出)。
現況:
kbdb/src/embed.ts:16寫死EMBED_MODEL = '@cf/baai/bge-base-en-v1.5'(768 維)。兩個問題:@cf/baai/bge-m3(多語)。建議修法:
EMBED_MODEL進 config(deploy 注入,同 kbdb_embed:true 慣例),不寫死。arcrun-kbdb-embed-v2):換代=平行建新 index → reindex backfill 刷滿 → 切 binding,零停機、舊 index 留檔可回退。成本論點(leo):若嵌入範圍收斂到 entities/gloss(精耕原意,見 #60),全量重刷成本極低、十年累積也刷得動;demo 現在把每個 block 都標 embed:true=實質全文向量化,重刷成本會隨庫長大——嵌入範圍該回歸精耕。
[cloud-worker] 08-03 — 換
bge-m3(leo 拍板),程式已推 Gitea;未部署先講最重要的:舊模型不是「效果差」,是排序錯誤
過去這件事一直被描述成「semantic 排名近乎雜訊」,聽起來像「不夠準」。實測之後不是——是排錯。
測法:5 組中文問答測資,每組 1 個問題 + 2 段真的相關 + 3 段無關
(無關的刻意放「同一個知識庫裡會有的其他主題」,不是隨機句子——那才是真實的雜訊來源)。
判準
margin = min(相關分數) − max(無關分數),margin ≤ 0 就是排錯。@cf/baai/bge-base-en-v1.5(現役)@cf/google/embeddinggemma-300m@cf/baai/bge-m3@cf/qwen/qwen3-embedding-0.6b最刺眼的一組——問「知識庫問答為什麼要標出處?」:
這就是 leo 2026-07-18 回報的「問 RAG 卻引用會議室規範」的直接數字。
而且英文 bge 系列的分數全擠在 0.65–0.81,區辨力接近沒有——中文對它就是一堆看不懂的 token。
選 m3 而不是 768 維的 embeddinggemma
看起來
embeddinggemma-300m是 768 維、可沿用現有 index 比較省。那是假的省:⇒ 沿用舊 index = 新舊向量永久混住,比現在更糟
⇒ 開新 index 反而順手繞開 #58(新的天生乾淨,舊的整個丟掉)。既然都要重嵌,就選品質最好且最快的。
已推 Gitea(兩支同名分支)
Arcrun:feat/embed-model-m3-t59— #59 本體EMBED_MODEL寫死常數 →DEFAULT_EMBED_MODEL='@cf/baai/bge-m3'+embedModel(env),可由
env.EMBED_MODEL覆寫,空字串/空白視為沒設embedOnWrite/backfill)與查詢端(semanticSearch)共用同一個 getter——兩邊不同步是最惡毒的 bug:不報錯、分數全垃圾、外面完全看不出來。已加測試守。
arcrun-rag:feat/embed-model-m3-t59— 安裝器那半(index 版本化)EMBED_INDEX_NAME='arcrun-kbdb-embed-m3'/EMBED_DIMENSIONS=1024(原本 768 寫死在建 index 的 body 裡)vectorizeReady快路徑原本不檢查 index 名,會直接沿用舊 index ⇒ 加上「index 名要相符」才走快路徑
驗證
@cf/baai/bge-m3、舊英文模型 0 殘留⚠️ 既有實例的遷移不是自動的(會有一段「語意是空的」窗口)
換 index 名之後,新 index 是空的 ⇒ 語意搜尋暫時查不到任何東西,直到重嵌完成:
(
reindex機制本來就有,#11 加的,配offset分頁。)下一步(等 m3 部署後才做得了)
leo 08-03 定的方向:semantic-first,keyword 與 graph 變可選。
順序不能顛倒——模型沒換之前,semantic-only 會比現在更差(2/5)。換完之後才是:
assemble的 semantic +0.4 權重拿掉,讓語意當主力kw_search整個移出rag_chat(它現在花 1.2 秒回 0 筆),改成 AI 需要時才調用的工具—— cloud-worker,08-03
✅ 結案(2026-08-09 逐票查核)
這張票描述的問題現在已經不存在。
證據
`kbdb/src/embed.ts` 已換代到 `@cf/baai/bge-m3`(1024-dim,實測品質最好且最快),`kbdb/src/types.ts:22` 有 `EMBED_MODEL?: string` 可覆寫。(總管親自 grep 複驗)
查核方式:讀現行程式碼實證,非讀票面推測。總管另抽驗過同批中三張(#5/#58/#59),全部屬實。
如果我判錯了,重開就是——關錯票的成本遠低於留著一堆假的待辦,而假待辦會讓 leo 看不出還剩什麼。
[總管·票務複驗 2026-08-09 晚] ✅ 關票——問題已不存在,證據是我自己跑出來的。
kbdb/src/embed.ts:38→const DEFAULT_EMBED_MODEL = '@cf/baai/bge-m3'(1024 維多語模型,與 Vectorize index dimensions 對齊);:89-90可由env.EMBED_MODEL覆寫。⇒ 票要的兩件(換掉英文模型、模型可配置)都成立。📌 為什麼是現在才關:這個 repo 的 37 張票原本一張狀態標籤都沒有,等於在看板上不存在,也就沒有人會回頭看它們還成不成立。今晚做了一次全面驗傷,只有實際跑指令驗到問題真的消失的才關;查不出來的一律留著並標明卡在哪。
如果我判錯了(例如你要的其實比程式碼裡這些更多),直接重開這張票,我不會有意見。