現已釋出!閱讀關於 11 月新增功能和修復的內容。

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

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

您是否曾經在 VS Code 中難以找到某個設定?您不是一個人。縱觀常見的 GitHub 問題、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 攝取服務

收集 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 客戶端。

整合所有功能

我們現在擁有一個系統,它能更好地理解設定查詢,併為許多以前會返回空白結果的查詢提供結果。

這裡有一些例子

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 上提交問題。實際上,如果您正在使用 VS Code Insiders,您甚至會看到一個按鈕,可以呼叫我們新的問題報告器,讓您更輕鬆地提交包含我們所需所有詳細資訊的問題。

編碼愉快!

Rob Lourens,VS Code - @roblourens

Ankith Karat,Bing - ankar@microsoft.com

© . This site is unofficial and not affiliated with Microsoft.