BRICKSTUDY

[바이럴 탐지 프로젝트] (2) Product Matching 본문

프로젝트

[바이럴 탐지 프로젝트] (2) Product Matching

calpis1213 2024. 12. 1. 10:25

안녕하세요, 브릭스터디 백승빈입니다.

바이럴 탐지 프로젝트를 진행하며 그 과정에서 Product matching 문제를 다루게 되었는데요. E-commerce 업계에서 자주 다루는 문제인만큼 Product matching이 무엇인지, 어떤 솔루션들이 있는지, 또 저희 프로젝트에서는 어떻게 다루었는지에 관한 내용을 공유하면 좋을 것 같아 포스팅을 적게 되었습니다.

 

목차

  • Product Matching이란?
  • 솔루션 살펴보기
  • 프로젝트에서의 Product Matching

1. Product Matching이란?

Product matching은 서로 다른 온라인 플랫폼이나 상점에서 나타나는 제품 데이터를 통합하여 동일한 제품인지 식별하는 작업입니다. 각 상점에서는 자체적으로 제품을 등록하고 관리하기 때문에 동일한 제품이라도 이름, 설명, 이미지 등이 다를 수 있습니다. 

이 작업은 다양한 분야에서 폭넓게 활용되고 있습니다. 우선 여러 사이트에서 동일 제품의 정보를 가져와 최저가를 알려주는 가격 비교 기능을 강화할 수 있습니다. 또한 소비자가 검색어를 다양한 방식으로 입력하더라도 동일한 제품이 검색 결과로 나타나도록 검색 엔진의 성능을 향상시킬 수 있습니다. 판매자측에서는 데이터 분석을 통해 마케팅 전략 수립이나 프로모션 최적화에 사용할 수 있습니다.

Product Matching은 동일한 제품이라도 표현의 차이가 커질 수 있다는 점에서 어려움이 있는데요. 예를 들어, 같은 제품이지만 축약어나 영어 표기, 옵션의 유무에 따라 제품명이 달라질 수 있습니다. 또한 노이즈 데이터 문제도 있습니다. 온라인 상점에서는 검색에 잘 걸리거나 판매량을 높이기 위해 연관성이 약한 키워드를 추가하거나 제품을 묶어 판매하는 경우가 많아 매칭의 정확도를 떨어뜨릴 수 있습니다.

2. 솔루션 살펴보기

Product Matching은 상황과 요구사항에 따라 머신 러닝, 딥러닝, 룰베이스 시스템 등의  다양한 접근법이 존재합니다. 제가 살펴본 여러 솔루션 중 일부를 소개하겠습니다.

2.1. Fuzzy Matching

만약 비교해야할 텍스트 간의 차이가 크지 않다면 근사 문자열을 찾는 Fuzzy Matching을 사용할 수 있습니다.

퍼지 매칭 알고리즘은 주로 편집 거리를 계산하여 두 문자열 간의 유사성을 평가합니다. 편집 거리는 한 문자열을 다른 문자열로 변환하는 데 필요한 연산의 횟수를 기준으로 계산되며 이를 통해 두 문자열의 유사도를 측정합니다.

가장 널리 사용되는 편집 거리 알고리즘은 Levenshtein Distance Algorithm입니다. 이 알고리즘은 삽입, 삭제, 대체의 세 가지 연산을 통해 한 문자열을 다른 문자열로 변환하는 데 필요한 최소 연산 횟수를 구합니다. RapidFuzz, Fuzzywuzzy 등의 솔루션들이 Levenshtein 거리를 기반으로 하고 있습니다.

https://medium.com/@m.nath/fuzzy-matching-algorithms-81914b1bc498

2.2. Large Language Model

최근 LLM의 등장으로 기존의 Pretrained Language Model (PLM)인 BERT나 RoBERTa에 비해 제로 샷/퓨 샷 성능과 새로운 제품 명에 대한 일반화 능력이 뛰어난 LLM을 Product Matching 분야에 도입하려는 연구가 활발히 진행되고 있습니다.

