사용자 행동 데이터에 기반한 판단 목록으로 Elasticsearch에서 LTR 모델 학습하기

UBI 데이터를 사용해 판단 목록을 생성하여 Elasticsearch에서 학습 순위 지정(LTR) 모델의 학습을 자동화하는 방법을 알아보세요.

Elasticsearch를 직접 체험하려면 당사의 샘플 노트북을 살펴보거나, 무료 클라우드 체험판을 시작하거나, 지금 바로 로컬 기기에서 Elastic을 사용해 보세요.

학습형 랭킹 모델을 사용할 때 가장 큰 과제는 모델을 학습시킬 고품질의 판단 목록을 만드는 것입니다. 전통적으로 이 프로세스에는 쿼리-문서 관련성을 수동으로 평가하여 각 문서에 등급을 부여하는 작업이 포함됩니다. 이는 확장성이 떨어지고 유지 관리가 어려운 느린 프로세스입니다(수백 개의 항목이 있는 목록을 수작업으로 업데이트해야 한다고 상상해 보세요).

이제 이 학습 데이터를 생성하기 위해 검색 애플리케이션과의 실제 사용자 상호 작용을 사용할 수 있다면 어떨까요? UBI 데이터를 사용하면 바로 그렇게 할 수 있습니다. 검색, 클릭 및 기타 상호 작용을 캡처하고 사용하여 판단 목록을 생성할 수 있는 자동 시스템을 구축합니다. 이 프로세스는 수동 상호 작용보다 훨씬 쉽게 확장하고 반복할 수 있으며 더 나은 결과를 얻을 수 있습니다. 이 블로그에서는 Elasticsearch에 저장된 UBI 데이터를 쿼리하여 의미 있는 신호를 계산하여 LTR 모델을 위한 학습 데이터 세트를 생성하는 방법을 살펴보겠습니다.

전체 실험은 여기에서확인할 수 있습니다.

UBI 데이터가 LTR 모델 학습에 유용한 이유

UBI 데이터는 수동 주석에 비해 몇 가지 장점이 있습니다:

  • 볼륨: UBI 데이터는 실제 상호 작용에서 생성되므로 수동으로 생성하는 것보다 훨씬 더 많은 데이터를 수집할 수 있습니다. 물론 이 데이터를 생성할 수 있는 충분한 트래픽이 있다는 전제입니다.
  • 실제 사용자 의도: 일반적으로 수동 판단 목록은 사용 가능한 데이터에 대한 전문가의 평가에서 비롯됩니다. 반면에 UBI 데이터는 실제 사용자 행동을 반영합니다. 즉, 관련성이 있어야 한다는 이론적 가정이 아니라 사용자가 실제로 콘텐츠와 상호작용하고 가치를 찾는 방식에 기반하기 때문에 검색 시스템의 정확도를 향상시킬 수 있는 더 나은 학습 데이터를 생성할 수 있습니다.
  • 지속적인 업데이트: 판단 목록은 시간이 지남에 따라 새로 고쳐야 합니다. UBI 데이터로 생성하면 최신 데이터로 업데이트된 판정 목록을 얻을 수 있습니다.
  • 비용 효율성: 판단 목록을 수동으로 작성하는 번거로움 없이 프로세스를 몇 번이고 효율적으로 반복할 수 있습니다.
  • 자연스러운 쿼리 분포: UBI 데이터는 실제 사용자 쿼리를 나타내므로 더 심층적인 변화를 이끌어낼 수 있습니다. 예를 들어, 사용자가 시스템에서 자연어를 사용하여 검색하나요? 그렇다면 시맨틱 검색 또는 하이브리드 검색 방식을 구현하는 것이 좋습니다.

하지만 몇 가지 경고가 함께 제공됩니다:

  • 편향성 증폭: 인기 있는 콘텐츠는 더 많이 노출된다는 이유만으로 클릭을 받을 가능성이 더 높습니다. 따라서 인기 있는 항목이 증폭되어 더 나은 옵션이 사라질 수 있습니다.
  • 불완전한 커버리지: 새 콘텐츠는 상호 작용이 부족하므로 결과에서 높은 순위를 차지하기 어려울 수 있습니다. 희귀 쿼리는 의미 있는 학습 데이터를 생성하기에 충분한 데이터 포인트가 부족할 수도 있습니다.
  • 계절적 변화: 시간이 지남에 따라 사용자 행동이 급격하게 변할 것으로 예상되는 경우, 과거 데이터로는 무엇이 좋은 결과인지 알 수 없을 수 있습니다.
  • 작업 모호성: 클릭 한 번으로 사용자가 원하는 것을 찾았다고 항상 보장할 수 있는 것은 아닙니다.

