검색 기능을 만들었습니다.
이제 매일 쓸 수 있는 서비스로 만들려면 무엇이 더 필요할까요?
광고에 쓰이는 이미지와 영상을 찾는 검색 기능을 실제 서비스로 옮기면서 마주한 질문입니다. 배포를 준비하며 가장 먼저 살펴본 건 데이터 규모였는데요. 실제 서비스에서는 실험 때보다 약 200배 많은 데이터를 다뤄야 했습니다. 주기적으로 새 데이터도 쌓이고 있어, 이미 수집한 데이터를 처리하면서 앞으로 늘어날 양까지 고려해야 했습니다.
검색에 반영할 조건도 많아졌습니다. 이미지의 가로, 세로 비율이나 영상 길이뿐 아니라, 어느 국가에서 언제 게재된 광고인지, 현재도 광고가 활성화되어 있는지까지 확인해야 했습니다. 데이터의 양과 검색 조건이 모두 늘어난 상황에서, 이를 감당할 수 있는 구조를 고민해야 했습니다.
예를 들어, 사용자가 다음과 같이 검색한다고 가정해 보겠습니다. (설명을 위해 단순화한 예시입니다.)

이 요청에는 장면에 대한 설명과 광고의 게재 정보, 영상 형식에 관한 조건이 함께 들어 있습니다. 피부에 세럼을 바르는 장면을 찾았더라도, 미국에서 현재 집행 중인 광고인지, 영상 길이가 15초 이하인지, 세로 영상인지까지 확인해야 합니다. 장면이 비슷해도 다른 국가에서 집행 중이거나 길이가 30초라면 요청에 맞는 결과가 아니죠.
데이터와 조건이 늘어났다고 사용자를 더 오래 기다리게 할 수도 없었습니다. 필요한 소재를 정확하게 찾으면서, 결과를 확인하기까지 걸리는 시간도 줄여야 했습니다.
운영 중에 생기는 오류에도 대비해야 했습니다. 검색 과정의 일부 단계에 문제가 생기더라도 다른 방법으로 결과를 제공할 수 있는지 살펴봤는데요. 이번 배포에서는 검색의 정확도와 속도를 함께 개선하고, 오류가 발생해도 가능한 범위에서 검색을 이어갈 수 있도록 구조를 다듬는 데 집중했습니다.
요약하자면 광고 소재를 검색하면 먼저 사용자의 요청을 이해하고, 검색에 필요한 정보를 준비합니다. 그다음 후보를 찾고, 요청에 더 잘 맞는 순서로 정렬해 결과를 보여줍니다.


