DRVS

Dynamic Revealing Vector Search

多數搜尋
把頁面換掉。
這一套把它顯影出來。

你的清單留在原處,維持原本的順序。查詢只改變每一列的可見程度 —— 強命中維持明亮,弱的逐階變暗,未命中淡成殘影。沒有任何東西被搬走、重新排序或移除。結果頁會丟掉的脈絡,在這裡被保留下來。

  • MIT授權
  • 0執行期相依套件
  • 0需要的伺服器
  • 154項測試,未用測試框架

用真實索引試一次

九篇關於極其日常事物的文件 —— 咖啡、陽台番茄、自行車鏈條 —— 刻意與 DRVS 的來源專案毫無關聯。這是真正的套件在你的瀏覽器裡、對著真正預先建好的索引執行。不是示意圖,也不是錄影。

試試
  1. avocado-ripeness 如何挑選成熟酪梨 酪梨成熟度不足時果肉硬澀,過熟則容易出現黑色纖維與苦味,兩者都會毀掉一道酪梨料理。判斷成熟度最可靠的方式不是看外皮顏色,而是用手指輕壓果蒂周圍。
  2. balcony-tomato-basics 陽台番茄種植入門 在陽台種番茄,最常見的失敗原因不是品種選錯,而是日照與盆器太小。番茄是喜光作物,每天至少需要六小時直射陽光才會開花結果,若陽台日照不足,再怎麼施肥也很難有收成。
  3. balcony-tomato-pests 陽台番茄常見病蟲害處理 陽台種植的番茄雖然遠離田間大規模病源,但通風不良加上盆器密集擺放,還是容易出現幾種固定的病蟲害。多數問題如果在初期就發現,用非化學方式就能控制,不必等到全株枯萎才處理。
  4. bike-chain-maintenance 自行車鏈條保養與更換時機 鏈條是自行車傳動系統中耗損最快,也最容易被忽略保養的零件。一條保養得宜的鏈條可以用上數千公里,疏於保養的鏈條可能不到一半里程就開始拉長變形,甚至連帶磨耗昂貴的飛輪與大盤。
  5. cat-nail-trimming 貓咪指甲修剪注意事項 貓咪指甲太長容易勾到布料或家具受傷,也可能在抓癢時不小心抓傷人,定期修剪是居家照護的基本功課。但貓咪指甲構造和狗不太一樣,剪錯位置很容易流血,讓貓對修剪這件事留下不好的印象。
  6. coffee-bean-storage 手沖咖啡豆保存方法 咖啡豆從烘焙完成那一刻起就開始緩慢氧化,保存方式對後續沖煮風味的影響,往往比買到的豆子本身品質差異還要大。多數人喝到咖啡走味,問題其實出在保存,而不是豆子不新鮮。
  7. dadaocheng-half-day 台北大稻埕半日遊路線 大稻埕是台北少數還保留完整老街紋理的區域,適合安排一個不趕行程的半日散步,把重點放在建築與街區氛圍,而不是密集跑景點。
  8. dehumidifier-maintenance 家用除濕機保養指南 除濕機用了一整個潮濕季節後,除濕效率明顯下降,多半不是壓縮機出問題,而是濾網與水箱長期沒清潔。定期保養其實只需要十分鐘,卻能大幅延長機器壽命。
  9. pourover-temp-grind 手沖咖啡水溫與研磨度關係 同一款豆子,換一個水溫或磨得粗細不同,喝起來可能像兩種完全不同的咖啡。水溫與研磨度不是各自獨立調整的變數,而是必須互相搭配,才能沖出穩定的風味。

這份語料庫另有英文版,文件 id 與關聯完全對應。兩邊以相同方式建置與測試 —— 「不綁定特定書寫系統」這句話,就是靠這個對照去驗證,而不是用講的。

可校準的信心度

四個分級,以及一條看得見的底線

攝影師用階段尺檢查曝光 —— 一條密度已知、等距遞減的色階條。DRVS 的排序是同一回事:每筆結果落在固定的一階上,而那一階就是你實際看到的透明度。這些是 config/search.config.json 裡的真實數值,不是示意。

A1.00

精確。查詢字串確實出現在標題、章節標題或已確認的別名裡。

B0.92