성적 계산

LTR 교육 성적

LTR 모델을 학습시키려면 문서가 쿼리와 얼마나 연관성이 있는지를 수치로 표현해야 합니다. 저희 구현에서 이 숫자는 0.0에서 5.0+까지 연속 점수로 표시되며, 점수가 높을수록 관련성이 높다는 것을 의미합니다.

이 채점 시스템이 어떻게 작동하는지 보여드리기 위해 수동으로 만든 이 예시를 살펴보겠습니다:

쿼리문서 콘텐츠등급설명
"최고의 피자 레시피""단계별 사진이 포함된 정통 이탈리아 피자 도우 레시피"4.0연관성이 높고, 사용자가 찾고 있는 정확한 내용
"최고의 피자 레시피""이탈리아 피자의 역사"1.0주제는 피자에 관한 것이지만 레시피는 아닙니다.
"최고의 피자 레시피""초보자를 위한 빠른 15분 피자 레시피"3.0관련성이 있고 좋은 결과이지만 '최고의' 레시피라는 점에서는 다소 부족할 수 있습니다.
"최고의 피자 레시피""자동차 관리 가이드"0.0전혀 관련이 없으며 쿼리와 전혀 관련이 없습니다.

여기에서 볼 수 있듯이 등급은 문서가 '최고의 피자 레시피'라는 샘플 쿼리와 얼마나 관련성이 있는지를 수치로 나타낸 것입니다. 이러한 점수를 통해 LTR 모델은 결과에서 어떤 문서가 더 높은 순위에 표시되어야 하는지 학습할 수 있습니다.

성적을 계산하는 방법은 교육 데이터 세트의 핵심입니다. 이를 위한 여러 가지 접근 방식이 있으며, 각 방식에는 고유한 장단점이 있습니다. 예를 들어, 관련성이 있으면 1점, 관련성이 없으면 0점이라는 이진 점수를 할당하거나 각 쿼리에 대해 결과 문서의 클릭 수를 계산할 수 있습니다.

이 블로그 게시물에서는 사용자 행동을 입력으로 고려하고 성적 번호를 출력으로 계산하는 다른 접근 방식을 사용할 것입니다. 또한 문서의 관련성에 관계없이 높은 결과가 더 많이 클릭되는 경향으로 인해 발생할 수 있는 편향도 수정할 예정입니다.

성적 계산 - COEC 알고리즘

COEC(예상 클릭 수 대비 클릭 수) 알고리즘은 사용자 클릭 수로 평가 등급을 계산하는 방법론입니다.
앞서 언급했듯이 사용자는 문서가 검색어와 가장 관련성이 높지 않더라도 높은 위치에 있는 결과를 클릭하는 경향이 있는데, 이를 위치 편향이라고 합니다. COEC 알고리즘을 사용하는 핵심 아이디어는 모든 클릭이 똑같이 중요한 것은 아니며, 10번 위치에 있는 문서를 클릭하면 1번 위치에 있는 문서를 클릭하는 것보다 해당 문서가 쿼리와 훨씬 더 관련성이 높다는 것을 나타냅니다. COEC 알고리즘에 대한 연구 논문(위 링크)을 인용합니다:

"검색 결과나 광고의 클릭률(CTR)은 결과의 위치에 따라 크게 감소한다는 것은 잘 알려진 사실입니다."

포지션 편향에 대한 자세한 내용은 여기에서 확인할 수 있습니다.

COEC 알고리즘으로 이 문제를 해결하려면 다음 단계를 따르세요:

1. 게재 순위 기준선을 설정합니다: 각 검색 위치의 클릭률(CTR)을 1부터 10까지 계산합니다. 즉, 일반적으로 위치 1, 위치 2 등을 클릭하는 사용자의 비율을 파악합니다. 이 단계는 사용자의 자연스러운 위치 편향을 포착합니다.

다음을 사용하여 CTR을 계산합니다:

CTRp=CpIpCTRp=CpIp

Where:

p = 위치. 1에서 10까지
Cp = 모든 쿼리에서 p 위치에 있는 총 클릭 수(모든 문서)
Ip = 총 노출 수입니다: 모든 쿼리에서 모든 문서가 위치 p에 노출된 횟수

여기서는 순위가 높을수록 더 많은 클릭을 얻을 것으로 예상합니다.

2. 예상 클릭 수(EC)를 계산합니다:

이 측정지표는 문서가 표시된 위치와 해당 위치에 대한 CTR을 기준으로 문서가 '받아야 하는' 클릭 수를 설정하며, 이를 통해 EC를 계산합니다:

