🚀 在 VS Code 中免費取得

VS Code 中由 Bing 驅動的設定搜尋

2018 年 4 月 25 日,作者:Rob Lourens @roblourens 和 Ankith Karat ankar@microsoft.com

您是否曾經在 VS Code 中找不到特定設定?您並不孤單。從常見的 GitHub issue、StackOverflow 問題、推文以及我們所做的使用者研究中,我們看到許多使用者在尋找設定時遇到問題。這並不令人意外,因為 VS Code 本身就包含超過 400 個設定,而安裝擴充功能後,許多使用者可能會有更多設定。如果您將典型的使用者錯誤(例如錯字)以及挑選正確搜尋詞的挑戰納入考量,使用者就會感到困難。

因此,幾個月前,我們開始與 Bing 團隊討論他們是否可以將其搜尋專業知識應用於我們的問題。而兩個月前,我們推出了成果 - 由 Bing 驅動的智慧型設定搜尋體驗。

之前

Before example

之後

After example

運作方式

經過一段時間的討論和原型設計,我們決定採用一種安排,其中 Bing 團隊將運行一個設定搜尋服務,該服務將為使用者在 VS Code 設定編輯器中搜尋的查詢提供智慧型模糊設定比對。

將 Bing 的自然語言搜尋功能整合到 VS Code 中被證明具有挑戰性。為了搜尋網路上的文件,Bing 會考慮數千個與頁面相似性、點擊資料、使用者行為資料等相關的訊號。但是,我們沒有針對我們的設定提供這種豐富的元數據 - 每個設定只有簡短的名稱和描述。因此,Bing 團隊結合了自訂服務和 Bing 的基本搜尋功能,建立了一個針對我們搜尋情境進行調整的系統。

以下是系統的高階概觀

Bing Diagram

讓我們看看每個部分。

這個系統基本上有兩個方面 - 離線收集和索引設定詳細資訊,以及線上提供結果。第一部分由 Ingestion Service 實作。它負責建立一個豐富的索引,其中包含來自 VS Code 本身和擴充功能的設定。由於我們希望查詢回應時間盡可能短,因此我們在擷取設定時會預先完成盡可能多的工作,以減少在處理查詢時必須執行的工作。

Bing Ingestion Service

收集 VS Code 和擴充功能設定資料

在每次建置期間,VS Code 都會在某種模式下啟動,在該模式下,它會將所有組態寫入 JSON 檔案。我們實際上必須啟動 VS Code,因為我們無法靜態地判斷所有組態元數據。該檔案包含每個設定的幾項資訊 - 名稱、描述、類型、預設值,以及對於「enum」類型設定,有效值的清單及其描述。然後,我們將檔案上傳到 Azure 儲存體。如果您感到好奇,可以在這裡看到最近的範例

https://ticino.blob.core.windows.net/configuration/123000832/c1cd4378.../configuration.json

123000832 是一個唯一的建置編號,從產品版本加上自上次發行以來的 Git 提交次數計算得出。c1cd4378... 是建置所依據的 Git 提交 ID。而 ticino,一些鐵桿粉絲可能還記得,是我們最初短暫使用的代號。

Bing 的 Polling Service 監看 Azure 儲存體容器,注意到新的建置,並通知 Ingestion Service。同時,Bing 不斷抓取 VS Code 擴充功能市集,等待擴充功能更新和新的擴充功能。當它找到一個時,它會下載其 package.json 檔案(對於擴充功能,所有組態元數據都包含在 package.json 中。無需啟動它。)並將這些設定也傳遞給 Ingestion Service。

整個過程是完全自動化的,並且會針對我們的每個穩定版本建置和每日 Insiders 建置即時更新索引設定。在建置完成後的幾分鐘內,Bing 的索引已更新為包含任何新加入的設定。

1. 替代字詞管線

使用者有時會使用與我們在設定名稱和描述中使用的字詞不同但等效的字詞進行搜尋。為了確保我們可以處理這些情況,我們整合了 Bing 的「替代字詞」產生管線。此管線使用使用者行為、點擊、線上排名和頁面相似性等訊號,從 Bing 的搜尋資料中收集彼此含義相似的字詞。例如,「update」和「upgrade」被設定為「替代字詞」,搜尋其中一個將會傳回包含另一個的設定。

2. Stemmer 和 Speller 管線

我們不想因為使用者拼錯設定名稱而懲罰使用者,但我們在早期發現,簡單的模糊比對要么會遺漏人類可以理解的英文單字的變體,要么會包含過多的誤判比對。因此,我們還包含了一個 Speller 和一個 Stemmer 服務,它們是從 Bing.com 上使用的完整服務中提取出來的,它們使用常見的拼寫錯誤和相同字詞詞幹的替代形式來豐富索引。例如,「formatted」、「formatter」、「format」- 所有這些都將針對使用「formatting」一詞的設定進行索引。