초기에는 파인튜닝 없이 프롬프트 엔지니어링을 통한 인-컨텍스트 학습(In-Context Learning)에 집중하는 연구가 많았습니다. 그러나 이 방식은 프롬프트에 대한 민감도가 높아 적합한 프롬프트를 찾기 위한 시간과 비용이 많이 소모되는 문제점이 있었습니다. 이러한 문제점으로 인해 점차 LLM 자체를 파인튜닝하여 Product Matching에 최적화된 모델을 만드는 연구가 늘어나고 있습니다.

2.2.1 In-Context Learning

1) Prompt engineering

프롬프트를 작성하는 방식에 따라 모델의 성능이 바뀔 수 있습니다. 도메인에 특화된 프롬프트일수록 특정 분야의 용어나 맥락을 간접적으로 전달해 모델이 더 안정적인 결과를 얻을 수 있습니다. 또한 프롬프트를 간단하게 작성하고 출력 형식을 명확하게 지정하는 것도 효과적인 방법입니다.

프롬프트에 포함된 예시의 수도 성능에 영향을 미칩니다. 예시가 많을수록 Precision은 증가하지만 Recall은 감소하는 경향이 있습니다. 예시가 많을수록 모델이 더 정밀한 결과를 도출하지만 다양한 상황에 대한 일반화는 줄어들 수 있습니다.

매칭 룰을 프롬프트에 추가하면 제로샷 학습에서 성능을 크게 향상시킬 수 있습니다. 제로샷 환경에서는 규칙을 명확히 제시하는 것이 모델에게 더 정확한 결과를 이끌어냅니다. 반면 예시가 충분히 주어진 상황에서는 매칭 룰이 큰 영향을 미치지 않습니다.

 

2) Batch Prompting

배치 프롬프팅은 각 질문마다 별도의 프롬프트를 작성하는 대신 여러 질문을 하나의 프롬프트에 묶어서 한 번에 처리하는 방식입니다. 이 방법은 LLM API 호출 횟수를 줄여 비용을 절감할 수 있으며, 배치 내의 질문들이 서로 상호 참조함으로써 모델이 더 잘 학습하고 일관성 있는 답변을 생성할 수 있습니다.

배치 프롬프팅은 Batching Questions Selecting Demonstrations 두 가지 주요 단계로 나눌 수 있습니다.

 

2.1) Batching Questions

질문들을 유사도나 다양성을 기준으로 클러스터링하여 하나의 배치로 묶는 과정입니다. 유사성 기반 방식은 동일한 클러스터 내에서 질문들을 묶어 배치로 만들고 다양성을 고려한 배치는 각 클러스터에서 질문들을 섞어 배치를 구성합니다. 이 외에도 두 방식의 중간 형태인 무작위 배치도 존재합니다. 어느 방식이 더 효과적인지는 문제와 데이터에 따라 달라지지만, Product Matching 문제에서는 다양성 기반 배치가 가장 뛰어난 성능을 보였습니다. 반면 유사성 기반 배치는 동일한 답변이 생성될 가능성이 높아 정확도가 낮은 결과를 보였습니다.

 

2.2) Selecting Demonstrations

질문에 적합한 예시들을 선택하는 단계입니다. 예시가 질문과 유사할수록 성능이 향상된다는 전제 하에 KNN을 활용하여 질문과 가장 가까운 예시를 선택하는 Top K Batch Top K Question 방식이 사용됩니다. 또한 질문들을 최대한 포괄할 수 있도록 다양한 예시들을 뽑아내는 Covering-based 방식이 있습니다. 연구 결과에서는 Covering-based 방식이 가장 뛰어난 성능을 보였으며 배치 내의 모든 질문들과 전반적으로 유사한 예시들을 사용하는 것이 가장 효과적임을 확인할 수 있었습니다.

 

2.2.2 LLM Distillation