앞서 든 세럼 영상 검색 예시로 각 단계가 하는 일을 살펴보겠습니다.
1. 질의 이해(Query Understanding)
먼저 대규모 언어 모델(LLM)이 사용자의 요청에서 검색할 내용과 필터 조건을 구분합니다. 예시에서 찾으려는 내용은 피부에 세럼을 바르는 장면입니다. 미국, 현재 집행 중, 15초 이하, 세로 영상은 필터 조건에 해당합니다. 장면에 대한 설명은 다음 단계에서 임베딩할 검색어로 정리하고, 소재의 속성과 광고 정보에 관한 조건은 필터로 분리합니다.
2a. 임베딩(Embedding)
이제 검색어를 임베딩 벡터로 변환합니다. 문장의 의미를 숫자 묶음으로 표현해, 저장된 소재 설명과 의미가 얼마나 비슷한지 비교할 수 있게 하는 과정인데요. 가령 피부에 세럼을 바르는 장면과 얼굴에 에센스를 펴 바르는 장면은 표현이 달라도 의미가 가까울 수 있습니다. 임베딩은 이런 관계를 비교하는 데 사용합니다. 다만 실제 유사도와 검색 결과는 사용하는 모델과 데이터에 따라 달라집니다.
2b. 검색 대상 Page 조회
필터 조건에 맞는 검색 대상 Page를 DB에서 조회한 뒤, 벡터 데이터베이스(Vector DB) 검색에 사용할 필터를 만듭니다. 이 작업과 검색어 임베딩은 서로의 결과를 기다릴 필요가 없어 동시에 진행합니다.
3. Vector DB 검색
검색어 벡터와 필터가 준비되면 Vector DB에 함께 전달합니다. 필터 조건을 만족하는 소재 청크 중에서 검색어와 의미가 유사한 청크를 찾습니다. (청크는 소재 설명을 나눈 조각입니다. 하나의 소재에서 여러 청크가 검색될 수 있으므로, 이후 이를 소재 단위로 묶어야 해요.)
3F-a. 직접 유사도 계산(Cosine Similarity)
만약 Vector DB 검색이 실패하면 전체 임베딩과 직접 유사도를 계산하는 브루트 포스(brute force) 방식으로 전환합니다. 모든 임베딩을 하나씩 비교하므로 처리 시간은 늘어납니다. 대신 정확도는 떨어지지 않습니다.
3F-b. 필터링(Filtering)
유사도를 계산하는 동안 필터 조건에 맞는 소재를 표시한 마스크(mask)도 만듭니다. 계산이 끝나면 마스크를 적용해 조건에 맞지 않는 소재를 결과에서 제외하는 역할을 맡은 셈입니다.
4. 중복 제거와 후보 수 조정(Dedup + 동적 top_k)
같은 소재에서 나온 청크를 묶어 중복을 제거합니다. 이후 검색어별 유사도 점수 분포를 보고 리랭킹에 넘길 후보 수를 정합니다. 모든 검색에 같은 수의 후보를 넘기지 않는 이유와 구체적인 기준은 6장에서 설명하겠습니다.
5. 리랭킹(Reranking)
마지막으로 LLM이 후보 소재를 사용자의 요청에 더 잘 맞는 순서로 다시 정렬합니다. 벡터 검색에서 관련 있어 보이는 후보를 모았다면, 리랭킹에서는 그 후보를 다시 검토해 순서를 다듬습니다. 결과는 스트리밍으로 전달해 전체 목록이 완성되기 전부터 순서대로 보여줍니다.
데이터가 늘면서 우려했던 기존 검색 방식의 한계가 드러났습니다. GPU로 백만 개 단위의 임베딩을 직접 비교해야 했고, 데이터는 양자화(quantization)로 크기를 줄인 뒤에도 40GB 이상이었습니다.
모든 데이터를 GPU 메모리에 올릴 수 없어 RAM과 디스크에도 나눠 보관하고, 계산에 필요한 데이터를 GPU로 옮겨 사용했습니다. 데이터가 늘수록 옮기고 비교해야 할 양이 많아졌고, 검색 응답 시간도 길어졌습니다.
그래서 전체 데이터를 직접 비교하는 대신, Vector DB의 검색 인덱스로 후보를 찾기로 했습니다. 다만 검색이 빨라져도 필요한 후보를 놓치거나 기존 필터를 사용할 수 없다면 서비스에 적용하기 어려웠죠. 속도와 함께 정확도, 필터 사용성도 살펴봐야 했습니다.
후보를 비교하기 위해 다음 기준을 세웠습니다.

위 기준으로 여섯 가지 구성을 비교했습니다. Milvus는 같은 데이터베이스라도 인덱스에 따라 특성이 달라 DiskANN, HNSW, IVF_PQ를 각각 평가했습니다.

