kNN은 Classical한 ML에서도 자주 사용되지만, LLM분야에서는 RAG에서 언급되는 VectorSearch의 시작같은 개념이다. kNN 개념은 최근접 이웃이라는 이름과 같이 직관적이다. 가장 가까운 k개의 벡터를 찾는 것이다. BaselineRAG에서는 이를 chunk로 Embedding 하였기 때문에 해당 chunk를 찾아온다. 일반적으로 유클라디안거리 혹은 코사인 유사도로 해당 '가까움'에 대한 정의를 얻는다.
그러면 많은 k를 찾게 하면 좋겠지만 너무 많은 k를 찾게하면 RAG 프롬프트에 주입되는 내용에 노이즈가 많이 생기기 때문에 현재 내용과 차원에 맞는 적절한 k를 실험적으로 설정하는 것이 좋다. 프로덕트로 진행시 비용이 다소 비싼 외부 API의 모델이라면 비용 또한 무시할 수 없다.
아래는 sklearn의 KNClassifier 기준의 하이퍼파라미터 목록이다.
| 파라미터 | 기본값 | 설명 |
| n_neighbors | 5 | 예측 시 고려할 이웃의 수 (K 값) |
| weights | 'uniform' | 이웃의 가중치: 'uniform' (동일) 또는 'distance' (가까울수록 더 큰 가중치), 또는 사용자 정의 함수 |
| algorithm | 'auto' | 이웃 탐색 알고리즘: 'auto', 'ball_tree', 'kd_tree', 'brute' |
| leaf_size | 30 | ball_tree나 kd_tree 알고리즘에 사용되는 리프 노드 크기 (메모리/속도 영향) |
| p | 2 | Minkowski 거리의 제곱 지수: p=2는 유클리디안 거리, p=1은 맨해튼 거리 |
| metric | 'minkowski' | 거리 측정 방식: 'euclidean', 'manhattan', 'cosine', 'chebyshev' 등 |
| metric_params | None | 거리 계산에 사용하는 추가 파라미터 (예: 마할라노비스 거리에서는 공분산 행렬 등) |
| n_jobs | None | 거리 계산 시 사용할 CPU 수 (-1이면 모든 CPU 사용) |
kNN은 유클라디안 거리, 코사인 유사도 등으로 구현되는만큼 매우 직관적이지만 아래의 한계점도 존재한다.
1. 차원의 저주 ( Curse of Dimensionality )
존재하는 데이터량에 비해 차원만 너무 커진다면 최근접하는 이웃 자체가 없어져버린다. 즉 제대로 된 검색이 시행되지 않는다.
[해결 가능 방법]
-> 차원 자체를 raw 데이터 내에서 줄임
-> OverSampling, SMOTE 등으로 중요 데이터량 추가 생성
-> PCA 등 사용하여 알고리즘 차원에서 차원을 줄임
-> 유클라디안 거리 등이 아닌 코사인 유사도 사용
2.과적합 ( Overfitting ) 및 클래스불균형
k갯수가 부족하거나 벡터임베딩 품질 문제로 발생하는 경우가 많다. 혹은 클래스가 불균형할 때도 발생한다.
[해결 가능 방법]
-> OverSampling, SMOTE 등으로 중요 데이터량 추가 생성
-> Class Weight 조정 ( 모델 손실 계산 시 더 큰 패널티 부여 )
-> Distance Weight 조정 ( 가까운 이웃이 소수 클래스면 더 큰 점수 부여 )
-> 불용어, 특수문자 등 노이즈 제거
-> 임베딩 후 정규화 ( L2-normalize로 거리보다 방향성 강조 / 코사인유사도와 거의 동일 )
-> hybrid search로 Vector
-> ReRanker로 특정 Meta Category의 데이터 가중치 상승
'LLM' 카테고리의 다른 글
| OpenSearch 란 ? - AWS의 ElasticSearch, 신흥 Vector 검색의 강자가 될 것인가 (0) | 2025.05.14 |
|---|---|
| bm25란 ? - TF IDF의 진화형 (0) | 2025.05.13 |
| aNN(Approximate Nearest Neighbor) (0) | 2025.05.12 |
| LlmaIndex vs Langchain 01 - 라마인덱스 (0) | 2025.05.05 |
| RAG ( Retrieval-Augmented Generation ) 미래는 ? - 과연 돈이 될 것인가 (0) | 2025.05.03 |