接近。詞彙重疊度高,或精確命中落在較次要的欄位。

C0.62

薄弱。字元層級或向量的相似,沒有任何字面上的錨點。

D0.38

疏遠。多半是結構性的 —— 某個真正命中結果的同系列文件。

0.12

遮蔽。仍在頁面上、仍可閱讀,只是退到一旁。

分級從不單靠顏色傳達。每一列同時獲得一個透明度階級以及一段指名理由的文字標籤,另外還有給輔助科技用的 data-drvs-tier。在強制色彩模式下透明度階梯會被抹平,這時就由標籤獨自承擔。

五個通道,一個誠實的答案

命中理由必須指名它究竟比對到什麼

不是一個相關度分數,也不是「模型覺得像」。每一筆結果都帶著一個你可以自行查證的具體主張 —— 而當某個通道對某份文件無話可說時,它就保持沉默,而不是憑空生出一個數字。

精確

對標題、章節標題、摘要、關鍵詞做子字串比對。永遠排在以下所有通道之前。

標題精確命中

詞彙

中日韓字元二元組加上拉丁字詞重疊,所以錯字與換句話說仍能命中。不需要詞幹還原,也不需要語言設定。

詞彙相似命中

詞典

別名展開,且每一筆都能指出證據 —— 一份人工策展的別名集,或文件在自己標題裡自行定義的縮寫。

命中已確認別名「酪梨」

關聯

沒有直接命中的文件,可以透過一條策展過的連結、搭上真正命中者的順風車 —— 而且它會照實說明,不會假裝自己命中了。

與直接結果屬於同系列

語義

在瀏覽器裡即時計算向量,與預先建好的向量比對。不需要 API,沒有每次查詢的成本。做到段落層級,所以它能指名是哪一段。

段落語義近似(保存)

…以及失效的時候

每個選用通道都以結構性的方式降級。沒有詞典、沒有向量、模型載入失敗 —— 其餘部分照常運作,而且上游完全不會察覺。

精確與詞彙仍照常排序

多數搜尋介面做錯的地方

可以沒有高信心結果,但不能不說

DRVS 的做法

當沒有任何結果通過信心門檻時,它會放寬門檻、仍然回傳最接近的文件,並且明白告訴你它這麼做了:「沒有找到高可信度直接結果。以下僅列出語義上最接近的文件。」你看得到結果,也看得到但書。

它拒絕做的事

把弱命中打扮成有把握的結果。放寬門檻一律揭露,低信心提示絕不隱藏,而一份確實空無一物的索引會照實說明,不會硬湊清單。非歸零不等於可以編造。

開始使用

把它接到你已經有的清單上

1 建立索引

Python,建置期執行。輔助函式處理檔案層級的雜事 —— frontmatter、章節標題、摘要、關鍵詞 —— 所以你的 adapter 大多只是接線。

# your adapter walks your corpus and assigns ids
from build.extract import extract_document, compact_document

docs = [extract_document(doc_id, title, url, text)
        for doc_id, title, url, text in my_corpus()]

index = {"count": len(docs),
         "documents": [compact_document(d) for d in docs]}

2 掛上顯影層

控制項的 markup 會替你建好。你的列除了多幾個 class 與 data 屬性之外,不會被動到。

import { createRevealUI, STRINGS_EN } from "drvs/ui";

createRevealUI({
  root: "#search",
  rowSelector: "[data-doc-id]",
  indexUrl: "/drvs/index.json",
  strings: STRINGS_EN,
});

3 換上你的樣式

覆寫自訂屬性即可。你不應該需要 fork 這份樣式表。

:root {
  --drvs-accent: #e8743b;
  --drvs-tier-c-opacity: .62;
}

仍然得由你自己實作的部分

把你實際的檔案轉成文件記錄的那個 adapter —— 走訪你的儲存空間、指派穩定 id、對應網址。DRVS 刻意不對「語料庫由什麼構成」抱持任何預設,因為這正是任何通用套件都無法誠實代勞的一環。

還有詞典裡該放什麼。產生器會從自我定義式標題提出候選,但編造出來的別名是這套系統所能造成最大的傷害:它會讓毫不相干的文件看起來像已確認的命中,而且掛在介面上最具權威的那個標籤底下。出貨前請先讀過 audit_candidates() 的輸出。