Vector DB 선정은 매드업의 데이터 규모와 검색 조건, 배포 형태를 기준으로 진행했습니다. 특정 환경에 맞는 구성을 고르는 것이 목적이었기 때문에, 표의 결과가 구성 사이의 절대적인 성능 차이를 뜻하지는 않고요. 환경이 다르면 결과도 달라질 수 있습니다.
정확도 평가에서는 Milvus IVF_PQ를 제외한 모든 후보가 P@12(상위 12개 결과 중 정답 비율) 기준으로 브루트 포스와 같은 결과를 냈습니다. 인덱스로 탐색 범위를 좁혀도 전체를 직접 비교했을 때와 결과가 다르지 않았다는 뜻입니다.
후보 수를 10,000으로 늘리자 일부 구성에서 제약이 드러나기 시작합니다. 이번에 사용한 구현에서는 Milvus IVF_PQ가 최대 1,024개, RDS pgvector가 최대 1,000개까지만 검색할 수 있어 필요한 후보 수를 확보하기 어려웠습니다.
기존 필터를 옮길 수 있는지도 중요했는데요. 앞서 든 예시처럼 장면이 비슷한 소재를 찾는 것에 더해, 국가나 영상 길이 같은 조건도 확인해야 했습니다. 기존 필터를 얼마나 유지할 수 있는지 비교한 결과, 이번 평가에서는 Milvus 계열이 요구사항에 가장 잘 맞았습니다.
이후 정확도 기준을 충족하지 못한 IVF_PQ를 제외하고 DiskANN과 HNSW를 비교했습니다. 남은 판단 기준은 운영 부담과 비용, 데이터 증가에 따른 확장성이었습니다. 현재 데이터 규모와 앞으로 늘어날 양을 고려했을 때, DiskANN은 HNSW보다 작은 사양으로 운영할 수 있다는 것 까지 확인했습니다.
HNSW도 mmap을 사용하면 DiskANN처럼 데이터를 디스크에 둘 수 있습니다. 그래프와 원본 벡터를 디스크에 두고, 자주 쓰는 부분만 메모리에 올려 처리하는 방식입니다. 문제는 거리 계산에 원본 벡터가 필요하다는 점 이었는데요. 필요한 벡터가 메모리에 없으면 그때마다 디스크에서 읽어야 했고, 그만큼 검색이 늦어졌습니다.
DiskANN은 계산 순서가 다릅니다. 먼저 메모리에 둔 PQ(Product Quantization) 압축 코드로 거리를 대략 계산해 탐색 경로를 고릅니다. 그다음 꼭 필요한 노드의 원본 벡터만 디스크에서 읽어 정확한 거리를 계산합니다.

