[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-ferresdb-production-rust-vector-db-updates-zh":3,"article-related-ferresdb-production-rust-vector-db-updates-zh":30,"series-tools-af6bd5c1-b58a-4c4c-adff-9dd6a2bf7cbe":87},{"id":4,"slug":5,"title":6,"content":7,"summary":8,"source":9,"source_url":10,"author":11,"image_url":12,"cover_image":12,"category":13,"language":14,"translated_content":11,"related_article_id":15,"keywords":16,"key_takeaways":11,"views":27,"created_at":28,"published_at":29,"topic_cluster_id":11},"af6bd5c1-b58a-4c4c-adff-9dd6a2bf7cbe","ferresdb-production-rust-vector-db-updates-zh","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","tools","zh","791d8348-be8a-4a76-8a14-9a036e0a292c",[17,18,19,20,21,22,23,24,25,26],"FerresDB","Rust","向量資料庫","HNSW","PolarQuant","PITR","reranking","Raft","RAG","語意搜尋",4,"2026-04-02T22:15:41.697535+00:00","2026-04-02T22:15:41.481+00:00",{"tags":31,"relatedLang":46,"relatedPosts":50},[32,34,36,38,40,41,42,44],{"name":18,"slug":33},"rust",{"name":22,"slug":35},"pitr",{"name":20,"slug":37},"hnsw",{"name":25,"slug":39},"rag",{"name":26,"slug":26},{"name":23,"slug":23},{"name":17,"slug":43},"ferresdb",{"name":24,"slug":45},"raft",{"id":15,"slug":47,"title":48,"language":49},"ferresdb-production-rust-vector-db-updates-en","What FerresDB Shipped for Production Rust Search","en",[51,57,63,69,75,81],{"id":52,"slug":53,"title":54,"cover_image":55,"image_url":55,"created_at":56,"category":13},"d3ec03a8-a805-4a21-9826-72a74a72b625","databricks-model-serving-llm-deploy-guide-zh","Databricks Model Serving 讓 LLM 部署變簡單","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1780525998117-7ur8.png","2026-06-03T22:32:51.005996+00:00",{"id":58,"slug":59,"title":60,"cover_image":61,"image_url":61,"created_at":62,"category":13},"4dd225a8-bf6c-4768-a486-a27956c7033d","opencode-digitalocean-model-freedom-zh","OpenCode+DigitalOcean 讓你切換模型","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1780525116428-1q7g.png","2026-06-03T22:18:06.969758+00:00",{"id":64,"slug":65,"title":66,"cover_image":67,"image_url":67,"created_at":68,"category":13},"4bdcf208-fb80-484e-b4b6-06af035a6df1","modulate-aws-voice-chats-into-signals-zh","Modulate 用 AWS 把語音聊天做成訊號","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1780519733892-rxue.png","2026-06-03T20:48:22.697917+00:00",{"id":70,"slug":71,"title":72,"cover_image":73,"image_url":73,"created_at":74,"category":13},"f44a28d3-2305-43de-b5fa-21217d561054","amazon-rekognition-content-moderation-filter-zh","Amazon Rekognition把審核變成過濾器","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1780517005409-bxfc.png","2026-06-03T20:02:57.634353+00:00",{"id":76,"slug":77,"title":78,"cover_image":79,"image_url":79,"created_at":80,"category":13},"80f6f40b-3217-45e4-acff-7b2f6d261779","codex-workspace-limits-tell-you-why-zh","Codex 讓工作區限額錯誤說人話","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1780514293711-ltqa.png","2026-06-03T19:17:41.340056+00:00",{"id":82,"slug":83,"title":84,"cover_image":85,"image_url":85,"created_at":86,"category":13},"daa3d568-4bc5-4f29-aa64-225928ace9b4","book-2-turns-sneaker-drop-into-merch-zh","Book 2 把球鞋發售變成周邊系統","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1780513400116-8jeh.png","2026-06-03T19:02:49.03795+00:00",[88,93,98,103,108,113,118,123,128,133],{"id":89,"slug":90,"title":91,"created_at":92},"855cd52f-6fab-46cc-a7c1-42195e8a0de4","surepath-real-time-mcp-policy-controls-zh","SurePath 推出即時 MCP 政策控管","2026-03-26T07:57:40.77233+00:00",{"id":94,"slug":95,"title":96,"created_at":97},"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":99,"slug":100,"title":101,"created_at":102},"af9c46c3-7a28-410b-9f04-32b3de30a68c","prompting-in-2026-what-actually-works-zh","2026 提示工程，真正有用的是什麼","2026-03-26T08:08:12.453028+00:00",{"id":104,"slug":105,"title":106,"created_at":107},"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":109,"slug":110,"title":111,"created_at":112},"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":114,"slug":115,"title":116,"created_at":117},"a5f94120-ac0d-4483-9a8b-63590071ac6a","claude-code-vs-cursor-2026-zh","Claude Code 與 Cursor 深度對比：202…","2026-03-26T13:27:14.279193+00:00",{"id":119,"slug":120,"title":121,"created_at":122},"0975afa1-e0c7-4130-a20d-d890eaed995e","practical-github-guide-learning-ml-2026-zh","2026 機器學習入門 GitHub 實用指南","2026-03-27T01:16:49.712576+00:00",{"id":124,"slug":125,"title":126,"created_at":127},"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":129,"slug":130,"title":131,"created_at":132},"80cabc3e-09fc-4ff5-8f07-b8d68f5ae545","ai-trending-github-repos-and-research-feeds-zh","AI Trending：把 AI 資源收成一張表","2026-03-27T01:31:35.262183+00:00",{"id":134,"slug":135,"title":136,"created_at":137},"3ce6e6e2-bac5-463e-9f8d-45caabcc61f7","awesome-ai-for-science-research-tools-map-zh","AI 科研工具清單，開始像地圖了","2026-03-27T01:46:50.521945+00:00"]