3. 自然語言處理 (NLP) 管線

我們也希望讓使用者能夠用他們自己的自然語言描述他們的查詢,因此我們加入了 Bing 的自然語言處理管線。該管線收集常用的語音和文字模式,並將它們添加到索引中。例如,它使系統能夠識別「how to disable css validation」中的重要字詞,以找到 "css.validate"

4. 意見反應/排名管線

我們建立了一個意見反應機制,讓我們可以從使用者意見反應中學習並改進。它允許我們手動指定新的字詞對,或提高某些查詢的預期結果。意見反應會上傳到服務,並幾乎立即反映在搜尋結果中。

Gating Module

每次擷取到索引都會通過 gating module,它只是確保索引沒有因為某些程式設計錯誤而損壞。我們編寫了測試案例來驗證以下內容

  • 新的索引向後相容,並為所有 VS Code 建置提供服務
  • 我們的 Golden 查詢集傳回預期的結果

gating module 中的失敗將阻止索引擷取並立即通知團隊。還建立了一個儀表板服務,使我們能夠監控管線所有階段的健康狀況。它具有警示機制和回滾到最後一個已知良好狀態的能力,以確保可以以最短的停機時間快速解決任何問題。

搜尋服務

最後,在運行時,來自我們使用者的查詢會觸及 Azure Load Balancer 服務,該服務根據其物理距離或目前負載,選擇我們的地理複寫伺服器之一來處理查詢。託管在該位置的搜尋服務會透過在索引中查找來檢索相關結果,在某些情況下會應用手動排名覆寫,然後將它們傳回 VS Code 用戶端。

整合所有內容

我們現在有一個系統,它可以更好地理解設定查詢,並為許多以前會傳回任何結果的查詢提供結果。

以下是一些範例

format on keypress

example - how to open new files on the left

beautify

如果您遇到類似的問題,並且沒有搜尋團隊為您建立像 Bing 團隊為我們所做的那樣的自訂服務,我們仍然有一些好消息。您可以開始使用 Bing 的認知服務,這將幫助您在自己的應用程式中加入一些智慧功能。例如

關於測試的注意事項

在開發此系統時,我們需要一種方法來定量評估結果。我們決定建立一個基於 Normalized Discounted Cumulative Gain 或 NDCG 概念的測試框架。在不深入細節的情況下,這是一種對搜尋引擎的結果進行評分的方法,給定一個查詢、一組結果以及這些結果的分數。我們手動編寫了相當多的測試案例,但意識到我們需要一種自動化的方法來為所有設定(包括將新增的新設定)以及擴充功能中的設定產生測試案例。因此,我們編寫了一個工具,可以自動為任何設定產生測試案例。它使用設定名稱和描述中的字詞,並透過不同的轉換器運行它們,這些轉換器模擬使用者選擇替代字詞、輸入錯字或使用自然語言模式進行搜尋。我們還為一些熱門擴充功能的設定產生了測試案例。

我們每 6 小時運行完整的測試套件,它可以自動更新自身,使其始終測試來自最新建置的設定。測試套件向我們保證系統正在正常運行,並讓我們有信心,當我們在後端進行變更時,我們不會損害結果品質。

下一步

我們有多種方法可以繼續改進系統。例如,我們還在根據使用者行為設定自動意見反應迴路。如果許多人搜尋相似的查詢,然後選擇相同的結果,我們就知道該結果可能是一個好的結果,應該排名更高。

目前,該服務僅索引英文,但我們希望索引翻譯後的設定描述,並支援以非英文語言進行搜尋。還有一些組態元數據目前未被索引,例如 "workbench.colorCustomizations" 設定的可能值。並且將搜尋進一步推進,我們希望顯示目前未安裝的擴充功能的結果。如果您搜尋 "debug python",並且沒有本地設定的強烈比對,那麼我們希望引導您找到可以幫助您偵錯 Python 程式碼的擴充功能。我們也考慮過此技術在 VS Code 中的其他應用。也許命令面板可以從類似的服務中受益。

我們需要您的意見反應

感謝 Bing 團隊的朋友,現在更容易找到設定了!使用者意見反應是我們改進結果的最佳方式,因此當您搜尋設定時,如果您沒有看到您期望的結果,請在 GitHub 上提交 issue。事實上,如果您正在使用 VS Code Insiders,您甚至會看到一個按鈕,它將調用我們新的 issue 回報器,以便您更輕鬆地提交包含我們需要的所有詳細資訊的 issue。

快樂編碼!

Rob Lourens,VS Code - @roblourens

Ankith Karat,Bing - ankar@microsoft.com