즉 두 방식의 차이는 탐색하는 동안 무엇으로 계산하느냐에 있었던거죠. 요약하자면 HNSW는 원본 벡터를 직접 읽고, DiskANN은 압축 코드로 범위를 좁힌 뒤 필요한 원본만 읽습니다. 그러므로 데이터 전체를 메모리에 올릴 수 없는 이번 환경에서는 DiskANN이 적합할 수밖에 없었습니다.
운영 부담도 있었습니다. DiskANN은 디스크에 인덱스를 구성하므로 데이터 적재와 인덱싱에 비교적 긴 시간이 필요했습니다. 다만 전체 데이터를 다시 적재하는 일은 드물었고, 적재 중에도 기존 데이터는 검색할 수 있었습니다. 이 부담과 검색에서 얻는 이점을 함께 검토한 뒤 Milvus DiskANN을 선택했습니다.
이렇게 늘어난 데이터에서 검색 조건에 맞는 후보를 찾을 수 있도록 구조를 다듬었습니다. 하지만 후보를 찾는 것만으로 검색이 끝나지는 않았습니다. 각 소재가 요청에 얼마나 잘 맞는지 다시 살펴보고 순서를 정해야 했습니다. 검색 도중 외부 서비스의 응답이 늦어지거나 오류가 발생하는 상황에도 대비가 필요했습니다.
다음 편에서는 사용자가 기다리는 시간을 줄이고, 일부 단계가 실패해도 검색을 이어갈 수 있도록 다듬은 과정을 살펴보겠습니다.
1. Subramanya, S. J., Devvrit, F., Kadekodi, R., Krishnaswamy, R., & Simhadri, H. V. (2019). DiskANN: Fast Accurate Billion-point Nearest Neighbor Search on a Single Node. NeurIPS 2019.
2. Malkov, Y. A., & Yashunin, D. A. (2018). Efficient and Robust Approximate Nearest Neighbor Search Using Hierarchical Navigable Small World Graphs. IEEE TPAMI. arXiv:1603.09320.
3. Milvus Documentation. MMap-enabled Data Storage.
4. Milvus Documentation. DISKANN.
새로운 기술을
성과로 만드는 팀에 합류하세요.
<매드업>은 개인정보보호법에 따라 이용자의 개인정보 보호 및 권익을 보호하고 개인정보와 관련한 이용자의 고충을 원활하게 처리할 수 있도록 다음과 같은 처리방침을 두고 있습니다.
<매드업>은 회사는 개인정보처리방침을 개정하는 경우 웹사이트 공지사항(또는 개별공지)을 통하여 공지할 것입니다.
○ 본 방침은 2020년 1월 15일부터 시행됩니다.
개인정보의 처리 목적 <매드업>은 개인정보를 다음의 목적을 위해 처리합니다. 처리한 개인정보는 다음의 목적 이외의 용도로는 사용되지 않으며 이용 목적이 변경될 시에는 사전동의를 구할 예정입니다.
가. 홈페이지 회원가입 및 관리 회원 가입의사 확인, 회원제 서비스 제공에 따른 본인 식별·인증, 회원자격 유지·관리, 제한적 본인확인제 시행에 따른 본인확인, 서비스 부정이용 방지, 만14세 미만 아동 개인정보 수집 시 법정대리인 동의 여부 확인, 각종 고지·통지, 고충처리, 분쟁 조정을 위한 기록 보존 등을 목적으로 개인정보를 처리합니다.
나. 민원사무 처리 민원인의 신원 확인, 민원사항 확인, 사실조사를 위한 연락·통지, 처리결과 통보 등을 목적으로 개인정보를 처리합니다.
다. 재화 또는 서비스 제공 물품배송, 서비스 제공, 청구서 발송, 콘텐츠 제공, 맞춤 서비스 제공, 본인인증, 연령인증, 요금결제·정산 등을 목적으로 개인정보를 처리합니다.
라. 마케팅 및 광고에의 활용 신규 서비스(제품) 개발 및 맞춤 서비스 제공, 이벤트 및 광고성 정보 제공 및 참여기회 제공 , 인구통계학적 특성에 따른 서비스 제공 및 광고 게재 , 서비스의 유효성 확인, 접속빈도 파악 또는 회원의 서비스 이용에 대한 통계 등을 목적으로 개인정보를 처리합니다.
개인정보 파일 현황
가. 개인정보 파일명 : 개인정보 처리방침
개인정보 항목 : 이메일, 휴대전화번호, 비밀번호, 이름, 업체명, 제목, 광고 예산, 내용, 사업자 등록 번호, 신용카드정보, 은행계좌정보, 예금주, 생년월일, 서비스 이용 기록, 접속 로그, 쿠키, 접속 IP 정보, 결제기록
수집방법 : 홈페이지, 계약서
보유근거 : 홈페이지 회원정보 수집 등에 관한 기록
보유기간 : 5년
관련법령 : 대금결제 및 재화 등의 공급에 관한 기록 : 5년
개인정보의 처리 및 보유 기간 ① <매드업>은 법령에 따른 개인정보 보유·이용기간 또는 정보주체로부터 개인정보를 수집 시에 동의 받은 개인정보 보유,이용기간 내에서 개인정보를 처리,보유합니다. ② 각각의 개인정보 처리 및 보유 기간은 다음과 같습니다.
가. <홈페이지 회원가입 및 관리> <홈페이지 회원가입 및 관리>와 관련한 개인정보는 수집.이용에 관한 동의일로부터<5년>까지 위 이용목적을 위하여 보유.이용됩니다.
보유근거 : 홈페이지 회원정보 수집 등에 관한 기록
관련법령 : 대금결제 및 재화 등의 공급에 관한 기록 : 5년
예외사유 :
나. <재화 또는 서비스 제공> <재화 또는 서비스 제공>와 관련한 개인정보는 수집.이용에 관한 동의일로부터<5년>까지 위 이용목적을 위하여 보유.이용됩니다.
보유근거 : 계약 또는 청약철회 등에 관한 기록
관련법령 : 계약 또는 청약철회 등에 관한 기록 : 5년
예외사유 :
다. <마케팅 및 광고에의 활용> <마케팅 및 광고에의 활용>와 관련한 개인정보는 수집.이용에 관한 동의일로부터<3년>까지 위 이용목적을 위하여 보유.이용됩니다.
보유근거 : 전자상거래등에서의 소비자보호에 관한 법률
관련법령 : 소비자의 불만 또는 분쟁처리에 관한 기록 : 3년
예외사유 :
정보 주체와 법정대리인의 권리·의무 및 그 행사방법 이용자는 개인정보주체로써 다음과 같은 권리를 행사할 수 있습니다.
① 정보주체는 매드업에 대해 언제든지 개인정보 열람,정정,삭제,처리 정지 요구 등의 권리를 행사할 수 있습니다.
② 제1항에 따른 권리 행사는 매드업에 대해 개인정보 보호법 시행령 제41조제1항에 따라 서면, 전자우편, 모사전송(FAX) 등을 통하여 하실 수 있으며 매드업은 이에 대해 지체 없이 조치하겠습니다.
③ 제1항에 따른 권리 행사는 정보주체의 법정대리인이나 위임을 받은 자 등 대리인을 통하여 하실 수 있습니다. 이 경우 개인정보 보호법 시행규칙 별지 제11호 서식에 따른 위임장을 제출하셔야 합니다.
④ 개인정보 열람 및 처리 정지 요구는 개인정보보호법 제35조 제5항, 제37조 제2항에 의하여 정보주체의 권리가 제한 될 수 있습니다.
⑤ 개인정보의 정정 및 삭제 요구는 다른 법령에서 그 개인정보가 수집 대상으로 명시되어 있는 경우에는 그 삭제를 요구할 수 없습니다.
⑥ 매드업은 정보주체 권리에 따른 열람의 요구, 정정·삭제의 요구, 처리 정지의 요구 시 열람 등 요구를 한 자가 본인이거나 정당한 대리인인지를 확인합니다.
처리하는 개인정보의 항목 작성
① <매드업>은 다음의 개인정보 항목을 처리하고 있습니다.
가. <홈페이지 문의 및 관리>
필수항목 : 업체명, 이메일, 제목, 연락처, 광고 예산, 내용, 휴대전화번호, 비밀번호, 이름, 서비스 이용 기록, 접속 로그, 쿠키, 접속 IP 정보
선택항목 : 프로필 사진
나. <재화 또는 서비스 제공>
필수항목 : 업체명, 이메일, 제목, 연락처, 광고 예산, 내용, 비밀번호, 이름, 회사명, 사업자 등록 번호, 신용카드정보, 은행계좌정보, 예금주, 생년월일, 서비스 이용 기록, 접속 로그, 쿠키, 접속 IP 정보, 결제기록
선택항목 :
다. <마케팅 및 광고에의 활용>
필수항목 : 업체명, 이메일, 제목, 연락처, 광고 예산, 내용, 휴대전화번호, 이름, 서비스 이용 기록, 접속 로그, 쿠키, 접속 IP 정보
선택항목 :
개인정보의 파기<매드업>은 원칙적으로 개인정보 처리 목적이 달성된 경우에는 지체없이 해당 개인정보를 파기합니다. 파기의 절차, 기한 및 방법은 다음과 같습니다.
파기절차
이용자가 입력한 정보는 목적 달성 후 별도의 DB에 옮겨져(종이의 경우 별도의 서류) 내부 방침 및 기타 관련 법령에 따라 일정기간 저장된 후 혹은 즉시 파기됩니다. 이 때, DB로 옮겨진 개인정보는 법률에 의한 경우가 아니고서는 다른 목적으로 이용되지 않습니다.
파기기한
이용자의 개인정보는 개인정보의 보유기간이 경과된 경우에는 보유기간의 종료일로부터 5일 이내에, 개인정보의 처리 목적 달성, 해당 서비스의 폐지, 사업의 종료 등 그 개인정보가 불필요하게 되었을 때에는 개인정보의 처리가 불필요한 것으로 인정되는 날로부터 5일 이내에 그 개인정보를 파기합니다.
파기방법
전자적 파일 형태의 정보는 기록을 재생할 수 없는 기술적 방법을 사용합니다. 종이에 출력된 개인정보는 분쇄기로 분쇄하거나 소각을 통하여 파기합니다.
개인정보 자동 수집 장치의 설치•운영 및 거부에 관한 사항
① 매드업은 개별적인 맞춤서비스를 제공하기 위해 이용 정보를 저장하고 수시로 불러오는 ‘쿠키(cookie)’를 사용합니다.
② 쿠키는 웹사이트를 운영하는데 이용되는 서버(http)가 이용자의 컴퓨터 브라우저에게 보내는 소량의 정보이며 이용자들의 PC 컴퓨터 내의 하드디스크에 저장되기도 합니다.
가. 쿠키의 사용 목적 : 이용자가 방문한 각 서비스와 웹 사이트들에 대한 방문 및 이용형태, 인기 검색어, 보안접속 여부, 등을 파악하여 이용자에게 최적화된 정보 제공을 위해 사용됩니다.
나. 쿠키의 설치•운영 및 거부 : 웹브라우저 상단의 도구>인터넷 옵션>개인정보 메뉴의 옵션 설정을 통해 쿠키 저장을 거부 할 수 있습니다.
다. 쿠키 저장을 거부할 경우 맞춤형 서비스 이용에 어려움이 발생할 수 있습니다.
개인정보 보호책임자 작성
① 매드업은 개인정보 처리에 관한 업무를 총괄해서 책임지고, 개인정보 처리와 관련한 정보주체의 불만처리 및 피해구제 등을 위하여 아래와 같이 개인정보 보호책임자를 지정하고 있습니다.
▶ 개인정보 보호책임자
성명 : 강남석
직책 : CFO
직급 : CFO
연락처 : 02-1522-1060, contact@madup.com
※ 개인정보 보호 담당부서로 연결됩니다.
▶ 개인정보 보호 담당부서
부서명 : General Affairs Team
담당자 : 민상준
연락처 : 02-1522-1060, contact@madup.com
② 정보 주체께서는 매드업의 서비스(또는 사업)을 이용하시면서 발생한 모든 개인정보 보호 관련 문의, 불만처리, 피해구제 등에 관한 사항을 개인정보 보호책임자 및 담당부서로 문의하실 수 있습니다. 매드업은 정보주체의 문의에 대해 지체 없이 답변 및 처리해드릴 것입니다.
개인정보 처리방침 변경
① 이 개인정보처리방침은 시행일로부터 적용되며, 법령 및 방침에 따른 변경 내용의 추가, 삭제 및 정정이 있는 경우에는 변경사항의 시행 7일 전부터 공지사항을 통하여 고지할 것입니다.
개인정보의 안전성 확보 조치 <매드업>은 개인정보보호법 제29조에 따라 다음과 같이 안전성 확보에 필요한 기술적/관리적 및 물리적 조치를 하고 있습니다.
가. 정기적인 자체 감사 실시 개인정보 취급 관련 안정성 확보를 위해 정기적(분기 1회)으로 자체 감사를 실시하고 있습니다.
나. 개인정보 취급 직원의 최소화 및 교육 개인정보를 취급하는 직원을 지정하고 담당자에 한정시켜 최소화 하여 개인정보를 관리하는 대책을 시행하고 있습니다.
다. 내부관리계획의 수립 및 시행 개인정보의 안전한 처리를 위하여 내부관리계획을 수립하고 시행하고 있습니다.
라. 해킹 등에 대비한 기술적 대책 <매드업>은 해킹이나 컴퓨터 바이러스 등에 의한 개인정보 유출 및 훼손을 막기 위하여 보안프로그램을 설치하고 주기적인 갱신·점검을 하며 외부로부터 접근이 통제된 구역에 시스템을 설치하고 기술적/물리적으로 감시 및 차단하고 있습니다.
마. 개인정보의 암호화 이용자의 개인정보는 비밀번호는 암호화 되어 저장 및 관리되고 있어, 본인만이 알 수 있으며 중요한 데이터는 파일 및 전송 데이터를 암호화 하거나 파일 잠금 기능을 사용하는 등의 별도 보안기능을 사용하고 있습니다.
바. 접속 기록의 보관 및 위변조 방지 개인정보처리시스템에 접속한 기록을 최소 6개월 이상 보관, 관리하고 있으며, 접속 기록이 위변조 및 도난, 분실되지 않도록 보안기능 사용하고 있습니다.
사. 개인정보에 대한 접근 제한 개인정보를 처리하는 데이터베이스시스템에 대한 접근 권한의 부여,변경,말소를 통하여 개인정보에 대한 접근통제를 위하여 필요한 조치를 하고 있으며 침입차단시스템을 이용하여 외부로부터의 무단 접근을 통제하고 있습니다.
아. 문서 보안을 위한 잠금 장치 사용 개인정보가 포함된 서류, 보조저장매체 등을 잠금 장치가 있는 안전한 장소에 보관하고 있습니다.
자. 비인가자에 대한 출입 통제 개인정보를 보관하고 있는 물리적 보관 장소를 별도로 두고 이에 대해 출입통제 절차를 수립, 운영하고 있습니다.