Elasticsearch가 처음이신가요? Elasticsearch 입문용 웨비나에 참여하세요. 지금 무료 클라우드 체험을 시작하거나, 내 기기에서 Elastic을 사용해 볼 수 있습니다.
소개
많은 전자상거래 웹사이트가 레시피 검색 환경을 개선하는 데 관심이 있습니다. 시맨틱 검색을 올바르게 적용하면 고객은 "발렌타인데이 음식" 또는 "추수감사절 음식과 같이 보다 자연스러운 쿼리를 기반으로 필요한 식재료를 빠르게 찾을 수 있습니다."
이 문서에서는 Elasticsearch를 사용하여 이러한 쿼리를 지원하는 시맨틱 검색을 구현하는 방법을 보여드리겠습니다. 슈퍼마켓의 식재료 및 제품 카탈로그를 저장하는 인덱스를 구성하고 이 인덱스를 사용하여 레시피 검색을 개선하는 방법을 시연해 보겠습니다. 이 글에서는 이 데이터 구조를 만들고 자연어 처리 기술을 적용하여 고객의 의도에 맞는 관련 결과를 제공하는 방법에 대해 설명합니다.
이 글에 소개된 모든 코드는 Python으로 개발되었으며 GitHub에서 사용할 수 있습니다. 리포지토리에 액세스하여 소스 코드를 검토하고 필요에 따라 조정한 후 개발 환경에서 직접 솔루션을 구현할 수 있습니다.
시맨틱 검색 구현 시작
시맨틱 검색 구현을 시작하려면 먼저 자연어 모델을 정의해야 합니다. Elastic은 자체 모델인 ELSER를 제공할 뿐만 아니라 Hugging Face와 같은 다양한 제공업체의 NLP 모델을 통합할 수 있는 지원도 제공합니다. 이러한 유연성을 통해 필요에 가장 적합한 옵션을 선택할 수 있습니다.
이 글에서는 NLP 모델 배포 및 관리의 복잡성을 줄여주는 ELSER를 사용하겠습니다. 또한 Elastic은 semantic_text 기능을 제공하여 프로세스를 크게 간소화합니다. semantic_text를 사용하면 전체 임베딩 생성 프로세스가 간단하고 자동화됩니다. 추론 지점을 정의하고 인덱스 매핑에서 임베딩을 수신할 필드를 지정하기만 하면 됩니다. 문서 색인 중에 임베딩이 생성되어 지정된 필드와 자동으로 연결됩니다.
설정 단계
다음은 시맨틱 검색을 지원하는 색인을 만드는 단계입니다. 이 안내에 따라 인덱스를 구성하고 시맨틱 검색을 위한 준비를 마치면 됩니다:
- 추론 지점을 만듭니다.
- 임베딩을 수신할 수 있도록 설명 필드를 semantic_text로 설정하여 인덱스를 생성합니다.
- 데이터를 제품 카탈로그를 저장할 식료품 카탈로그 인덱스에 색인합니다. 이 카탈로그는 여기에서 제공되는 데이터 세트에서 가져온 것입니다.
마트에서 시맨틱 검색 적용하기
이제 식료품점 제품 데이터로 인덱스가 채워졌으므로 시맨틱 검색을 사용하여 검색 결과를 개선하기 위해 쿼리를 테스트하고 검증하고 있습니다. Google의 목표는 문맥과 사용자의 의도를 이해하여 보다 관련성 있고 정확한 결과를 제공하는 더 스마트한 검색 환경을 제공하는 것입니다.
시맨틱 검색으로 해결한 과제
제품 카탈로그를 기반으로 시맨틱 검색이 기존 어휘 검색이 종종 어려움을 겪는 어휘 및 문맥 문제를 해결하여 식료품점의 검색 환경을 어떻게 변화시킬 수 있는지 살펴보겠습니다.
1. 요리 의도에 대한 해석
문제 01: 고객이 구이용 해산물 "" 을 검색할 수 있지만 어휘 검색 시스템이 쿼리의 의도를 완전히 이해하지 못할 수 있습니다. 구이에 적합한 모든 해산물 제품을 식별하지 못하고 제품 제목에 "해산물" 또는 "그릴" 이라는 정확한 용어가 포함된 제품만 반환할 수 있습니다.
먼저 어휘 검색을 수행하고 결과를 분석합니다. 그런 다음 동일한 검색어에 대한 결과를 비교하는 시맨틱 검색으로 동일한 작업을 수행합니다.
어휘 검색 쿼리
결과:
| 검색 유형 | 이름 | 점수 |
|---|---|---|
| 어휘 | 노스웨스트 피쉬 알래스카 바이르디 대게 | 10.453125 |
| 어휘 | 요시다 씨, 소스 오리지널 고메 | 7.2289705 |
| 어휘 | 프리미엄 해산물 버라이어티 팩 - 20개 | 7.1924105 |
| 어휘 | 미국산 참돔 - 통살, 머리 부분, 세척 완료 | 6.998647 |
| 어휘 | 랍스터 발톱 & 팔, 지속 가능한 야생 어획물 | 6.438654 |
어휘 검색 결과 아메리칸 레드 스내퍼, 북서부 생선 알래스카 베어디 대게 등 구이에 적합한 일부 해산물 품목이 반환되었습니다. 그러나 어휘 검색은 해산물 품목이 아닌 고기 소스인 요시다 소스 등 관련성이 낮은 제품을 목록 상단에 표시해 어휘 알고리즘이 구이용 "의 문맥을 완전히 이해하지 못했음을 시사했습니다."
시맨틱 검색 솔루션
"해산물" 이라는 용어와 "구이" 와 같은 준비 컨텍스트를 결합하는 쿼리를 사용하여 "구이" 또는 "해산물" 이라는 단어가 제품 이름에 직접 나타나지 않더라도 구이에 적합한 생선 필레, 새우, 가리비 등의 포괄적인 옵션 목록을 반환합니다. 이렇게 하면 검색 결과가 고객의 의도와 더욱 밀접하게 일치합니다.
시맨틱 검색을 쿼리하세요:
| 검색 유형 | 이름 | 점수 |
|---|---|---|
| 시맨틱 | 머리부터 통째로 손질한 브란치노 생선 | 16.175909 |
| 시맨틱 | 알래스카 대구(검은 담비) | 15.855331 |
| 시맨틱 | 아메리칸 레드 스내퍼 - 통째로, 머리째로 | 15.454779 |
| 시맨틱 | 노스웨스트 피쉬 알래스카 바이르디 대게 | 15.855331 |
| 시맨틱 | 아메리칸 레드 스내퍼 - 통째로, 머리째로 | 15.3892355 |
시맨틱 검색은 "해산물," 이라는 용어와 직접적으로 관련된 제품을 반환했을 뿐만 아니라 "구이," 구이에 적합한 통생선 및 필레라는 문맥도 이해했습니다. 여기서 핵심은 구이용으로 흔히 사용되는 브란지노와 알래스카 블랙 대구와 같은 통생선 옵션이 포함된 결과의 정확성입니다.
문제 02 : 많은 고객이 긴 하루 일과를 마치고 빠르고 간편한 저녁 식사 솔루션을 검색하며 "쉬운 평일 저녁 식사" 같은 용어를 사용합니다. 기존의 어휘 검색은 간편식의 개념을 완전히 포착하지 못할 수 있으며, 종종 제품명에 "easy" 이라는 단어가 포함된 제품에만 초점을 맞출 수 있습니다.
이전 문제에서와 마찬가지로 어휘 검색을 수행하는 것으로 시작하겠습니다. 그 후 시맨틱 검색을 이용한 솔루션을 적용합니다.
어휘 검색 쿼리
결과:
| 검색 유형 | 이름 | 점수 |
|---|---|---|
| 어휘 | 에이버리 이지 필 주소 라벨, 4200매 | 8.017723 |
| 어휘 | 오믈렛 자체 가열 비상/휴대용 식사 32 | 6.592727 |
| 어휘 | 연안 해산물 황다랑어 큐브 포케 | 5.836883 |
| 어휘 | 헤비 슈퍼 웨이트 12온스 폼 | 5.8116536 |
| 어휘 | 베니티 페어 에브리데이 냅킨, 2겹, 110카운트 | 5.752989 |
어휘 검색은 'Avery Easy Peel 주소 라벨', 'Vanity Fair Everyday Napkins' 등 식사와 전혀 관련이 없는 항목을 포함하여 훨씬 덜 연관성 있는 결과를 반환했습니다. 이러한 제품은 빠른 식사에 대한 사용자의 요구를 충족시키지 못합니다. 어휘 검색에서 유용한 제품(오밀스 셀프 히팅 비상식량)이 한 개 나왔지만, 냅킨이나 라벨과 같은 다른 결과는 설명에 "easy" 또는 "weeknight" 라는 단어만 일치할 뿐, 빠른 식사 솔루션을 원하는 사용자의 의도를 제대로 다루지 못했습니다.
시맨틱 검색 솔루션
빠르고 간편한 식사의 의도를 이해하는 쿼리를 구현했습니다. 미리 조리된 육류, 냉동 파스타, 밀키트 등 빠르게 조리할 수 있는 제품은 이름에 "easy" 이라는 단어가 명시적으로 포함되어 있지 않더라도 연관 검색어로 연결됩니다. 이러한 접근 방식을 통해 고객은 평일 저녁 식사를 빠르게 해결할 수 있는 가장 적합한 옵션을 찾을 수 있으며, 편의성에 대한 니즈를 해결할 수 있습니다.
쿼리 시맨틱 검색
결과:
| 검색 유형 | 이름 | 점수 |
|---|---|---|
| 시맨틱 | 오믈렛 자체 가열 비상/휴대용 식사 32 | 14.610006 |
| 시맨틱 | 닛신, 컵누들, 새우, 2.5 온스 | 13.751424 |
| 시맨틱 | 나마스테 글루텐 프리 와플 & 팬케이크 믹스 | 13.73376 |
| 시맨틱 | 아이다호 스퍼드, 골든 그릴 해시브라운 감자 | 12.549422 |
| 시맨틱 | 닛신, 컵 누들, 치킨, 24개입 | 12.034527 |
시맨틱 검색 결과 평일 저녁에 간편하게 먹을 수 있는 인스턴트 라면(컵라면), 미리 조리된 감자, 팬케이크 믹스 등 빠르고 간편한 식사와 관련된 제품이 주로 검색되었습니다. 이는 시맨틱 검색이 "쉬운 평일 저녁 식사," 빠르고 편리한 식사를 찾고자 하는 사용자의 의도를 파악하는 문구 뒤에 숨은 개념을 파악할 수 있음을 보여줍니다. 흥미롭게도 "탄산음료," 등 다른 카테고리의 제품도 맥락과 관련이 있는 경우 포함될 수 있습니다(예: 식사와 함께 마시는 음료).
2. 지역 용어 및 어휘 변형
문제: 한 고객이 "소다," 을 검색하는 반면 다른 고객은 "팝" 을 사용하여 같은 제품을 검색할 수 있습니다. 기존의 어휘 검색은 두 용어가 동일한 항목을 지칭한다는 사실을 인식하지 못합니다.
어휘 검색 쿼리
결과:
| 검색 유형 | 이름 | 점수 |
|---|---|---|
| 어휘 | 프라임 하이드레이션+ 스틱 전해질 음료 믹스 | 14.492869 |
| 어휘 | 카프리 썬, 100% 주스, 버라이어티 팩 | 12.340851 |
| 어휘 | 조이버스트 에너지 드링크, 로즈 로즈, 12개입 | 11.839179 |
| 어휘 | 켈로그 팝 타르트, 프로스트 브라운 슈가 시나몬 | 9.97788 |
| 어휘 | 종류 미니 바, 버라이어티 팩, 0.7 | 9.336912 |
어휘 검색은 정확한 단어 일치에 중점을 둡니다. 프라임 하이드레이션, 카프리 썬과 같은 제품을 반환했지만 "팝" 이라는 용어와 직접 일치하면 음료가 아닌 스낵인 켈로그의 팝타르트와 같은 부적절한 결과를 초래하기도 했습니다. 이는 한 용어에 여러 가지 의미가 있거나 모호할 경우 어휘 검색의 효율성이 떨어질 수 있다는 점을 강조합니다.
시맨틱 검색 솔루션
의미론적 쿼리에서는 어휘 검색이 해결하지 못하는 어휘 변형 문제를 극복할 수 있습니다. 검색어를 확장하면 문맥적 의미에 기반한 결과를 얻을 수 있어 보다 관련성 있고 포괄적인 답변을 제공할 수 있습니다.
쿼리:
결과:
| 검색 유형 | 이름 | 점수 |
|---|---|---|
| 시맨틱 | 올리팝 12온스 프리바이오틱스 소다 버라이어티 | 14.776867 |
| 시맨틱 | 바이 항산화 코코퓨전, 버라이어티 팩, 18호 | 14.663253 |
| 시맨틱 | 몬스터 에너지 드링크, 제로 울트라, 24 | 14.486348 |
| 시맨틱 | 조이버스트 에너지 버라이어티, 12온스, 12온스 | 14.007214 |
| 시맨틱 | 조이버스트 에너지 드링크, 로즈 로즈, 12개입 | 13.641038 |
시맨틱 검색은 제품 이름에 정확한 용어인 "팝" 이 없더라도 "소다" 의 동의어로서 "팝" 의 개념과 직접적으로 일치하는 제품을 반환합니다(예: 올리팝 프리바이오틱스 소다). 검색은 상쾌한 저당 음료라는 사용자의 의도를 파악하고 프리바이오틱 탄산음료(Olipop), 무설탕 에너지 음료(Monster Energy Drink) 등 관련 제품을 반환할 수 있었습니다.
결론
식료품점 맥락에서 시맨틱 검색을 구현하면 "구이용 해산물" 및 "간단한 평일 저녁 식사 와 같은 복잡한 쿼리를 이해하는 데 매우 효과적임이 입증되었습니다." 이러한 접근 방식을 통해 사용자의 의도를 보다 정확하게 해석하여 관련성이 높은 상품을 추천할 수 있었습니다.
Elasticsearch를 사용하고 ELSER로 프로세스를 간소화함으로써 시맨틱 검색을 빠르고 효율적으로 적용하여 검색 결과를 크게 개선하고 보다 민첩하고 타깃화된 쇼핑 경험을 제공할 수 있었습니다. 이를 통해 검색 프로세스가 최적화되었을 뿐만 아니라 고객에게 제공되는 결과의 관련성도 높아졌습니다.
참고 자료
모델 ELSER:
https://www.elastic.co/guide/en/elasticsearch/reference/current/put-inference-api.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/infer-service-elser.html
시맨틱 텍스트:
https://www.elastic.co/guide/en/elasticsearch/reference/current/semantic-text.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/semantic-search.html
데이터 세트:
https://www.kaggle.com/datasets/bhavikjikadara/grocery-store-dataset?select=GroceryDataset.csv
시맨틱 검색:
https://www.elastic.co/guide/en/elasticsearch/reference/current/semantic-search.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/semantic-search-semantic-text.html




