Qdrant를 이용하여 유사 신발 검색 기능 구현
펄핏 재직 중 작성한 경험 기록
왜 구현했는가?
고객사로부터 사이즈 추천 대상 신발 목록을 받으면 필요에 따라 신발에 대한 분석이 필요하다. 이 과정은 물리적인 시간과 비용이 들어간다.
따라서 기 분석된 동일 모델 또는 같은 신발 솔로 이루어진 모델이라면 동일한 착화감을 가질 것으로 판단, 불필요한 비용을 줄이기 위해 신규 대상이 이전에 분석된 내용과 일치하는지 확인이 필요하다.
기존에는 해당 담당자가 엑셀로 이 기록을 관리했다. 시간이 지날수록 분석된 신발의 수도 많아지고 고객사도 증가하면서 점점 비효율적인 업무가 되어가고 있었다.
따라서 고객사로부터 인입된 신발 이미지를 기반으로 이전에 분석된 신발 이미지와 비교하여 검색할 수 있다면 낭비되는 리소스를 줄일 수 있을거라 판단했다.
어떻게 구현했는가?
기존 DB에 저장된 신발 정보들을 기반으로 신발 이미지 검색 기능 구현 절차는 아래와 같다.
- 기존의 신발 이미지들과 앞으로 인입될 신발 이미지들이 같은 구도로 찍힌다는 보장이 없기에 신발 솔이 나오는 신발 옆면 사진으로만 한정한다. 이때 이미지가 신발 옆면인지 아닌지를 판단하는 방법은 Teachable Machine을 통해 판별 모델을 만들어서 사용한다.
- 이미지의 색상이나 크기에 대한 오차를 줄이기 위해 이미지는 흑백 처리를 하고 크기를 통일한다.
- imgbeddings 라이브러리를 이용해 기존 신발 이미지들을 vector화 한다.
- vector 정보와 해당 신발의 정보를 Qdrant에 저장한다.
- 새롭게 인입된 신발 사진을 기반으로 비교검색할때는, 새로운 신발 이미지를 vector화 하여 코사인 유사도 비교를 통해 이미지 유사도가 높은 순서대로 기존 신발 정보를 확인할 수 있다.
벡터 검색? 코사인 유사도 비교?
벡터 검색(Vector Search)은 데이터를 고차원 벡터로 변환한 후, 유사한 벡터를 빠르게 찾는 검색 방식이다. 관련 설명 중에는 이 영상이 가장 간단한 것 같다.
Qdrant는 4가지의 비교방식을 제공한다.
- Dot product
- Cosine similarity
- Euclidean distance
- Manhattan distance
각 방식의 특징이 있으며, 이미지 검색에는 일반적으로 Euclidean distance가 괜찮다고 한다. 하지만 자체적으로 비교해본 결과 이 서비스에는 Cosine similarity 방식이 조금 더 의도하는 검색 결과가 나오는 듯하여 Cosine similarity를 선택했다.
왜 Qdrant를 선택?
벡터 데이터베이스 선택 비교 가이드(2023)에서 다양한 vector db를 비교했었는데, 이 중 비용 문제 없이 빠르게 접근해 볼 수 있는 것에 초점을 맞췄다. Qdrant Cloud에서 free tier를 지원하여 setup에 큰 리소스 투입 없이도 빠르게 도입해 볼 수 있었고 필요시 instance 확장도 용이하다. 또한 document가 잘 정리되어 있었고, 오픈 소스로서 지속적으로 기능이 추가되고 발전되는 것이 보였다.
결과
약 6만건의 기존 신발 정보를 Vector화하여 Qdrant에 저장했고, 신발 비교 정확도는 자체적으로 판단했을때 약 80%의 이미지 검색 정확도를 보였다. 관련 LinkedIn 포스팅