VS Code 中由 Bing 提供支援的設定搜尋
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 Storage。如果您好奇,可以在此處檢視最近的示例
https://ticino.blob.core.windows.net/configuration/123000832/c1cd4378.../configuration.json
123000832
是一個唯一的構建號,由產品版本加上自上次釋出以來的 Git 提交數計算得出。c1cd4378...
是構建所基於的 Git 提交 ID。而 ticino
,一些死忠粉絲可能還記得,是我們最初短暫使用的代號。
Bing 的輪詢服務監視 Azure Storage 容器,注意到新的構建,並通知攝取服務。與此同時,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