[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-ferresdb-production-rust-vector-db-updates-zh":3,"tags-ferresdb-production-rust-vector-db-updates-zh":35,"related-lang-ferresdb-production-rust-vector-db-updates-zh":50,"related-posts-ferresdb-production-rust-vector-db-updates-zh":54,"series-tools-af6bd5c1-b58a-4c4c-adff-9dd6a2bf7cbe":91},{"id":4,"title":5,"content":6,"summary":7,"source":8,"source_url":9,"author":10,"image_url":11,"keywords":12,"language":23,"translated_content":10,"views":24,"is_premium":25,"created_at":26,"updated_at":26,"cover_image":11,"published_at":27,"rewrite_status":28,"rewrite_error":10,"rewritten_from_id":29,"slug":30,"category":31,"related_article_id":32,"status":33,"google_indexed_at":34,"x_posted_at":10,"tweet_text":10,"title_rewritten_at":10,"title_original":10,"key_takeaways":10,"topic_cluster_id":10,"embedding":10,"is_canonical_seed":25},"af6bd5c1-b58a-4c4c-adff-9dd6a2bf7cbe","FerresDB 走向正式上線的 Rust 搜尋","\u003Cp>說真的，FerresDB 這次更新很有料。它一次補上 5 個生產功能。包含 \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Frafael-ferres\u002Fferresdb\" target=\"_blank\" rel=\"noopener\">FerresDB\u003C\u002Fa>、\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fhnswlib\u002Fhnswlib\" target=\"_blank\" rel=\"noopener\">HNSW\u003C\u002Fa> 自動調參、\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fonnx\u002Fonnxruntime\" target=\"_blank\" rel=\"noopener\">ONNX Runtime\u003C\u002Fa> rerank\u003Ca href=\"\u002Fnews\u002Ftested-devin-10-tasks-finished-3-zh\">in\u003C\u002Fa>g、PITR，還有 Raft 基礎層。這不是玩具功能堆疊。這是在補正式上線會遇到的坑。\u003C\u002Fp>\u003Cp>講白了，向量搜尋最難的地方，早就不是「能不能找相似資料」。而是記憶體怎麼省、出錯怎麼救、延遲怎麼穩。FerresDB 這波更新，方向很明確。它想從 demo，直接走到可營運的資料庫。\u003C\u002Fp>\u003Ch2>從 demo 走到正式系統\u003C\u002Fh2>\u003Cp>FerresDB 原本就不是空殼。它有 HNSW 型索引、WAL、定期 snapshot、BM25 混合搜尋、scalar quantization、ti\u003Ca href=\"\u002Fnews\u002Fcuda-cp-async-ampere-hbm-latency-zh\">ere\u003C\u002Fa>d storage、WebSocket 串流、OpenTelemetry trac\u003Ca href=\"\u002Fnews\u002Fchainalysis-ai-agents-crypto-investigations-zh\">in\u003C\u002Fa>g，還有 API key 的 RBAC。這些東西湊在一起，才像一套真的資料庫。\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1775168156597-iqqe.png\" alt=\"FerresDB 走向正式上線的 Rust 搜尋\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cp>這次更新的重點，是把「能跑」補成「能長期跑」。很多團隊做 RAG 或語意搜尋時，先把查詢打通。接著才發現，備份、權限、觀測、還原，才是每天會咬人的地方。FerresDB 這次就是在補這些。\u003C\u002Fp>\u003Cp>我覺得這很務實。因為向量搜尋系統如果只會快，通常活不久。真正上線後，大家先問的不是 recall。是「昨天誤刪了，能不能救回來？」、「高峰期延遲會不會爆？」、「多租戶會不會互相干擾？」\u003C\u002Fp>\u003Cul>\u003Cli>支援 cosine、Euclidean、dot product\u003C\u002Fli>\u003Cli>Scalar quantization 可把 f32 壓成 u8\u003C\u002Fli>\u003Cli>記憶體占用約可降到 1\u002F4\u003C\u002Fli>\u003Cli>OpenTelemetry 可追每次搜尋\u003C\u002Fli>\u003Cli>API key 可控 collection 權限\u003C\u002Fli>\u003C\u002Ful>\u003Cp>這些功能看起來很工程。其實很合理。因為真正花時間的，通常不是模型，而是資料服務本身。你可以今天把 embedding 算完，但明天還是得面對權限、備份、觀測和延遲抖動。\u003C\u002Fp>\u003Cblockquote>“The key insight: angular boundaries are mathematically fixed. There’s no calibration step, no per-block parameters, and no warm-up phase before the index is ready.”\u003C\u002Fblockquote>\u003Ch2>PolarQuant 在壓縮上換了思路\u003C\u002Fh2>\u003Cp>這次最有意思的儲存更新，是 \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Frafael-ferres\u002Fferresdb\" target=\"_blank\" rel=\"noopener\">PolarQuant\u003C\u002Fa>。舊的 SQ8 會先做 calibration，再把每個維度壓縮。這樣準確率通常不錯，但啟動前要先吃一輪資料。對要快速建立 collection 的系統來說，這步驟很煩。\u003C\u002Fp>\u003Cp>PolarQuant 的做法不一樣。它把向量拆成半徑和角度，再把角度量化成 u8。重點是，它不用 calibration。沒有 warm-up sample，也不用等索引「養好」才開放查詢。這種設計很適合 on-demand 建立資料集的場景。\u003C\u002Fp>\u003Cp>FerresDB 也做了 Criterion benchmark，名字叫 \u003Ccode>quantization_comparison\u003C\u002Fcode>。它比較 build time、search latency、recall@10 和記憶體用量。測試維度是 128 和 384。結果很直白：PolarQuant 啟動比較快，SQ8 在高維度時可能有一點準確率優勢。\u003C\u002Fp>\u003Cul>\u003Cli>SQ8 需要每維 calibration\u003C\u002Fli>\u003Cli>PolarQuant 跳過 calibration\u003C\u002Fli>\u003Cli>PolarQuant 建完就能用\u003C\u002Fli>\u003Cli>SQ8 在高維度可能更準\u003C\u002Fli>\u003C\u002Ful>\u003Cp>這種取捨很像真實產品選型。你如果是短生命週期工作負載，啟動快很重要。你如果是長期穩定服務，準確率可能更重要。FerresDB 沒硬講誰一定贏，它只是把選項攤開。\u003C\u002Fp>\u003Cp>我覺得這比單純追求壓縮率更成熟。因為資料庫不是論文。論文可以只看指標。上線之後，啟動時間、維護成本、資料分布，全部都會變成錢。\u003C\u002Fp>\u003Ch2>HNSW 自動調參，少一點手工猜拳\u003C\u002Fh2>\u003Cp>FerresDB 的 \u003Ca href=\"https:\u002F\u002Fwww.ferresdb.com\" target=\"_blank\" rel=\"noopener\">FerresEngine\u003C\u002Fa> 現在會自動調整 HNSW 的 \u003Ccode>ef_search\u003C\u002Fcode>。這個參數很關鍵。值高一點，recall 通常更好。代價就是 CPU 更忙，查詢也更慢。\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1775168170746-lbis.png\" alt=\"FerresDB 走向正式上線的 Rust 搜尋\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cp>它的做法不複雜。每 60 秒檢查一次每個 collection 的 P95 latency。若延遲還有空間，就把 \u003Ccode>ef_search\u003C\u002Fcode> 往上加。若延遲開始變高，就往下調。這種控制法很像保守版的自動駕駛。它不追極限，只求穩。\u003C\u002Fp>\u003Cp>這點我蠻認同。因為很多團隊其實都卡在 HNSW tuning。參數不是不懂，是流量一直變。白天和夜晚不同，冷資料和熱資料不同，租戶 A 和租戶 B 也不同。固定值常常撐不久。\u003C\u002Fp>\u003Cul>\u003Cli>每 60 秒看一次 P95 latency\u003C\u002Fli>\u003Cli>延遲低就提高 \u003Ccode>ef_search\u003C\u002Fcode>\u003C\u002Fli>\u003Cli>CPU 壓力高就降低 \u003Ccode>ef_search\u003C\u002Fcode>\u003C\u002Fli>\u003Cli>目前值可在 stats API 看到\u003C\u002Fli>\u003C\u002Ful>\u003Cp>FerresDB 這裡採的是保守控制。它不是複雜的 PID loop。這很像資料庫圈常見的現實主義。先別亂飆。先把波動壓住。對線上服務來說，穩定常常比理論最優更值錢。\u003C\u002Fp>\u003Cp>你可能會問，這種自動調參會不會太粗？會。但我覺得比完全手動好。因為手動調參常常只在壓測當下準。真正上線後，流量一變，參數就失真。\u003C\u002Fp>\u003Ch2>PITR、reranking，還有那些最容易漏掉的事\u003C\u002Fh2>\u003Cp>這次更新裡，最像「正式上線必備」的功能，是 point-in-time recovery。FerresDB 現在能用 WAL 和 snapshot 做時間點還原。這跟 \u003Ca href=\"https:\u002F\u002Fwww.postgresql.org\u002Fdocs\u002Fcurrent\u002Fcontinuous-archiving.html\" target=\"_blank\" rel=\"noopener\">PostgreSQL\u003C\u002Fa> 的思路很接近。你可以回到某個時間點，不用整個退回到最後一次完整備份。\u003C\u002Fp>\u003Cp>這對操作失誤很有用。比如批次 upsert 寫錯，或是誤刪某個 namespace。只要 WAL 還在，還原就有機會救回來。這種功能平常沒人喊。出事時大家都會找它。\u003C\u002Fp>\u003Cp>另一個很實際的功能，是 reranking。FerresDB 透過 \u003Ca href=\"https:\u002F\u002Fonnxruntime.ai\u002F\" target=\"_blank\" rel=\"noopener\">ONNX Runtime\u003C\u002Fa> 跑 cross-encoder，把 HNSW 找出的候選結果再排一次。流程很標準。先撈較多候選，再用模型重排，最後回傳 top matches。這對 RAG 很重要。\u003C\u002Fp>\u003Cp>FerresDB 的預設是撈 5 倍的候選數，再送進 reranker。這個倍率蠻合理。太少，排序沒材料。太多，延遲會上去。它還會回報 rerank latency，讓你知道模型成本到底多高。\u003C\u002Fp>\u003Cul>\u003Cli>PITR 可回到指定時間點\u003C\u002Fli>\u003Cli>\u003Ccode>\u002Fapi\u002Fv1\u002Fadmin\u002Frestore\u002Fpoints\u003C\u002Fcode> 可列出還原點\u003C\u002Fli>\u003Cli>rerank 預設抓 5 倍候選\u003C\u002Fli>\u003Cli>ONNX Runtime 不用再開 Python 服務\u003C\u002Fli>\u003C\u002Ful>\u003Cp>如果你做過語意搜尋，應該很懂這個差別。第一階段檢索負責找得到。第二階段 rerank 負責排得對。很多系統死在只做第一段。結果是找得到一堆東西，但答案順序很爛。\u003C\u002Fp>\u003Ch2>多租戶、圖遍歷、Raft，開始像真的服務\u003C\u002Fh2>\u003Cp>FerresDB 也補了多租戶控制。namespace allowance 可以讓 API key 只看特定 namespace。若開啟物理隔離，每個 namespace 會放在自己的目錄。這種分法很聰明。因為授權和資料布局，本來就不是同一件事。\u003C\u002Fp>\u003Cp>它還加了 graph traversal。點與點之間可以連結，連結也會寫進 WAL。之後可以用 BFS 只在連通子圖裡搜尋。這對 citation graph、相關文件探索、或群組內語意搜尋都很實用。\u003C\u002Fp>\u003Cp>最後是 Raft 基礎層。這代表它開始碰分散式狀態複寫。講白了，這是從單機搜尋引擎，往可規劃的叢集服務走。這一步很硬。也很必要。\u003C\u002Fp>\u003Cul>\u003Cli>\u003Ccode>allowed_namespaces\u003C\u002Fcode> 可限制可見範圍\u003C\u002Fli>\u003Cli>物理隔離可把 namespace 分開存\u003C\u002Fli>\u003Cli>圖遍歷用 BFS 走連結節點\u003C\u002Fli>\u003Cli>Raft 為複寫和協調打底\u003C\u002Fli>\u003C\u002Ful>\u003Cp>這組功能放在一起，就很像一套準備上線的資料庫。壓縮省記憶體，調參穩延遲，PITR 防操作失誤，reranking 顧品質，Raft 顧叢集。每一項都不花俏，但都很實際。\u003C\u002Fp>\u003Cp>我會把這種更新看成一個訊號。FerresDB 不再只想證明自己能做向量搜尋。它想證明自己能在真實環境裡活下來。\u003C\u002Fp>\u003Ch2>這反映了 Rust 資料庫的現況\u003C\u002Fh2>\u003Cp>這次更新也說明一件事。Rust 在基礎設施領域，已經不是旁觀者。以前很多 Rust 資料庫專案，只強調速度。現在開始補觀測、備份、權限、還原和分散式協調。這才像真正的服務。\u003C\u002Fp>\u003Cp>向量搜尋的問題，也變了。現在不是「能不能算最近鄰」。而是「能不能在 10 倍流量下維持延遲」、「能不能在誤操作後救回來」、「能不能讓多租戶共存」。這些問題很土，但很真。\u003C\u002Fp>\u003Cp>我猜 FerresDB 下一步，重點會落在叢集操作。不是單純再加搜尋指標，而是看 Raft 複寫、namespace 隔離、rolling restart 能不能撐住。那才是資料庫的硬仗。\u003C\u002Fp>\u003Cp>如果你正在選 RAG 或語意搜尋的後端，這版 FerresDB 值得看。重點不是功能多。重點是這些功能，對不對得上你遲早會遇到的事故。\u003C\u002Fp>\u003Cp>如果你想追 Rust 和 AI 基礎設施，我會先看這種專案。它不只是在跑 benchmark。它在學怎麼當一個能被營運的服務。\u003C\u002Fp>\u003Ch2>結語：這版值得拿來做選型參考\u003C\u002Fh2>\u003Cp>我的判斷很直接。FerresDB 現在已經不是「可以玩玩看」的階段。它開始像一套能放進生產環境評估的 Rust 向量資料庫。當然，Raft 和多租戶還要經過更多實戰驗證，但方向是對的。\u003C\u002Fp>\u003Cp>如果你在評估向量資料庫，我會先問三件事：能不能救資料、能不能穩延遲、能不能支援多租戶。FerresDB 這次補的，剛好就是這三塊。接下來就看它能不能把這些功能磨到更穩。\u003C\u002Fp>","FerresDB 新增 PolarQuant、HNSW 自動調參、PITR、reranking 與 Raft 分散式儲存，開始像一套可上線的 Rust 向量資料庫。","dev.to","https:\u002F\u002Fdev.to\u002Frafael_ferres_0904f2af810\u002Fbuilding-a-production-grade-vector-database-in-rust-what-we-shipped-1hnb",null,"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1775168156597-iqqe.png",[13,14,15,16,17,18,19,20,21,22],"FerresDB","Rust","向量資料庫","HNSW","PolarQuant","PITR","reranking","Raft","RAG","語意搜尋","zh",0,false,"2026-04-02T22:15:41.697535+00:00","2026-04-02T22:15:41.481+00:00","done","8a1ec164-992a-4caf-a023-93dfa5cf3ea3","ferresdb-production-rust-vector-db-updates-zh","tools","791d8348-be8a-4a76-8a14-9a036e0a292c","published","2026-04-07T09:01:01.841+00:00",[36,38,40,42,44,45,46,48],{"name":14,"slug":37},"rust",{"name":18,"slug":39},"pitr",{"name":16,"slug":41},"hnsw",{"name":21,"slug":43},"rag",{"name":22,"slug":22},{"name":19,"slug":19},{"name":13,"slug":47},"ferresdb",{"name":20,"slug":49},"raft",{"id":32,"slug":51,"title":52,"language":53},"ferresdb-production-rust-vector-db-updates-en","What FerresDB Shipped for Production Rust Search","en",[55,61,67,73,79,85],{"id":56,"slug":57,"title":58,"cover_image":59,"image_url":59,"created_at":60,"category":31},"68e4be16-dc38-4524-a6ea-5ebe22a6c4fb","why-vidhub-huiyuan-hutong-bushi-quan-shebei-tongyong-zh","為什麼 VidHub 會員互通不是「買一次全設備通用」","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1778789450987-advz.png","2026-05-14T20:10:24.048988+00:00",{"id":62,"slug":63,"title":64,"cover_image":65,"image_url":65,"created_at":66,"category":31},"7a1e174f-746b-4e82-a0e3-b2475ab39747","why-buns-zig-to-rust-experiment-is-right-zh","為什麼 Bun 的 Zig-to-Rust 實驗是對的","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1778767879127-5dna.png","2026-05-14T14:10:26.886397+00:00",{"id":68,"slug":69,"title":70,"cover_image":71,"image_url":71,"created_at":72,"category":31},"e742fc73-5a65-4db3-ad17-88c99262ceb7","why-openai-api-pricing-is-product-strategy-zh","為什麼 OpenAI API 定價是產品策略，不是註腳","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1778749859485-chvz.png","2026-05-14T09:10:26.003818+00:00",{"id":74,"slug":75,"title":76,"cover_image":77,"image_url":77,"created_at":78,"category":31},"c757c5d8-eda9-45dc-9020-4b002f4d6237","why-claude-code-prompt-design-beats-ide-copilots-zh","為什麼 Claude Code 的提示設計贏過 IDE Copilot","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1778742645084-dao9.png","2026-05-14T07:10:29.371901+00:00",{"id":80,"slug":81,"title":82,"cover_image":83,"image_url":83,"created_at":84,"category":31},"4adef3ab-9f07-4970-91cf-77b8b581b348","why-databricks-model-serving-is-right-default-zh","為什麼 Databricks Model Serving 是生產推論的正確預設","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1778692245329-a2wt.png","2026-05-13T17:10:30.659153+00:00",{"id":86,"slug":87,"title":88,"cover_image":89,"image_url":89,"created_at":90,"category":31},"b3305057-451d-48e4-9fb9-69215f7effad","why-ibm-bob-right-kind-ai-coding-assistant-zh","為什麼 IBM 的 Bob 才是對的 AI 寫碼助手","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1778664653510-64hc.png","2026-05-13T09:30:21.881547+00:00",[92,97,102,107,112,117,122,127,132,137],{"id":93,"slug":94,"title":95,"created_at":96},"de769291-4574-4c46-a76d-772bd99e6ec9","googles-biggest-gemini-launches-in-2026-zh","Google 2026 最大 Gemini 盤點","2026-03-26T07:26:39.21072+00:00",{"id":98,"slug":99,"title":100,"created_at":101},"855cd52f-6fab-46cc-a7c1-42195e8a0de4","surepath-real-time-mcp-policy-controls-zh","SurePath 推出即時 MCP 政策控管","2026-03-26T07:57:40.77233+00:00",{"id":103,"slug":104,"title":105,"created_at":106},"9b19ab54-edef-4dbd-9ce4-a51e4bae4ebb","mcp-in-2026-the-ai-tool-layer-teams-use-zh","2026 年 MCP：團隊真的在用的 AI 工具層","2026-03-26T08:01:46.589694+00:00",{"id":108,"slug":109,"title":110,"created_at":111},"af9c46c3-7a28-410b-9f04-32b3de30a68c","prompting-in-2026-what-actually-works-zh","2026 提示工程，真正有用的是什麼","2026-03-26T08:08:12.453028+00:00",{"id":113,"slug":114,"title":115,"created_at":116},"05553086-6ed0-4758-81fd-6cab24b575e0","garry-tan-open-sources-claude-code-toolkit-zh","Garry Tan 開源 Claude Code 工具包","2026-03-26T08:26:20.068737+00:00",{"id":118,"slug":119,"title":120,"created_at":121},"042a73a2-18a2-433d-9e8f-9802b9559aac","github-ai-projects-to-watch-in-2026-zh","2026 必看 20 個 GitHub AI 專案","2026-03-26T08:28:09.619964+00:00",{"id":123,"slug":124,"title":125,"created_at":126},"a5f94120-ac0d-4483-9a8b-63590071ac6a","claude-code-vs-cursor-2026-zh","Claude Code 與 Cursor 深度對比：202…","2026-03-26T13:27:14.279193+00:00",{"id":128,"slug":129,"title":130,"created_at":131},"0975afa1-e0c7-4130-a20d-d890eaed995e","practical-github-guide-learning-ml-2026-zh","2026 機器學習入門 GitHub 實用指南","2026-03-27T01:16:49.712576+00:00",{"id":133,"slug":134,"title":135,"created_at":136},"bfdb467a-290f-4a80-b3a9-6f081afb6dff","aiml-2026-student-ai-ml-lab-repo-review-zh","AIML-2026：像課綱的學生實驗 Repo","2026-03-27T01:21:51.467798+00:00",{"id":138,"slug":139,"title":140,"created_at":141},"80cabc3e-09fc-4ff5-8f07-b8d68f5ae545","ai-trending-github-repos-and-research-feeds-zh","AI Trending：把 AI 資源收成一張表","2026-03-27T01:31:35.262183+00:00"]