EC(foradocument)=qQdCTRpos(d,q)EC (for a document) = qQdCTRpos(d,q)

Where:

Qd = 문서 d가 나타난 모든 쿼리
pos(d,q)= 쿼리 q 결과에서 문서 d의 위치

3. 실제 클릭 수 계산: 문서가 표시된 모든 쿼리에서 문서가 받은 실제 총 클릭 수를 계산합니다(이하 A(d)라고 함).

4. COEC 점수를 계산합니다: 예상 클릭 수(EC(d))에 대한 실제 클릭 수(A(d))의 비율입니다:

COEC=A(d)EC(d)COEC = A(d)EC(d)

이 메트릭은 이와 같은 위치 편향에 대해 정규화합니다:

  • 1.0점은 문서가 표시된 위치에서 예상한 대로 정확하게 수행되었음을 의미합니다.
  • 1.0점 이상은 문서의 위치를 살펴봤을 때 예상보다 우수한 성능을 보였다는 의미입니다. 따라서 이 문서가 쿼리와 더 관련이 있습니다.
  • 1.0 미만의 점수는 문서의 위치를 살펴볼 때 예상보다 실적이 좋지 않음을 의미합니다. 따라서 이 문서는 쿼리와 관련성이 낮습니다.

최종 결과는 검색 시스템과의 실제 상호 작용에서 추출한 위치 기반 기대치를 고려하여 사용자가 찾고 있는 것을 포착하는 등급 번호입니다.

기술적 구현

LTR 모델을 학습시키기 위해 판단 목록을 만드는 스크립트를 만들 것입니다.

이 스크립트의 입력은 Elastic에서 색인된 UBI 데이터(쿼리 및 이벤트)입니다.

출력은 COEC 알고리즘을 사용하여 이러한 UBI 문서에서 생성된 CSV 파일의 판정 목록입니다. 이 판단 목록은 이랜드와 함께 관련 특징을 추출하고 LTR 모델을 훈련하는 데 사용할 수 있습니다.

빠른 시작

이 블로그의 샘플 데이터에서 판단 목록을 생성하려면 다음 단계를 따르세요:

1. 리포지토리를 복제합니다:

2. 필요한 라이브러리 설치

이 스크립트에는 다음 라이브러리가 필요합니다:

  • 판다: 판정 목록 저장하기
  • 엘라스틱서치: Elastic 배포에서 UBI 데이터를 가져오려면 다음과 같이 하세요.

파이썬 3.11도 필요합니다.

3. .env 파일에서Elastic 배포의 환경 변수를 업데이트합니다.

  • ES_HOST
  • API_KEY

환경 변수를 추가하려면 다음을 사용합니다:

4. ubi_queries, ubi_events 인덱스를 생성하고 샘플 데이터를 업로드합니다. setup.py 파일을 실행합니다:

5. 파이썬 스크립트를 실행합니다:

이 단계를 수행하면 다음과 같은 판단 목록이라는 새 파일이 표시됩니다:

이 스크립트는 아래에 표시된 계산_관련성_등급() 함수를 사용하여 앞에서 설명한 COEC 알고리즘을 적용하여 성적을 계산합니다.

데이터 아키텍처

Ubi 쿼리

UBI 쿼리 색인에는 검색 시스템에서 실행된 쿼리에 대한 정보가 있습니다. 이 문서는 샘플 문서입니다:

여기에서 사용자(client_id), 쿼리 결과(query_response_object_ids), 쿼리 자체(timestamp, user_query)의 데이터를 볼 수 있습니다.

Ubi 클릭 이벤트

ubi_events 인덱스에는 사용자가 결과에서 문서를 클릭할 때마다 발생하는 데이터가 있습니다. 이 문서는 샘플 문서입니다:

판결 목록 생성 스크립트

일반 스크립트 개요

이 스크립트는 Elasticsearch에 저장된 쿼리 및 클릭 이벤트의 UBI 데이터를 사용하여 판단 목록 생성을 자동화합니다. 이러한 작업을 실행합니다:

  • Elasticsearch에서 UBI 데이터를 가져와 처리합니다.
  • UBI 이벤트와 쿼리의 상관관계를 파악합니다.
  • 각 포지션에 대한 CTR을 계산합니다.
  • 각 문서에 대한 예상 클릭 수(EC)를 계산합니다.
  • 각 문서에 대한 실제 클릭 수를 계산합니다.
  • 각 쿼리-문서 쌍에 대한 COEC 점수를 계산합니다.
  • 판정 목록을 생성하여 CSV 파일에 기록합니다.

각 기능을 살펴보겠습니다:

connect_to_elasticsearch()

이 함수는 호스트와 API 키를 사용하여 Elasticsearch 클라이언트 객체를 반환합니다.

