Language Server를 이용한 문서 인덱싱


요약

Language Server Protocol(LSP)은 이미 대부분의 편집기와 통합되어 있기 때문에 이걸 써서 문서 관리 툴을 제작하면 기존에 사용하던 문서 편집기를 변경하지 않고도 새로운 기능을 추가하는 것이 가능하다. 이 글에서는 간단한 문서 색인 생성을 LSP을 이용해 구현해보려고 한다.

Language Server Protocol?

MS에서 만든 공개 프로토콜인데 에디터에서 필요로 하는 기능을 프로토콜로 정의하고, 언어 제공자가 이것만 구현하면 VSCode나 Neovim 등 여러 편집기에 착 달라붙을 수 있도록 해놔서 사실상 표준처럼 되었다. 대부분의 프로그래밍 언어가 Language Server를 제공하고 대부분의 에디터가 플러그인이든 뭐든 LSP를 지원한다.

노트

개인적으로 여러가지 standalone 노트 관리 툴들을 이용해 보고 나니, 내가 필요로 하는 기능은 다음과 같았다.

  • git을 이용한 버전 관리가 가능해야 한다.
  • vim keybinding을 지원해야 한다.
  • 전체 fulltext search가 가능해야 한다.
  • markdown 문법을 지원해야 한다.

결국 전체 노트를 하나의 markdown 문서에 때려박고, private git repository에 보관하고, neovim으로 편집하게 되었다. 대충 이런 형식이다.

## 노트제목 1

잡담

---

## 노트제목 2

다른 잡담. 링크(#노트제목-1)

색인

대충 이런 식으로 관리하기 시작하니까 문서가 슬슬 붙기 시작하는데, 대충 100개쯤 작성하니까 슬슬 애착이 붙어서 추가기능을 붙이고 싶어졌다. 그중에서도 예전 글에서 하던 문서 인덱싱이 그냥… 하고싶었다.

진행상황

일단 python 스크립트로 문서를 여러개의 노트로 쪼개고 각 노트의 embedding을 계산해 sqlite에 넣은 다음에, 그걸 다시 꺼내서 faiss에 넣고 similarity 계산하는 부분까지는 해 봤다. 이제 이걸 language server로 구현하기만 하면 되는데…