결론 : Mongoose 는 현재 vector search 기능을 지원하지 않으므로 필자가 처한 프로젝트에 응용이 불가하므로 해당 포스트는 끝매듭이 안지어져 있습니다.
벡터 유사도 검색을 위해 기존에는 PineCone이라는 서비스를 이용했었는데
MongoDB Atlas 자체에서도 벡터 유사도 검색을 지원하는것같아 정리해보고자 한다.
MongoDB 에서는 아직 지원하진 않는듯?
출처 : https://www.mongodb.com/basics/semantic-search
시맨틱 검색을 논하기 전에 기존에는 전문검색(Full-text Search)가 있다.
전문검색은 텍스트의 일치성만을 체크하는 검색이다. 기본적으로 구현해본 학사관리 시스템에서 검색기능과
같다.
(전문 검색에서의 검색 예시)
검색 >> velog
결과는 다음과 같다
(전문 검색에서의 결과 예시)
결과 >> "velog", "velog is a blog for it...", ...(수많은 결과)... "velog.io/write?id=amdkl2n3njx.."
검색 대상에 "velog" 라는 단어가 직접적으로 언급되어야 전문검색이다.
여기서 좀더 의미론적 검색을 제공하려면 사전기반의 Normalization, 검색대상의 단어언급횟수에 따라 Score 를 계산하는 기법 (예를들어 RF/IDF) 같은 기법을 응용하여 의미론적 검색을 구현하였다.
그러나 위대한 박사님들께서 텍스트를 벡터공간에 임베딩하는 모델을 만드셨으니 (Word2Vec, FastText, BERT 등등) 이로써 진정한 의미론적 검색이 가능하게 되었다. 해당 모델들은 비슷한 맥락을 갖는 단어들을 벡터 공간상에 임베딩 하였을때 거리적으로 가깝게 위치하도록 만든 모델이다.

즉 텍스트가 다르더라도 의미적으로 유사하면 검색이 가능하다
예로는 검색 : 사과 >> 결과 : 사과, 배, 오렌지
즉 과일이라는 공통 분모를 찾는데 유용하다
검색 대상에 대하여 벡터값으로 변환하고, 검색어에 대해서 벡터값으로 변환하면 거리상 제일 가까운것부터 검색결과를 찾을수 있을것이다 이를 랭킹하여 출력하면 다음은 그 예시이다.
(의미론적 검색에서의 검색 예시)
검색 >> velog
결과는 다음과 같이 예상할 수 있다.
(의미론적 검색에서의 결과 예시)
결과 >> velog, "velog is a blog for it ...", ...(수많은 결과 = (n(tok_k)-4))... "blog", "t-story"
velog가 직접 언급된것도 노출되었지만 blog, t-story 처럼 유사한 기능을 수행하는 목록도 출력할 수 있을것이다. 물론 전문검색에서 Normalization을 잘 한다면 비슷한 결과를 얻을수도 있을것이다.
벡터값을 이용한 의미론적 검색의 아주아주 단순한 설명이었다.
다음 글에서 잘 정리되어 있으니 참고하면 좋다
여담이지만 이용자의 검색 횟수를 줄일수 있다면 생각보다 많은 트래픽 수 를 줄일수 있다.
이용자도 안답답해서 좋고 서버관리자로써 트래픽 부담도 덜어서 좋고 꿩먹고 알먹고 개이득이다.
MongoDB Atlas Cluster 에서 Vector Search를 진행하는 가이드는 다음을 확인하면 된다.
https://www.mongodb.com/docs/atlas/atlas-vector-search/vector-search-overview/
https://www.mongodb.com/docs/atlas/atlas-vector-search/tutorials/vector-search-tutorial/
찾아보니 Mongoose 에서는 아직 지원하지 않는다고한다 (..) 지금 프로젝트에선 Mongoose 의존도가 너무 커서 따로 정석적인 방법으로 별도로 동일 코드 내에 개발하는건 올바른 방법은 아닌듯?
원안대로 PineCone, Milvus를 쓰던지 Elasticsearch를 이용해야 할 것 같다...