FETCH_UBI_DATA()

이 함수는 데이터 추출 계층으로, Elasticsearch와 연결하여 match_all 쿼리를 사용해 UBI 쿼리를 가져오고 'CLICK_THROUGH' 이벤트만 가져오도록 UBI 이벤트를 필터링합니다.

process_ubi_data()

이 함수는 판단 목록 생성을 처리합니다. UBI 이벤트와 쿼리를 연결하여 UBI 데이터 처리를 시작합니다. 그런 다음 각 문서-쿼리 쌍에 대해 계산_관련성_등급() 함수를 호출하여 판정 목록의 항목을 가져옵니다. 마지막으로 결과 목록을 판다 데이터 프레임으로 반환합니다.

계산_관련성_등급()

COEC 알고리즘을 구현하는 함수입니다. 각 위치에 대한 CTR을 계산한 다음 문서-쿼리 쌍에 대한 실제 클릭 수를 비교하고 마지막으로 각 위치에 대한 실제 COEC 점수를 계산합니다.

GENERATE_JUDGEMENT_STATISTICS()

심사 목록에서 총 쿼리 수, 총 고유 문서 수 또는 등급 분포와 같은 유용한 통계를 생성합니다. 이는 순전히 정보 제공용이며 결과 판정 목록은 변경되지 않습니다.

결과 및 영향

빠른 시작 섹션의 지침을 따르면 320개의 항목이 포함된 판정 목록이 포함된 결과 CSV 파일이 표시됩니다(리포지토리에서 샘플 출력을 확인할 수 있습니다). 이러한 필드를 사용합니다:

  • qid: 쿼리의 고유 ID
  • docid: 결과 문서의 고유 식별자
  • 성적: 쿼리-문서 쌍에 대해 계산된 성적입니다.
  • 쿼리: 사용자 쿼리

"이탈리아 요리법" 쿼리에 대한 결과를 살펴보겠습니다:

qiddocid학년쿼리
Q1-이탈리아어 레시피레시피_파스타_베이직0.0이탈리안 레시피
Q1-이탈리아어 레시피레시피_피자_마르게리타3.333333이탈리안 레시피
Q1-이탈리아어 레시피레시피_리조또_가이드10.0이탈리안 레시피
Q1-이탈리아어 레시피레시피_프랑스_크로아상0.0이탈리안 레시피
Q1-이탈리아어 레시피레시피_스페인_파에야0.0이탈리안 레시피
Q1-이탈리아어 레시피레시피_그리스_무사카1.875이탈리안 레시피

결과에서 '이탈리아 요리법'이라는 검색어를 확인할 수 있습니다:

  • 리조또 레시피는 예상보다 10배 더 많은 클릭을 받아 검색어에 가장 적합한 결과입니다.
  • 피자 마르게리타도 훌륭한 결과물입니다.
  • (놀랍게도) 그리스 무사카도 좋은 결과를 얻었고, 결과에서 보이는 위치보다 더 좋은 성능을 보였습니다. 즉, 이탈리아 레시피를 찾는 일부 사용자가 대신 이 레시피에 관심을 갖게 된 것입니다. 이러한 사용자는 일반적으로 지중해 요리에 관심이 있을 수 있습니다. 결국, 이것이 우리에게 알려주는 것은 위에서 설명한 다른 두 가지 '더 나은' 경기에서도 좋은 결과를 보여줄 수 있다는 것입니다.

결론

UBI 데이터를 사용하면 LTR 모델의 학습을 자동화하여 자체 사용자로부터 고품질의 판단 목록을 만들 수 있습니다. UBI 데이터는 검색 시스템이 어떻게 사용되고 있는지를 반영하는 빅 데이터 세트를 제공하며, COEC 알고리즘을 사용하여 성적을 생성함으로써 내재된 편향을 설명하는 동시에 사용자가 더 나은 결과라고 생각하는 것을 반영합니다. 여기에 설명된 방법을 실제 사용 사례에 적용하여 실제 사용 트렌드에 따라 진화하는 더 나은 검색 환경을 제공할 수 있습니다.

관련 콘텐츠

최첨단 검색 환경을 구축할 준비가 되셨나요?

충분히 고급화된 검색은 한 사람의 노력만으로는 달성할 수 없습니다. Elasticsearch는 여러분과 마찬가지로 검색에 대한 열정을 가진 데이터 과학자, ML 운영팀, 엔지니어 등 많은 사람들이 지원합니다. 서로 연결하고 협력하여 원하는 결과를 얻을 수 있는 마법 같은 검색 환경을 구축해 보세요.

직접 사용해 보세요