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의 기본 검색 기능을 결합하여 검색 시나리오에 맞게 조정된 시스템을 만들었습니다.
이 시스템의 개요를 높이에서 살펴보겠습니다.

각 부분을 살펴보겠습니다.
이 시스템은 본질적으로 오프라인에서 설정 세부 정보를 수집하고 인덱싱하는 부분과 온라인에서 결과를 제공하는 두 가지 측면으로 나뉩니다. 첫 번째 부분은 Ingestion Service에서 구현됩니다. 이 서비스는 VS Code 자체와 확장 프로그램의 설정을 포함하는 풍부한 인덱스를 만드는 책임을 맡습니다. 쿼 응답 시간을 가능한 한 짧게 만들기 위해 설정 수집 중에 최대한 많은 작업을 수행하여 쿼 처리 시 수행할 작업을 줄입니다.
Bing Ingestion Service
VS Code 및 확장 프로그램 설정 데이터 수집
각 빌드 중에 VS Code는 구성을 JSON 파일에 쓰는 모드로 시작됩니다. 모든 구성 메타데이터를 정적으로 결정할 수 없기 때문에 실제로 VS Code를 시작해야 합니다. 이 파일에는 설정당 이름, 설명, 유형, 기본값 및 "enum" 유형 설정의 경우 유효한 값 목록과 해당 설명과 같은 몇 가지 정보가 포함됩니다. 그런 다음 Azure Storage에 파일을 업로드합니다. 궁금하시면 최근 예시를 여기서 확인할 수 있습니다.
https://ticino.blob.core.windows.net/configuration/123000832/c1cd4378.../configuration.json
123000832는 제품 버전과 이전 릴리스 이후 Git 커밋 수를 계산한 고유 빌드 번호입니다. c1cd4378...는 빌드가 빌드된 Git 커밋 ID입니다. 그리고 ticino는 몇몇 열성적인 팬분들은 기억하실 수 있겠지만, 저희의 원래 짧은 코드 이름이었습니다.
Bing의 Polling Service는 Azure Storage 컨테이너를 감시하고 새 빌드를 감지하면 Ingestion Service에 알립니다. 동시에 Bing은 VS Code 확장 프로그램 마켓플레이스를 지속적으로 크롤링하며 확장 프로그램 업데이트 및 새 확장 프로그램을 기다립니다. 확장 프로그램을 찾으면 package.json 파일을 다운로드합니다(확장 프로그램의 경우 모든 구성 메타데이터는 package.json에 포함되어 있습니다. 시작할 필요가 없습니다.). 그리고 해당 설정을 Ingestion Service에도 전달합니다.
이 전체 프로세스는 완전히 자동화되어 있으며 안정적인 릴리스 빌드 및 일일 Insiders 빌드 각각에 대해 인덱싱된 설정을 실시간으로 지속적으로 업데이트합니다. 빌드 완료 몇 분 내에 Bing의 인덱스는 새로 추가된 설정을 포함하도록 업데이트됩니다.
1. 대체 단어 파이프라인
사용자는 때때로 설정 이름 및 설명에 사용되는 단어와 다르지만 동등한 단어로 검색합니다. 이러한 경우를 처리할 수 있도록 Bing의 "대체 단어" 생성 파이프라인을 통합했습니다. 이 파이프라인은 사용자 행동, 클릭, 온라인 순위 및 페이지 유사성과 같은 신호를 사용하여 Bing의 검색 데이터에서 서로 유사한 의미를 가진 단어를 수집합니다. 예를 들어 "update"와 "upgrade"는 "대체 단어"로 설정되며, 하나를 검색하면 다른 하나를 포함하는 설정이 반환됩니다.
2. Stemmer 및 Speller 파이프라인
설정 이름의 오타에 대해 사용자에게 불이익을 주고 싶지 않았지만, 초기에는 단순한 퍼지 일치가 인간이 이해할 수 있는 영어 단어의 변형을 놓치거나 너무 많은 잘못된 일치 항목을 포함한다는 것을 알게 되었습니다. 따라서 Bing.com에서 사용되는 완전한 서비스에서 추출한 Speller 및 Stemmer 서비스를 포함하여 일반적인 오타 및 동일한 단어 줄기의 대체 형태를 포함하는 인덱스를 강화했습니다. 예를 들어 "formatted", "formatter", "format"은 모두 "formatting"이라는 단어를 사용하는 설정에 대해 인덱싱됩니다.
3. 자연어 처리(NLP) 파이프라인
또한 사용자가 자신만의 자연어로 쿼리를 설명할 수 있도록 Bing의 자연어 처리 파이프라인을 추가했습니다. 이 파이프라인은 일반적으로 사용되는 음성 및 텍스트 패턴을 수집하여 인덱스에 추가합니다. 예를 들어, "how to disable css validation"에서 "css.validate"를 찾기 위해 중요한 단어를 식별할 수 있습니다.
4. 피드백/순위 파이프라인
사용자 피드백을 통해 학습하고 개선할 수 있는 피드백 메커니즘을 만들었습니다. 이를 통해 새로운 단어 쌍을 수동으로 지정하거나 특정 쿼에 대한 예상 결과를 증폭할 수 있습니다. 피드백은 서비스에 업로드되며 거의 즉시 검색 결과에 반영됩니다.
Gating Module
모든 인덱스 수집은 게이트 모듈을 거치며, 이는 프로그래밍 오류로 인해 인덱스가 손상되지 않았는지 확인합니다. 다음을 확인하는 테스트 케이스를 작성했습니다.
- 새 인덱스는 이전 버전과의 호환성이 있으며 모든 VS Code 빌드를 지원합니다.
- 당사의 Golden 쿼 세트는 예상대로 결과를 반환합니다.
게이트 모듈 실패 시 인덱스 수집이 방지되고 팀에 즉시 알림이 전송됩니다. 파이프라인의 모든 단계의 상태를 모니터링할 수 있는 대시보드 서비스도 생성되었습니다. 경고 메커니즘과 마지막으로 알려진 좋은 상태로 롤백할 수 있는 기능이 있어 모든 문제를 최소한의 다운타임으로 신속하게 해결할 수 있습니다.
검색 서비스
마지막으로, 런타임 시 사용자 쿼리는 Azure Load Balancer 서비스에 도달하여 물리적 근접성 또는 현재 부하를 기준으로 쿼를 처리할 지리적으로 복제된 서버 중 하나를 선택합니다. 해당 위치에 호스팅된 검색 서비스는 인덱스에서 조회하여 관련 결과를 검색하고, 경우에 따라 수동 순위 재정의를 적용하여 VS Code 클라이언트에 반환합니다.
종합
이제 설정 쿼를 더 잘 이해하고 이전에는 아무런 결과도 반환하지 못했던 많은 쿼에 대한 결과를 제공하는 시스템을 갖추게 되었습니다.
몇 가지 예시입니다.



유사한 문제가 있고 Bing 팀이 우리를 위해 맞춤형 서비스를 구축했던 것처럼 검색 팀이 없다면, 여전히 좋은 소식이 있습니다. Bing의 Cognitive Services로 시작하여 자체 앱에 지능을 추가하는 데 도움이 될 수 있습니다. 예를 들어
테스트에 대한 참고 사항
이 시스템을 개발하는 동안 결과를 정량적으로 평가할 방법이 필요했습니다. 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