프로덕트 매칭 문제는 일반적으로 이진 분류 문제로 접근하여 두 페어가 일치하는지 판별합니다. 하지만 모든 페어를 비교하는 것은 많은 계산 비용을 요구하므로 효율적인 방법이 필요합니다. 또한 한 도메인에서 훈련된 모델은 다른 도메인에서 잘 작동하지 않는 경우가 많습니다. 이를 해결하기 위해 LLM을 작은 모델로 Distillation 하는 방안이 연구되고 있습니다. 최근 한 연구에서는 LLM이 활용해 생성 모델에서 Chain of Thought 방식의 추론을 가능하게 하는 방식으로 LLM의 추론 능력을 전이하여 일반화 성능과 Out-of-Domain 성능을 향상 시킬 수 있다고 제시했습니다.

방법론)

  1. LLM으로 Chain-of-Thought 방식의 자연어 설명 생성
    Chain-of Thought:
    (문제→답) 대신 (문제→풀이→답)의 과정으로 단계별로 풀이를 유도하여 LLM의 추론 능력을 올리는 방식
    기존의 이진분류 문제를 조건부 생성(conditional generation) 문제로 설정하여 두 product name이 주어질때 예측과 그에 대한 설명을 생성하도록 합니다. LLM에서 생성된 자연어 설명을 기존 이진 레이블 학습 데이터에 추가하여 설명 기반 학습 데이터(EA)를 생성합니다.
  2. seq2seq 모델 훈련
    생성된 EA 데이터로 Seq2Seq 모델을 파인튜닝하여 이진 분류와 설명 생성을 동시에 학습할 수 있도록 합니다. Seq2Seq 모델은 문제를 주어지면 그에 맞는 풀이와 답을 출력하는 방식으로 훈련되며 이를 통해 모델은 이진 분류 성능을 유지하면서도 추론 과정을 학습하여 더 일반화된 성능을 보이게 됩니다.

 

3. 프로젝트에서의 Product Matching

이 작업이 완전히 해결되지 않은 관계로 기획과 진행 상황만 공유합니다….

3.1. 기획

저희 프로젝트에서는 SNS 글들을 브랜드 단위로 수집합니다. 그 이유는 첫 번째로 SNS에서는 정확한 이름을 사용하지 않는 경우가 많고, 두 번째로는 저희가 수집하는 SNS의 가장 큰 비중을 차지하는 X(구 트위터)의 검색 기능이 좋지 않아 검색어가 길어질수록 연관성이 떨어지는 결과가 많이 나오기 때문입니다.

따라서 상품별로 글들을 살펴보기 위해서는 각 포스트가 해당 브랜드의 어떤 아이템에 대해 얘기하고 있는지 분류하는 과정이 필요합니다. 이를 위해 우선 글에서 상품명으로 추청되는 부분을 분리해내고 그 후에 상품명을 갖고 있는 상품명 리스트와 대조하며 정확히 어떤 제품인지 매칭하는 작업, 즉 Product matching이 진행됩니다.

 

3.2. 진행 상황

이 프로젝트는 두 가지 주요 제약을 가지고 있습니다. 첫 번째는 훈련 데이터가 부족하다는 점이고 두 번째는 자동화된 전처리가 가능해야 한다는 점입니다. 이러한 제약으로 인해 트위터 데이터에서 작업을 진행하는 데 어려움을 겪어 현재 유튜브 데이터에 대한 작업만 완료된 상태입니다.

초기에는 NER 모델인 Gliner를 사용하여 제품명을 추출하려 했으나 정확한 결과를 얻지 못해 GPT API를 사용하여 유튜브 설명에서 제품명을 추출하였습니다.

추출된 제품명은 RapidFuzz를 활용해 저희가 갖고 있는 아이템 목록과 매칭을 시도했습니다. 상품명이 비교적 정확한만큼 좋은 결과를 보였으나 아이템 이름에 자주 포함되는 브랜드 이름이나 로션, 스킨같은 기본 단어들이 주어지면 높은 유사도 점수를 내는 문제가 발생했습니다. 이를 해결하기 위해 stop word 목록을 만들어 해당 단어들이 매칭에 영향을 미치지 않도록 처리하였습니다.