Vertex AI Search를 활용한 결과 없는 검색 개선하기

AI SaaS 도입으로 검색 경험을 개선한 사례 소개

안녕하세요. 컬리 데이터서비스개발팀의 Product Manager 권수영, ML Engineer 한수진입니다. 저희 팀은 컬리에 적합한 AI 기술 리서치와 서비스 도입을 위한 다양한 프로젝트를 진행하고 있으며, 이번 글에서는 그 중 하나인 검색 기능 개선을 위한 Google Vertex AI Search 도입 사례와 그 성공적인 성과에 대해 소개하고자 합니다. 특히 이번 프로젝트는 Google의 SaaS를 사용하여 빠른 시일 내 개발을 완료하였고 성능 면에서도 우수한 성과를 거두어 2024 Google Cloud Summit 행사에서 소개되기도 했습니다.

01_summit_PT

Google Cloud Summit 행사에서 소개된 모습

‘결과 없는 검색’ 개선 프로젝트

컬리의 검색 기능에서 오타, 띄어쓰기 오류, 유의어 등으로 인해 검색 결과를 제공하지 못하는 케이스(이하 "NR"; No Result)는 전체 검색의 약 6%~7%를 차지하고 있습니다. 반복적으로 발생하거나 시즌 특성을 반영하는 중요한 검색어라면 시스템에 수동으로 등록하기도 하지만, 검색 결과가 없는 대부분의 경우에는 컬리의 베스트 상품을 대신 보여줍니다. 하지만 이러한 방식은 검색어 운영관리 측면의 번거로움이 있을 뿐만 아니라, 정확한 목적을 가지고 검색을 시도한 고객의 만족도 역시 저하되는 문제가 있었습니다.

기존 검색 엔진에서 처리하지 못하는 이러한 NR 케이스에 유의미한 검색 결과를 제공하기 위해서는 검색어와 상품 간의 유사도를 맥락과 배경을 고려하는 컨텍스트 기반으로 좀 더 폭넓게 매칭시켜줄 수 있어야 합니다. 컬리의 GCP 분석 환경에서 이를 가장 빠르고 정확하게 실현시켜줄 수 있는 서비스가 Vertex AI Search였고, 이를 통해 검색 결과를 보완하고자 했습니다.

02_main

기존 ‘결과 없는 검색’ 케이스를 AI 결과물로 대체한 모습
© 2024.Kurly.All right reserved

03_architecture

운영 아키텍처
© 2024.Kurly.All right reserved

Vertex AI Search란? 왜 도입했는가?

Vertex AI Search는 Google Cloud의 관리형 서비스로 웹사이트, 문서, 파일, 데이터베이스 등 대규모 데이터셋을 탐색하여 검색을 수행합니다. Vertex AI 모델을 활용하여 복잡한 검색 쿼리를 별도로 작성하지 않고도 사용자의 의도를 파악하여 보다 정확한 검색 결과를 제공할 수 있습니다. 이 모델은 검색어와의 텍스트 매칭뿐만 아니라 검색어 임베딩 간의 유사도 분석을 동시에 수행하여 하이브리드 검색(의미론적 검색)을 지원합니다. 또한, Google Cloud 내 다른 서비스인 BigQuery, GCS 등과 쉽게 통합할 수 있어 확장성이 뛰어나며, 비즈니스에 맞게 검색 모델을 튜닝하거나 사용자 정의 임베딩 작업을 간편하게 수행할 수 있는 점도 매력적입니다.

검색 데이터 구성하기

