상세 컨텐츠

본문 제목

[Serendi] 검색 엔진(추천시스템) 만들기

알고리즘, 백엔드/Serendi

by grizzly 2025. 7. 27. 09:53

본문

친구와 만들던 프로젝트 기능 중에 한 가지에 대해서 문제가 생겼다.

바로 검색 기능이다.

 

기획의 요구 사항

  • 검색을 통하여 플레이리스트, 유저, 노래에 대해서 결과를 얻을 수 있어야 한다.
  • 플레이리스트에서 유지 중인 제목과 해시 태그가 검색 결과에 영향을 주어야 한다.
  • 검색 이후 관련성, 추천수, 좋아요 순 등의 정렬이 가능해야한다.

Elastic Search에서도 관련도 검색 등을 내부 로직의 score와 가중치를 통하여 구현이 가능하다.

근데 이런 의문이 생겼다.

 

나의 사용자 경험을 생각해 볼 때 플레이리스트에 처음 접근 시 노래가 어떤 노래가 있는지를 아냐? 라고 했을 때 모른다.

그러면 어떤 것을 기준으로 접근하냐? 라고 한다면, 썸네일과 플레이리스트의 제목이 될 것이다.

 

우리의 서비스에서 아직까지 썸네일 업로드 기능은 있으나 검색에 영향을 주게 하지는 않을 것이므로 고려 사항은 제목이다.

 

그럼 어떤 제목일 때 누르고 싶은가? 했을 때

나는 좀 더 시적인 표현 혹은 소설이나 감성 돋는 글귀를 썼을 때 누르고 싶다.

 

사랑 노래 플리 보단

ex) 사랑은 계절 같은 거야 playlist, 지나간 것들에 대하여 plyalist, 어떤 사랑은 끝이 나야 사랑임을 안다. Playlist, 우린 너무 멀리 와버렸다ㅏㅏㅏㅏㅏㅏ~ playlist (형빈플레이리스트의 제목들)

 

그럼 만약,

검색어에 여자친구와 데이트할 때 듣기 좋은 무드 있는 알앤비 등의 검색어를 입력 했을 때 저런 플리들이 잡힐 수 있을까?

 

기존의 벡터 유사도 검색에서는 의미적 맥락을 분석하기 보단 정말 단어 개별 하나하나가 얼마나 포함되었는 가가 중요하기 때문에 이 부분들이 잡히지 않는다. 무드 있는 알앤비와 감성 힙합 사이의 의미적 유사도를 잡는 방법이 무엇이 있을까 정말 많이 고민해봤다. (머리 터질 거 같다)

 

한 번 생각해보면, 지금 건드릴 수 있는 부분은 score를 어떻게 측정할 것이냐, 유사도 분석을 어떻게 할 것이냐, 벡터 임베딩을 할 때 검색어, 제목, 태그 등을 어떤 식으로 넣을 것인가 이렇게 이다.

그 와중에 벡터 임베딩에 생각이 들었다.

llm과 같은 거대한 모델에 인코더 부와 디코더 부가 있다. 이때 text to text라고 한다면, 디코더는 언어 생성을 담당하고 인코더는 언어 입력을 담당할 것이다. 내가 생각하는 검색 엔진은 내부를 모르니 제외 시킨다고 가정할 때, 컴퓨터가 맥락을 가장 잘 파악하는 것은 llm 이었다. 그러면 Llm의 무언가를 사용할 수 있지 않을까 하는 생각이다.

llm의 인코더만 떼서 생각을 해보면 입력이 들어오면 디코더로 넘기기 전에 벡터 임베딩을 하여 넘긴다. 그렇다면 해당 벡터 임베딩에는 llm이 이해하고 있는 우리 사회에 대한 이해와 보편적 지식 그리고 입력 데이터가 들어가 있다. 즉, llm이 이해하고 있는 범위 내의 의미가 들어가 있다.

 

그럼 이것을 어떻게 할까 생각해보면,

플레이리스트 생성 시, 플레이리스트의 제목과 태그를 llm 인코더에 넣어 벡터 임베딩 값을 얻는다.

검색 시, 검색어를 llm인코더에 넣어 벡터 임베딩 값을 얻는다.

이 두 값을 유사도 분석을 한다면, 단순히 단어의 형태가 유사한 것을 찾는 것보다 높은 확률로 의미적인 유사함을 찾는 것이 가능하지 않을까 하는 것이다. -> 해 본 결과 아예 의미가 없진 않다. 결과는 나중에 정리해서 올릴 예정이다. 기존의 단순히 벡터 유사도 비교를 하는 것보다 못 잡던 것들을 잡고는 있다. 하지만, 잡으면 안되는 부분까지 잡는 문제가 있다.

 

그렇다면 llm인코더의 성능을 올릴 방법은 무엇이 있을까?

파인튜닝으로 Llm을 건드린다는 건 배보다 배꼽이 더 크지 않을까, 그러면서 든 생각이 RAG와 프롬프트, 그리고 전처리이다.

 

RAG를 통해서 유튜브 검색어 -> 유튜브 제목, 태그 로 된 데이터 셋을 만든 이후 RAG를 통하여 해당 데이터를 읽고 벡터 임베딩을 시킨다면, 플리 제목을 만드는 도메인의 지식이 올라갈 까 하는 생각이다.

프롬프트 또한 우리의 서비스를 인식시킬 수 있지 않을까 하는 생각이고 마지막이 전처리이다.

 

기획의 요구 사항 중 하나는 태그는 직접적인 검색 대상이 아닌 제목 검색 속에서 일종의 가중치의 역할만을 하는 것이다. 따라서 전체적인 문장의 맥락 파악에 도움을 줄 수 있는 사항이 아닌가 하는 의미가 있다. 그리하여 이것을 제목과 합쳐서 벡터 임베딩화를 시킬 지, 아니면 어떤 맥락 속에서 단어 자체를 변경 한 후 우리의 내부에서 유지할 몇몇의 카테고리를 만든 후 거기에 어느정도의 영향을 미치는 지의 스코어 정도의 역할을 할 지 생각중이다. -> 이 부분도 만약 자세하게 파고 든다면, #안 #녕 #하 #세 #요 #첫 #작 #품 이런 식의 하나하나의 태그가 의미가 없고 합쳤을 때 의미가 생긴다면 우리의 검색 서비스에 어떻게 영향을 미칠 것이고 어떤 식의 제한이 들어가야 할 지 세부적인 정책을 정해야 할 것이다.

관련글 더보기