Bing 支援的 VS Code 設定搜尋
2018 年 4 月 25 日,作者:Rob Lourens @roblourens 和 Ankith Karat ankar@microsoft.com
您是否曾經在 VS Code 中找不到特定設定?您並不孤單。綜觀常見的 GitHub 問題、StackOverflow 問題、推文以及我們進行的使用者研究,我們發現許多使用者在尋找設定時遇到困難。這並不令人意外,因為 VS Code 開箱即用就包含超過 400 個設定,而且安裝擴充功能後,許多使用者可能會擁有更多設定。如果將典型的使用者錯誤(例如錯字)以及挑選正確搜尋詞彙的挑戰納入考量,使用者會感到困難重重。
因此,幾個月前,我們開始與 Bing 團隊討論他們是否可以將其搜尋專業知識應用於我們的問題。而兩個月前,我們推出了成果 - 由 Bing 支援的智慧設定搜尋體驗。
之前

之後

運作方式
經過一段時間的討論和原型設計,我們決定採用一種安排,Bing 團隊將運行設定搜尋服務,為使用者在 VS Code 設定編輯器中搜尋的查詢提供智慧模糊設定比對。
將 Bing 的自然語言搜尋功能整合到 VS Code 中證明具有挑戰性。為了搜尋網路上的文件,Bing 會考量數千個與頁面相似度、點擊資料、使用者行為資料等相關的訊號。但我們沒有適用於設定的這類豐富中繼資料,只有每個設定的簡短名稱和描述。因此,Bing 團隊結合了自訂服務和 Bing 的基本搜尋功能,建立了一個針對我們搜尋情境進行調整的系統。
以下是系統的高階概觀
讓我們來看看每個部分。
這個系統基本上有兩個方面 - 離線收集和索引設定詳細資訊,以及線上提供結果。第一部分由擷取服務實作。它負責建立豐富的索引,其中包含來自 VS Code 本身和擴充功能的設定。由於我們希望查詢回應時間盡可能短,因此我們在擷取設定時會預先完成盡可能多的工作,以減少處理查詢時必須執行的工作。
Bing 擷取服務
收集 VS Code 和擴充功能設定資料
在每次建置期間,VS Code 都會在將其所有組態寫入 JSON 檔案的模式下啟動。我們實際上必須啟動 VS Code,因為我們無法靜態地判斷所有組態中繼資料。該檔案包含每個設定的幾項資訊 - 名稱、描述、類型、預設值,以及「列舉」類型設定的有效值列表及其描述。然後,我們將檔案上傳到 Azure 儲存體。如果您好奇,可以在這裡查看最近的範例
https://ticino.blob.core.windows.net/configuration/123000832/c1cd4378.../configuration.json
123000832
是唯一的建置編號,由產品版本加上自上次發行以來 Git 提交的次數計算得出。c1cd4378...
是建置所依據的 Git 提交 ID。而 ticino
,一些鐵桿粉絲可能還記得,是我們最初短暫的代號。
Bing 的輪詢服務會監看 Azure 儲存體容器,注意到新的建置,並通知擷取服務。同時,Bing 不斷地檢索 VS Code 擴充功能市集,等待擴充功能更新和新的擴充功能。當它找到一個時,它會下載其 package.json
檔案(對於擴充功能,所有組態中繼資料都包含在 package.json
中。無需啟動它。)並將這些設定也傳遞給擷取服務。
整個過程完全自動化,並針對我們的每個穩定發行版本和每日 Insiders 建置即時更新索引設定。在建置完成後的幾分鐘內,Bing 的索引已更新,以包含任何新加入的設定。
1. 替代詞語管線
使用者有時會使用與我們在設定名稱和描述中使用的詞語不同但等效的詞語進行搜尋。為了確保我們可以處理這些情況,我們整合了 Bing 的「替代詞語」產生管線。此管線使用使用者行為、點擊、線上排名和頁面相似度等訊號,從 Bing 的搜尋資料中收集彼此含義相似的詞語。例如,「update」和「upgrade」被設定為「替代詞語」,搜尋其中一個將傳回包含另一個詞語的設定。
2. 詞幹分析器和拼字檢查器管線
我們不想因為使用者拼錯設定的名稱而懲罰使用者,但我們在早期發現,簡單的模糊比對要么會錯過人類可以理解的英語單字的變體,要么會包含過多的誤判比對。因此,我們還加入了從 Bing.com 上使用的完整服務中提取的拼字檢查器和詞幹分析器服務,這些服務使用常見的拼字錯誤和相同詞幹的替代形式來豐富索引。例如,「formatted」、「formatter」、「format」 - 所有這些都將為使用「formatting」一詞的設定建立索引。
3. 自然語言處理 (NLP) 管線
我們也希望使用者能夠以自己的自然語言描述其查詢,因此我們加入了 Bing 的自然語言處理管線。該管線收集常用的語音和文字模式,並將其加入索引中。例如,它使系統能夠識別「如何停用 css 驗證」中的重要詞語,以找到 "css.validate"
。
4. 意見反應/排名管線
我們建立了一個意見反應機制,讓我們可以從使用者意見反應中學習並改進。它讓我們可以手動指定新的詞語配對,或提高某些查詢的預期結果。意見反應會上傳到服務,並幾乎立即反映在搜尋結果中。
閘道模組
每次擷取到索引都必須經過閘道模組,該模組僅確保索引沒有因某些程式設計錯誤而損壞。我們編寫了測試案例來驗證以下內容
- 新索引向後相容,並為所有 VS Code 建置提供服務
- 我們的黃金查詢集傳回預期的結果
閘道模組中的失敗將阻止索引擷取,並立即通知團隊。還建立了一個儀表板服務,讓我們可以監控管線所有階段的健康狀況。它具有警示機制和回滾到上次已知良好狀態的能力,以確保可以快速解決任何問題,並將停機時間降至最低。
搜尋服務
最後,在執行階段,來自使用者的查詢會命中 Azure 負載平衡器 服務,該服務會根據其物理距離或目前負載,選擇我們的異地抄寫伺服器之一來處理查詢。託管在該位置的搜尋服務會透過在索引中查找來擷取相關結果,在某些情況下套用手動排名覆寫,並將其傳回 VS Code 用戶端。
整合所有內容
現在,我們擁有一個系統,可以更好地理解設定查詢,並為許多以前會傳回任何結果的查詢提供結果。
以下是一些範例
如果您遇到類似的問題,並且沒有像 Bing 團隊為我們所做的那樣建立自訂服務的搜尋團隊,我們仍然有一些好消息。您可以開始使用 Bing 認知服務,這將幫助您在自己的應用程式中加入一些智慧功能。例如
關於測試的注意事項
在開發此系統時,我們需要一種方法來定量評估結果。我們決定建立一個基於 標準化折損累積增益或 NDCG 概念的測試框架。在不深入探討細節的情況下,這是一種評分搜尋引擎結果的方法,給定一個查詢、一組結果以及這些結果的分數。我們手動編寫了相當多的測試案例,但意識到我們需要一種自動化的方法來為所有設定(包括新增的設定和擴充功能中的設定)產生測試案例。因此,我們編寫了一個工具,可以自動為任何設定產生測試案例。它使用設定名稱和描述中的詞語,並透過不同的轉換器運行它們,這些轉換器模擬使用者選擇替代詞語、拼寫錯誤或使用自然語言模式進行搜尋。我們還為一些熱門擴充功能的設定產生了測試案例。
我們每 6 小時運行完整的測試套件,它可以自動更新自身,以便始終測試最新建置中的設定。測試套件確保系統正常運行,並讓我們確信,當我們在後端進行變更時,我們不會損害結果品質。
下一步
我們有幾種方法可以繼續改進系統。例如,我們也正在根據使用者行為設定自動意見反應迴路。如果許多人搜尋類似的查詢,然後選擇相同的結果,我們就知道該結果可能是一個好的結果,應該排名更高。
目前,該服務僅索引英文,但我們希望索引翻譯後的設定描述,並支援以非英文語言進行搜尋。還有一些組態中繼資料目前未建立索引,例如 "workbench.colorCustomizations"
設定的可能值。如果將搜尋更進一步,我們希望顯示目前未安裝的擴充功能的結果。如果您搜尋 "debug python"
,並且沒有與本機設定強烈比對的結果,那麼我們希望引導您找到可以幫助您偵錯 Python 程式碼的擴充功能。我們也考慮過這項技術在 VS Code 中的其他應用。也許命令面板可以從類似的服務中受益。
我們需要您的意見反應
感謝 Bing 團隊的朋友,現在更容易找到設定了!使用者意見反應是我們改進結果的最佳方式,因此當您搜尋設定時,如果您沒有看到您期望的結果,請在 GitHub 上提交問題。事實上,如果您正在使用 VS Code Insiders,您甚至會看到一個按鈕,該按鈕將調用我們新的問題報告器,讓您更輕鬆地提交包含我們所需所有詳細資訊的問題。
祝您編碼愉快!
Rob Lourens,VS Code - @roblourens
Ankith Karat,Bing - ankar@microsoft.com