검색 기능을 빠르게 테스트해보고 싶다면 웹사이트를 데이터 소스로 사용할 수 있습니다. 예를 들어, www.kurly.com/goods/*를 크롤링 페이지 패턴으로 지정하면 컬리 상품 페이지 내에서 HTML, XML 같이 마크업 언어로 구성된 데이터를 자동으로 크롤링하여 검색에 필요한 데이터를 간단하게 구성할 수 있습니다. 하지만 웹사이트 기반은 크롤링 범위를 조절하기 어렵고 색인된 데이터를 직접 관리할 수 없어서 불필요한 데이터까지 포함될 수 있으며, 이로 인해 검색 결과의 신뢰도가 떨어질 수 있습니다. 따라서 더 정확하고 안정적인 결과를 제공하기 위해서는 자체 데이터 소스를 만드는 것이 좋다고 판단했습니다.

자체 데이터 소스로는 대표적으로 BigQuery 테이블을 활용할 수 있는데, 데이터를 불러온 후 Vertex AI Search 내부의 데이터 스토어에 저장했다면 그 다음으로 중요한 것은 바로 스키마 설정입니다. 각 컬럼(필드)에 어떤 속성을 부여하느냐에 따라 검색 성능이 달라질 수 있기 때문입니다. 필드 속성을 지정하면 Vertex AI Search는 이를 바탕으로 데이터를 정렬 및 구조화하여 검색에 최적화된 인덱스를 구성합니다. 속성의 종류는 다음과 같습니다.

  • key property: 텍스트의 의미를 식별하기 위한 핵심 필드
  • searchable: 검색에 사용할 필드
  • indexable: 필터 및 정렬을 위한 필드
  • retrievable: 출력 결과로 받을 필드
  • completable: 자동완성에 사용할 필드

컬리 검색을 위해서는 상품 번호, 상품 이름, 상품 소제목 및 다양한 상품 정보가 포함된 상세설명, 판매 여부, 그리고 기존 검색 시스템에 등록되어있는 연관 키워드 등의 정보가 필요합니다. 특히, 상세설명 필드는 상품을 소개하는 문구와 상품의 특성이 담긴 데이터를 최대한 하나의 텍스트로 통합했으며 이를 통해 단일 텍스트 묶음을 핵심 필드로 효과적으로 활용할 수 있습니다. _id는 문서(이 경우 상품)을 구분하는 고유 ID로 데이터 업데이트 시 기준이 되는 필드입니다. 최종 인덱스는 아래 속성에 따라 구성되었습니다.

필드/속성 Key property Searchable Indexable Retrievable
_id   - - -
상품명 title O X X
상세설명 description O X X
상품URL   X X O
상품번호   X X O
판매여부   X O X
연관 키워드   O X X

스키마에 따르면 검색 쿼리와 연관성이 높은 상품을 찾아내기 위해 상품명과 상세설명, 연관 키워드 필드를 검색에 사용하고(searchable), 검색 결과를 판매 여부에 따라 필터링하며(indexable), 응답 결과에는 상품URL과 상품번호 필드가 포함됩니다(retrievable).

이 외에도 검색에 유용한 다른 상품 데이터가 있다면, 별도의 필드를 추가로 구성한 후 이를 searchable 필드로 지정해주면 됩니다. Relevance score 산출에는 key property 필드가 더 높은 가중치로 사용될 수 있으므로 상품의 부가 정보 중에서도 검색을 위한 우선순위를 잘 설정하는 것이 좋습니다.

검색 데이터의 주기적인 업데이트

BigQuery 데이터를 Vertex AI Search 데이터 스토어에 저장한 후에는 이 데이터를 최신 상태로 유지해야 합니다. 특히 신규로 들어오는 상품이 검색에서 누락되지 않도록 하려면 이 과정은 필수입니다. 또한, 상품의 상세설명 문구가 변경되었을 때에도 새로운 정보를 기반으로 검색을 원활하게 하기 위해서는 데이터 갱신이 필요합니다. 업데이트는 GCP 콘솔에서 직접 수동으로 하거나, 아래와 같이 파이썬 구글 SDK를 사용하여 배치 작업을 생성하는 방법이 있습니다.

import_request = discoveryengine.ImportDocumentsRequest(
    bigquery_source=discoveryengine.BigQuerySource(
    project_id=PROJECT_ID,
    dataset_id=DATASET_ID,
    table_id=TABLE_ID,
    data_schema="custom" # 직접 정의한 빅쿼리 스키마 사용
    ),
    parent=f"projects/{PROJECT_ID}/locations/global/collections/default_collection/dataStores/{AGENT_BUILDER_DATASTORE_ID}/branches/default_branch"
)

단, 앞서 _id를 문서의 고유 ID로 사용했기 때문에 BigQuery 테이블의_id 컬럼이 사전에 REQUIRED 필드로 지정되어 있어야 합니다. data_schema="custom" 를 지정하고 _id 필드가 정확히 설정되어 있다면, _id를 문서 ID로 정상적으로 인식할 수 있습니다.

검색 결과 튜닝하기

데이터를 잘 구성해두었다면 기본 검색 모델만으로도 상당히 정확한 결과를 얻을 수 있지만, 도메인 특성에 더 적합한 결과를 원한다면 모델을 튜닝하는 것도 고려해볼 수 있습니다.

예를 들어, 컬리에서는 각 주제별 상품들을 모아놓은 컬렉션을 상시로 운영하고 있는데 이 정보를 튜닝에 활용할 수 있습니다. 싸이 세대 모여라!라는 주제에 속한 상품을 하나의 예시로 들어보겠습니다. 이곳에는 싸이월드 시절 감성을 자극하는 상품들이 모여있습니다. 사람이 보면 싸이월드 세대를 떠올리는 상품이라는 것을 직관적으로 느낄 수 있지만, 검색 모델도 이를 잘 이해할 수 있을까요? '싸이'라는 단어가 아래 상품들과 연관성이 높은 단어라는 힌트를 주려면 임베딩 벡터를 조절하는 튜닝이 필요합니다. 즉, 상품의 표면적인 특성에는 담기지 못하는 유용한 의미와 표현을 담을 수 있도록 상품과 텍스트 간에 내재된 의미를 학습시키는 개념에 해당합니다.

04_promo_cyworld

컬리의 테마형 상품 컬렉션
© 2024.Kurly.All right reserved

튜닝 데이터를 만들기 위해서는 학습을 위한 질문과 그에 대한 답을 query와 corpus 형태로 구성해야 합니다. 그 다음, 이 파일을 GCS에 jsonl 형식으로 저장한 후 Vertex AI Search에서는 해당 데이터를 불러오기만 하면 됩니다.

query corpus
“싸이 세대 모여라”의 주제와 관련된 상품은? [햇반] 컵반 덮밥 시리즈 10종, [추억의 국민학교 떡볶이] 국떡 2종, [석관동 떡볶이] 석관동 모듬튀김, [하림] 용가리 치킨 850g,…

튜닝에 대한 보다 상세한 내역은 공식 문서를 참고해주세요.

검색 결과 호출하기

데이터 스토어 준비가 완료되면, 기본 모델 또는 자체 튜닝한 모델을 사용하여 검색 결과를 호출할 수 있습니다. 가장 단순한 방법은 데이터 스토어에 직접 접근하여 검색을 수행하는 것이지만, 보안과 데이터 소스와의 통합 유연성 측면에서는 데이터 스토어와 사용자 간의 인터페이스를 추상화하는 검색 애플리케이션을 별도로 생성하여 호출하는 것이 권장됩니다(공식 문서). 궁극적으로는 데이터 접근 로직을 애플리케이션의 중앙에서 관리할 수 있기 때문에 데이터 필터링, 정렬, 집계 등의 로직을 쉽게 변경하거나 확장할 수 있습니다.

05_request_flow

검색 호출 과정
© 2024.Kurly.All right reserved

데모 페이지로 검색 결과 쉽게 확인하기

검색 성능을 정성적으로 평가하기 위해 gradio로 데모 페이지를 구현했습니다. 내부 테스트 사용자가 검색어를 입력하면 기존의 컬리 검색 결과와 함께 Vertex AI Search에서 제공하는 웹사이트 크롤링 결과, BigQuery 정형 데이터 기반의 결과를 한 화면에서 각각 확인할 수 있습니다. 결과는 검색어와 상품 간의 연관성 점수(relevance score)에 따라 내림차순으로 정렬됩니다.

06_demo

gradio 데모 화면
© 2024.Kurly.All right reserved

그 결과, 그라다파다노 치즈 종류를 오타로 검색한 '그라파다노' 예시와 같이 직접 구성한 BigQuery 데이터를 기반으로 한 검색 성능이 가장 안정적이라는 점을 확인할 수 있었습니다.

프로젝트 결과

정성 평가

Vertex AI Search를 도입한 결과, 기존에는 검색이 불가능했던 상품 탐색이 크게 개선되었습니다. 특히, NR에서 가장 빈번하게 발생했던 오타 및 유의어 문제는 모델에 의해 자동으로 텍스트가 보정되면서 원래의 의도를 효과적으로 파악할 수 있게 되었습니다. 또한, 검색 데이터의 범위가 확장됨에 따라 영어 검색과 검색어의 맥락이나 배경을 고려하는 컨텍스트 기반 검색 또한 어느 정도 가능해졌습니다.

07_result_ui

정성 평가 결과
© 2024.Kurly.All right reserved

A/B 테스트, 그 이후

개선사항에 대한 정성적 평가를 마친 후엔 실제로 고객의 검색 편의성을 높여 클릭률, 장바구니 전환율 및 구매율 전반에 긍정적인 영향을 미쳤는지 그 효과를 검증하기 위해 약 2주간 A/B 테스트를 진행했습니다.

08_result_ab

A/B 테스트 결과 요약
© 2024.Kurly.All right reserved

테스트 결과는 매우 긍정적이었고, 실험군이 모든 지표에서 우세했습니다. 호출 비용을 감안하더라도 구매 전환율이 크게 향상됨에 따라 비용 대비 경제적 가치 역시 큰 폭으로 증대되었습니다. A/B 테스트가 성공적으로 마무리되면서 AI 검색 기능은 현재 전체 고객을 대상으로 적용중입니다. 배포 한달이 지난 시점으로 NR 케이스에서 AI 검색을 통한 장바구니 담는 횟수, 금액, 구매 수량, 매출에서 모두 300% 이상의 성과를 지속하고 있습니다.

09_result_total

전체 적용 결과 요약
© 2024.Kurly.All right reserved

향후 과제

AI 도입과 함께 컬리의 검색 품질은 한층 향상되었지만, 안정적인 운영과 고도화된 검색 품질을 위해서는 여전히 보완 및 개선해야 할 사항들이 남아 있습니다.

먼저, 안정적인 운영을 위해서는 금칙어 제재를 통해 검색이 불가한 경우를 잘 필터링해야 합니다. Vertex AI Search는 기본적으로 검색어만 있으면 그 의도에 맞는 비슷한 상품을 어떻게든 제공하기 때문에 비속어나 사회적 물의를 일으킬 수 있는 용어도 검색이 가능합니다. 하지만 신뢰할 수 있는 검색 서비스 품질을 위해서는 부적절한 결과를 잘 제재하는 것이 필요하며 이를 위해 금칙어 관리 시스템을 마련하여 컬리의 검색 기능을 더욱 안전하고 쾌적하게 유지해야 합니다.

또한, 검색 결과 캐싱을 통한 비용 절감도 중요한 과제 중 하나입니다. 검색에 사용되는 원천 데이터가 업데이트되지 않는 한, 동일한 검색어에 대한 결과는 변하지 않습니다. 따라서 일정 기간 동안 검색어와 결과를 미리 캐싱하여 호출 횟수를 효율적으로 줄일 수 있습니다.

그 외에도 검색 결과의 만족도를 높이기 위해 컬리 도메인의 특성을 효과적으로 반영하는 커스텀 임베딩, 검색어와의 연관성을 나타내는 relevance score 세밀 조정 등 모델 측면에서 시도해볼 점들이 있습니다.

이렇듯 컬리에서는 검색에 AI 기능을 적극적으로 활용하여 더 나은 고객 경험을 제공하기 위한 다양한 시도를 진행하고 있으니, 앞으로도 많은 기대 부탁드립니다. 긴 글 읽어주셔서 감사합니다.