검색 정확도
- 검색 결과의 정확도나 정합성을 나타내는 지표로 주어진 검색어에 대해 얼마나 적합한 결과가 반환되는지를 평가
- 일반적으로 검색 엔진은 사용자가 입력한 검색어와 일치하는 문서를 찾아내기 위해 다양한 알고리즘과 기술을 사용하며 이때 검색 정확도는 검색 엔진이 얼마나 정확하고 적합한 결과를 찾아내는지를 측정하는 척도
- 검색 정확도는 서비스의 신뢰도에 영향을 끼치고 만족도가 떨어질 경우 이탈률 발생시킬 우려가 크기 때문에 매우 중요한 지표
1. 검색 정확도의 요소
- 검색어와 문서 간의 일치도: 검색어와 문서의 일치하는 단어 또는 구절의 유사성 평가
- 문서의 중요도: 문서의 중요도나 신뢰도를 고려하여 결과의 순위 결정
- 검색어의 중요도: 검색어에서 어떤 단어가 중요한지를 판단
- 사용자의 의도 파악: 사용자의 검색 의도를 파악하고 해아 의도에 가장 부합하는 결과 제공
2. 검색 정확도를 측정하는 방법
- Precision
- Recall
- MRR
- MAP
- NDCG(Normalized Discounted Cumulative Gain)
- A/B 테스트
2.1 Precision & Recall
- Precision(정밀도): 검색 결과 중 실제로 연관된 결과의 비율
- Recall(재현율): 실제로 관련된 결과 중 검색 결과에 포함된 비율
- 둘은 트레이드 오프 관계
- 정밀도를 높이기 위해서는 관련성을 더 엄격하게 평가하여 잘 못된 관련 문서를 판별하는 경우를 줄여야 함
- 재현율을 높이기 위해서는 관련성을 더 넓게 평가하여 실제 관련 문서를 놓치지 않도록 해야 함
- 따라서 트레이드 오프 관계
부연 설명
- True Positives: 실제로 긍정(Positive)인 경우 모델이 긍정으로 올바르게 예측한 경우
- False Positives: 실제로는 부정(Negative)인 경우 모델이 긍정으로 잘 못 예측한 경우
- False Negatives: 실제로 긍정(Positive)인 경우를 모델이 부정으로 잘 못 예측한 경우
- True Negatives: 실제로 부정(Negative)인 경우 모델이 부정으로 올바르게 예측한 경우
- Precision: TP / (TP + FP)
- Recall: TP / (TP + FN)
2.2 MRR(Mean Reciprocal Rank)
- 주어진 검색 쿼리에 대한 가장 상위의 정확한 결과를 찾는 데 얼마나 성공적인지를 측정하는 지표
- 높은 MRR 값은 검색 시스템이 더 정확하고 관련성 높은 결과를 상위에 표시하는 것을 의미
- 각 사용자마다 검색 결과로 나온 문서 중에 가장 높은 순위의 역수를 계산
- 각 사용자마다 계산된 점수를 모아 평균 계산
MRR 장점
- 간단하며
- 검색 결과 중 가장 상위의 결과에 집중하여 가장 관련 있는 문서가 최상위에 있는지를 평가할 때 용이함
MRR 단점
- 하나의 상위 컨텐츠에 집중하기 때문에 여러 문서를 소비하는 것이 더 좋은 경우 평가가 어려움
- ex) 피드처럼 여러 개의 포스팅을 대상으로 할 때 평가하기 어려움
2.3 MAP(Mean Average Precision)
- 여러 검색 질의에 대한 평균 정밀도를 계산하는 지표
- 여러 사용자의 검색 질의에 대해 정확한 결과를 반환하는지를 측정하기 위해 사용
- 사용자의 질의에 대한 정확한 결과가 유지되는지 확인 가능
- 상위 N개의 결과에서 정밀도 계산
- 계산된 정밀도의 값을 사용자 별로 평균 내고, 그 결과를 모아 최종 평균 계산
MAP 장점
- 단일 쿼리에 의존하지 않고 다양한 쿼리를 고려하여 검색 결과를 평가
- 검색 결과의 순위에 따른 정밀도 고려
- 상위 순위에 정답 문서가 많이 포함되어 있을수록 높은 평가 점수를 받음
- 사용자 관점에서 중요한 문서가 상위에 위치하는 것을 반영하므로 검색 결과의 품질을 개선할 수 있음
MAP 단점
- MAP는 검색 결과에서 정답 문서를 이진적으로 즉, 정답 문서와 그 외의 문서로만 구분하게 되는데 실제 상황에서는 문서의 관련성이 다양한 정도로 존재할 수 있음을 고려하지 않는 한계 존재
- 모든 쿼리가 동등한 중요도를 가지는 것이 아닌데 MAP는 모든 쿼리를 동등하게 평가하기 때문에 중요한 쿼리의 영향력이 상대적으로 약화될 수 있음
- MAP는 쿼리별 정밀도를 계산하고 이를 평균 내는 과정을 거치기 때문에 계산이 복잡하며 이는 대규모 검색 시스템에서 성능 측면에서 치명적인 단점이 될 수 있음
2.4 NDCG(Normalized Discounted Cumulative Gain)
- 검색 결과의 순위를 평가하는 지표
- 검색 결과의 순위가 사용자의 관심도와 얼마나 일치하는지를 평가
- 더 높은 순위에 있는 관련성 높은 결과일수록 높은 점수 반영
- MAP의 목표와 유사하지만 이분법적으로 구분하는게 아닌 더 관련성 있는 문서가 무엇인지에 집중
DCG(Discounted Cumulative Gain)
- 검색 결과의 순위에 따른 상대적인 중요도를 측정하는 평가 지표
- DCG는 각 문서의 관련성 점수를 사용하여 계산
- 관련성 점수는 일반적으로 0부터 3까지의 범위를 가지며 높은 점수일수록 해당 문서의 관련성이 높다는 의미
- DCG는 순위별로 가중치를 부여하여 계산하며 순위 1부터 시작하여 순차적으로 가중치를 계산하는데, 가중치는 해당 순위의 관련성 점수에 로그를 적용한 값
- 상위 순위에 있는 문서의 관련성이 더 크게 반영됨
- 순위별 가중치를 누적하여 합산한 DCG 값을 구함
IDCG(Ideal Discounted Cumulative Gain)
- 이상적인 검색 결과 순위에서의 DCG 값을 나타내는 지표
- 모든 관련성 점수가 최대로 가정된 상황에서의 DCG 값
- DCG와 동일한 방식으로 순위별 가중치를 계산하고 누적하여 합산한 값을 IDCG로 사용
- 이상적인 검색 결과에서의 DCG 값을 나타냄
NDCG 장점
- 검색 결과의 상대적인 품질을 측정하는 지표로써 DCG 값과 IDCG 값 사이의 비율을 계산하여 정규화하기 때문에 타 검색 시스템이나 쿼리에 대한 결과를 비교 가능
- 검색 결과의 상위 순위에 있는 문서의 관련성이 더 큰 영향을 받기 때문에 사용자가 중요하게 생각하는 문서가 상위에 위치하는 것을 반영 가능
NDCG 단점
- NDCG는 이상적인 검색 결과에서의 최대 가능한 DCG 값(IDCG)을 사용하여 정규화하는데 이상적인 검색 결과를 정의하기 위해 모든 문서의 관련성을 알아야 하는 것이 현실적으로 어렵거나 불가능함
- DCG 값을 정규화하여 비교 가능한 형태로 만드는데 정규화된 값은 상대적인 품질만을 나타내기 때문에 실제 검색 결과의 절대적인 품질을 직접적으로 알기 힘듦
- 검색 결과의 순위와 관련성 점수에 민감하여 작은 순위 변동이나 관련성 점수의 차이가 NDCG 값에 큰 영향을 미칠 수 있으며 이는 일부 문서의 작은 변화가 전체적인 평가에 큰 영향을 끼칠 수 있다는 의미
2.5 A/B 테스트
- 여러 가지 검색 알고리즘 혹은 변경된 검색 시스템을 사용하여 사용자의 검색 요청에 대한 결과를 비교하고 평가
- A/B 테스트를 통해 사용자의 선호도와 반응을 분석하여 검색 정확도를 개선 가능
A/B 테스트 장점
- 데이터에 기반하여 결정을 내리기 때문에 주관적인 의견이나 가정에 의존하지 않음
- 변형된 요소나 전략의 성능을 비교 분석 가능
- 제한된 범위에서 실험을 하기 때문에 큰 규모의 변경을 바로 적용하는 것보다 리스크를 줄일 수 있으며 실패한 경우 영향 범위가 제한되므로 부정적인 영향을 최소화할 수 있음
A/B 테스트 단점
- 여러가지 변형을 비교하고, 데이터를 수집하고, 결과를 분석하는 데 시간과 노력이 필요하므로 프로세스가 상대적으로 길어질 수 있음
- 충분한 표본 크기가 없을 경우 통계적으로 유의미한 결과를 도출하기 어려울 수 있음
- 특정한 환경이나 상황에서 수행되므로 다른 환경이나 다른 사용자 그룹에 적용할 때 결과가 상이할 수 있음
- 일반화하기 위해서는 추가 테스트 필요
2.6 CTR & CVR
- CTR(Click-Through Rate): 고아고나 검색 결과 페이지에서의 특정 링크를 클릭한 사용자의 비율을 나타내는 지표
- 보통 광고나 검색 결과 페이지에서 많은 클릭을 유도하기 위해 사용
- CTR = (클릭 수 / 노출 수) * 100
- CVR(Conversion Rate): 특정한 액션 혹은 전환을 수행한 사용자의 비율을 나타내는 지표
- 전환은 보통 구매, 가입, 등록, 다운로드 등의 동작을 의미
- CVR = (전환 수 / 클릭 수) * 100
CTR & CVR 장점
- 사용자의 클릭과 전환 등 실제 동작을 기반으로 측정하기 때문에 광고나 검색 결과 페이지의 성과를 직접적으로 평가 가능
- 비교적 간단한 지표로 다른 광고나 검색 결과 페이지 간의 상대적인 성과를 비교하는데 유용
- 클릭, 전환과 같은 구체적인 동작 바탕으로 계산되기 때문에 데이터 수집과 측정이 비교적 용이한 편
CTR & CVR 단점
- 사용자의 클릭과 전환 등의 동작만을 고려하여 평가하는 지표이기 때문에 사용자의 검색 의도, 만족도, 페이지 품질 등과 같은 다른 중요한 요소들을 간과할 수 있게 됨
- 해당 링크에 직접적으로 연결된 사용자 동작만을 측정하고 사용자의 전체 행동 경로나 장기적인 행동을 고려하지 않음
- 사용자의 클릭 의사 결정에 영향을 미치는 다양한 외부 요인들에 의해 영향을 받을 수 있음
- ex) 광고의 디자인, 문구, 위치 등은 CTR 영향을 줄 수 있음 (닫기 버튼이 매우 작은 면적이 큰 배너 광고)
2.7 결론
- 검색 정확도 왕도가 없음
- 따라서 최대한 로깅해서 데이터 취합하여 분석할 필요가 있음
검색 유사도
- 유사도는 검색 결과의 정확도를 결정하는 데 사용하는 개념
- Elasticsearch는 내부적으로 Lucene 검색 엔진을 기반으로 하며 Lucene은 다양한 유사도 측정 알고리즘 제공
- Elasticsearch에서 제공하는 유사도 종류
- BM25 (Elasticsearch 5.x 버전부터 채택한 유사도 알고리즘)
- TF-IDF
- DFR, DFI, IB 등
* 이미 이전 게시글에서 정리했지만 복습 차원에서 다시 정리해 보겠습니다.
1. TF-IDF
1.1 TF(Term Frequency)
- 용어 빈도로 문서 내에서 특정 용어가 등장하는 빈도
- 일반적으로 문서 내에서 많이 등장하는 용어일수록 해당 용어의 TF 값은 높아짐
1.2 DF(Document Frequency)
- 특정 단어가 나타난 문서의 수
- 특정 단어가 여러 데이터에 얼마나 자주 등장하는지 알려줌
1.3 IDF(Inverse Document Frequency)
- DF의 역수로 특정 용어의 문서 내 등장 빈도에 대한 역수
- IDF는 전체 문서 집합에서 용어가 등장하는 문서의 수를 역수로 측정
- 특정 용어가 전체 문서 집합에서 얼마나 희귀한지를 반영하는 지표로 희귀한 용어일수록 IDF 값은 높아짐
1.4 TF-IDF(Term Frequency-Inverse Document Frequency)
- TF와 IDF를 결합한 개념으로 문서 내 특정 용어의 중요도를 측정하는 데 사용
- 문서 내 특정 용어의 상대적인 중요도를 나타냄
1.5 Elasticsearch에서 TF-IDF를 사용하기 위한 설정
2. BM25
- Best Matching 25의 약어로 TF-IDF 알고리즘의 확장된 버전
- Elasticsearch 7.0 버전부터 기본값이 된 순위 점수 계산 모델
2.1 TF-IDF vs BM25
TF-IDF | BM-25 | |
가중치 계산 방식 | 용어의 빈도가 높을수록 해당 용어의 중요도가 높아지며 문서 집합 전반에 걸쳐 희귀한 용어일수록 더 높은 가중치 부여 | 문서의 길이에 대한 보정과 검색어의 토큰 일치도를 고려하여 가중치 계산 긴 문서에서는 토큰의 빈도가 높아지기 때문에 이를 보정하여 공정한 유사도 측정 가능 |
IDF 값의 조정 | 전체 문서 집합에서 용어의 문서 등장 빈도의 역수로 계산 이를 통해 희귀한 용어에 대한 높은 가중치 부여 |
IDF 값에 대한 조정이 이루어져 희귀한 용어에 대한 IDF 값을 조정하여 검색 결과의 다양성을 보장 너무 희귀한 용어에 대한 영향력을 완화 |
문서 길이에 대한 보정 | 문서의 길이에 따라 보정을 고려하지 않음 이에 따라 긴 문서에서는 토큰의 빈도가 자연스럽게 높아짐 |
문서의 길이에 대한 보정을 고려하여 검색 결과의 정확도를 개선 |
rank_feature
- rank_feature 타입은 Elasticsearch의 특수한 필드 타입으로, 문서의 순위를 조정하는 데 도움을 주며 이러한 필드는 일반적으로 검색 결과의 관련성을 높이기 위해 사용
- 검색 결과의 순위를 결정하는 데 사용되는 기능
- 특정 필드의 값을 기반으로 문서의 중요도를 평가하고 이를 활용하여 검색 결과 정렬
1. rank_feature 활용
- 기본적으로 Elasticsearch는 검색어의 일치도에 따라 Relevance Score를 계산하여 문서의 순위를 매기지만 추가적인 정보를 활용하여 더 정확한 순위를 결정하고자 할 때 rank_feature 활용
- 특정 필드의 값이나 가중치를 고려하여 사용자 정의 순위를 결정하고자 할 때 rank_feature 활용
- ex) 상품 검색에서 판매량이나 평점 등의 정보를 고려하여 검색 결과 정렬
2. rank_feature 필드 매핑 예시
- 'positive_score_impact: false'로 설정 시 마이너스 요소가 되는 필드값으로 인식
부연 설명
- Positive Score Impact: 기본적으로 rank_feature 필드는 값이 클수록 문서의 순위를 높일 수 있으며 이는 positive_score_impact 옵션을 통해 조정 가능
- Negative Score Impact: positive_score_impact 옵션을 false로 설정하면, 값이 클수록 문서의 순위가 낮아짐
- 이러한 기능을 활용하면, 검색 결과의 정렬을 사용자에게 더 적합하게 조정할 수 있음
- sales와 rating은 긍정적인 영향을 미쳐 순위를 높이고, return_sales(환불)는 부정적인 영향을 미쳐 순위를 낮추도록 설정함으로써, 사용자에게 더 가치 있는 검색 결과를 제공할
3. rank_feature 검색 쿼리 예시
부연 설명
- 이 쿼리는 sales, return_sales, rating 세 가지 필드를 고려하여 문서의 순위를 정합니다. 각 필드의 영향력은 boost 값에 의해 조정
- sales 필드는 기본적인 영향력을 가지며, 값이 클수록 문서의 순위가 높아짐
- return_sales 필드는 boost 값이 0.1로 낮게 설정되어 있으며, 값이 클수록 문서의 순위가 낮아짐
- rating 필드는 boost 값이 1.4로 높게 설정되어 있어, 값이 클수록 문서의 순위에 큰 영향을 미침
- 정리하면 이 쿼리를 통해 반환된 문서들은 sales, return_sales, rating 필드 값에 따라 순위가 매겨지며, rating의 영향력이 가장 크고, return_sales의 영향력은 가장 작음
- 따라서 사용자는 더 높은 평점과 높은 판매량을 가진 문서를 우선적으로 보게 되며, 반품량이 많은 문서는 상대적으로 순위가 낮아짐
4. integer 필드 vs rank_feature 필드
- Integer 필드를 직접 쓰게 될 경우 단순히 정수 값을 저장하고 검색 결과를 정렬 시 해당 값에 따라 정렬됨
- 반면, rank_feature는 같은 숫자값 필드여도 이를 랭킹화를 하는데 복합적으로 적용 가능
- rank_feature 필드의 값과 다른 필드들 간의 상관관계를 학습하고 이를 기반으로 랭킹화된 검색 결과를 반환 가능
- ex) 같은 term을 가지고 있어서 텀 매칭 점수로는 같은 score를 가지는 문서라도 추가적인 rank_feature의 값을 통해 가중치를 다르게 부여 가능
5. rank_feature의 기능들
5.1 Saturation
- 특정 값 이상에서는 더 이상 점수에 영향을 주지 않도록 제한하는 기능
- score = S / (S + pivot)으로 계산되며 값의 범위는 [0, 1]
- S는 필드의 값
- pivot은 입력받는 값으로 S가 피봇보다 작으면 0.5 미만, 그렇지 않으면 0.5보다 큰 결과가 나옴
- pivot 값이 없다면 Elasitcsearch는 모든 rank_feature 값의 대략적인 기하학적 평균과 동일한 값으로 기본값을 계산
5.2 Logarithm
- scaling_factor 매개변수를 사용하여 정수 값을 로그 스케일링할 수 있도록 지원
- 점수의 범위를 조정하고 상대적인 차이를 강조하거나 완화 가능
- score = log(S + scaling_factor)
5.3 Sigmoid
- 시그모이드 함수는 S자 형태의 곡선을 가지며 점수를 0과 1 사이 값으로 변환
- 점수의 분포를 변환하고 점수 간의 상대적인 차이를 조절 가능
- score = S^exp / (S^exp + pivot^exp)
5.4 Linear
- scaling_factor 매개변수를 사용하여 선형 스케일링을 적용할 수 있음
- 점수를 일정한 비율로 조정하는 것으로 점수에 대한 변환 없이 점수의 상대적인 차이를 유지하게 됨
6. Function Score Query
- Elasticsearch에서 검색 결과의 score를 커스텀 함수를 기반으로 계산하고 조정할 수 있게 지원하는 쿼리
- 커스텀하게 필터링한 문서의 집합 내에서 직접 설정한 기준으로 점수를 계산하고 싶을 때 사용
6.1 Function Score Query 실제 사용 사례
- function_score 쿼리 사용 시 검색 결과에 가중치를 적용하여 특정 문서를 강조할 수 있음
- 특정 필드의 값이 다른 필드의 값보다 중요하다고 판단될 경우 해당 필드에 대한 가중치를 높게 설정하여 해당 문서가 상위에 나타나도록 처리 가능
- ex) 검색어로 매칭된 숙박시설 중에서 type=hotel인 것을 더 우선순위 높임
- function_score 쿼리는 동적으로 점수를 계산하는 데 사용될 수도 있음
- ex) 인기도나 최근성과 같은 요소를 고려하여 점수를 조정할 수 있으며 이를 통해 사용자의 관심도에 맞는 결과 혹은 최신 정보를 우선하여 노출 가능
- function_score 쿼리를 사용하여 검색 결과에 랜덤 한 요소를 추가하여 매번 다른 결과를 보여줌으로써 다양성을 제공하거나 랜덤한 추천 결과 제공 가능
- ex) 배달 서비스에서 매번 같은 검색어에 동일한 결과가 나올 경우 한 업체로 배달이 몰릴 수 있음
6.2 function_score에서 제공하는 함수들
6.2.1 script_score
- 스크립트를 사용하여 별도의 점수 계산을 수행하는 기능
- ex) 특정 필드의 값에 따라 점수를 동적으로 계산하거나 사용자 정의 함수를 통해 점수 조정 가능
6.2.2 weight
- 각 문서에 대해 정적인 가중치를 부여하는 기능
- 특정 문서나 필드에 더 높은 우선순위 부여 가능
6.2.3 random_score
- 각 문서에 대해 랜덤한 점수를 부여하는 기능
- 검색 결과의 다양성을 제공하거나 랜덤 추천 구현 가능
6.2.4 decay function
- 거리, 시간 또는 기타 연속적인 값에 기반하여 값이 감소하거나 증가하는 점수를 계산하는 기능
- ex) 거리가 가까운 문서에 더 높은 점수를 부여하거나 최신 문서에 가중치 부여
부연 설명
- gauss 함수(가우시안 함수)를 사용하여 특정 날짜를 기준으로 한 시간적 가중치를 적용
- 구체적으로는, 2024-06-19을 기준 날짜로 설정하여 그 날짜를 중심으로 하는 가우시안 함수 적용
- 2024-06-19에서 5일(offset) 전인 2024-06-14부터 최고 점수를 받기 시작
- 2024-06-19을 중심으로 10일(scale) 이내의 문서들은 높은 점수를 받음
- 2024-06-19에서 10일 이후부터는 점수가 감쇠하기 시작하여, scale만큼 떨어진 문서의 점수는 기준 점수의 절반으로 감소
- 이 쿼리를 통해 반환된 문서들은 @timestamp 필드 값이 2024-06-14에서 2024-06-29 사이에 있을 때 가장 높은 점수를 받게 되며, 그 이후로는 점점 점수가 낮아짐
- 이를 통해 최근 데이터가 우선적으로 높은 점수를 받도록 하여, 검색 결과의 순위를 조정 가능
6.3 score_mode
- 쿼리의 결과 점수를 계산하는 방식을 설정하는 옵션
- default 값은 multiply: 스코어들이 곱해짐
- sum: 스코어들의 합
- avg: 스코어들의 평균
- first: 첫 번째 점수를 선택하며 여러 개의 조건 중 첫 번째가 가장 중요하다고 설정할 때 사용
- max: 최고 스코어
- min: 최저 스코어
6.4 boost_mode
- 여러 하위 쿼리의 점수를 결합하는 방식을 지정하는 옵션
- multiply: 각 하위 쿼리의 점수를 곱해서 최종 점수 계산
- replace: 쿼리로 인한 스코어는 무시되고 오로지 해당 function_score로 인한 스코어만 사용하겠다는 의미
- sum: 각 하위 쿼리의 점수를 합해서 최종 점수 계산
- avg: 하위 쿼리들의 점수의 평균
- max: 하위 쿼리들의 최고 점수
- min: 하위 쿼리들의 최저 점수
6.5 종합해서 작성한 예시 쿼리
부연 설명
- 모든 문서가 검색됨 (match_all)
- 각 문서의 기본 점수에 boost 값을 곱하여 초기 점수를 설정 (boost: 2)
- functions 배열에 정의된 조건에 따라 추가적인 가중치를 적용하며 조건을 만족하는 문서의 점수는 해당 가중치로 곱해짐
- "transmission": "automatic" 일 때 가중치 1.2
- "condition": "excellent" 일 때 가중치 1.5
- "condition": "like new" 일 때 가중치 2
- 여러 가중치가 적용될 경우, 그 가중치를 모두 곱하여 최종 점수를 계산 (score_mode: multiply)
- 기본 점수와 boost 값, 그리고 functions 배열 내 가중치를 모두 곱하여 최종 점수를 계산 (boost_mode: multiply)
- 계산된 최종 점수가 min_score보다 낮은 문서는 검색 결과에서 제외됨 (min_score: 4.7)
참고
- 패스트 캠퍼스 - 고성능 검색 엔진 구축으로 한 번에 끝내는 Elasticsearch
'Elastic Search' 카테고리의 다른 글
[ELK] Beats 정리 (0) | 2024.06.25 |
---|---|
[ELK] Logstash 정리 (0) | 2024.06.25 |
[Elasticsearch] Fuzzy 쿼리 (0) | 2024.06.19 |
[Elasticsearch] 스크립트 쿼리 (0) | 2024.06.13 |
[Elasticsearch] 자동완성 (0) | 2024.06.12 |