LLM 리랭킹 성능 최적화: ‘위치 편향’ 해결하고 추천 정확도 높이는 법
비싼 API 비용을 들여 GPT-4o를 우리 서비스 추천 엔진(Reranker)으로 도입했는데, 오히려 기존의 가벼운 모델보다 성능이 안 나온다면 어떨까요?
당혹스럽겠지만, 실제로 벌어지고 있는 일입니다. 최근 일리노이 시카고 대학(UIC) 연구팀이 발표한 논문(Prompt-Based LLMs for Position Bias-Aware Reranking)에 따르면, 우리가 LLM의 ‘지능’만 믿고 간과했던 치명적인 약점이 하나 있습니다.
오늘은 그 약점이 무엇인지, 그리고 코드 한 줄로 성능을 반전시킬 수 있는 기막힌 꼼수를 소개해 드립니다.
LLM의 고질병: “먼저 말한 게 장땡”
우리가 흔히 LLM에 추천을 맡기는 방식은 이렇습니다.
- 기존 모델: 수만 개의 아이템 중 후보군 20개를 추린다.
- 프롬프트: “이 유저는 A, B, C를 봤어. 아래 20개 중 뭘 좋아할까?”라며 리스트를 준다.
- LLM: 순위를 다시 매긴다(Reranking).
여기서 위치 편향(Position Bias)이 발생합니다. LLM은 면접관이 첫 번째 지원자에게 강한 인상을 받는 것처럼, 프롬프트 앞쪽에 적힌 정보에 과도하게 꽂히는 경향이 있습니다.
실제 실험 결과
- 대상: MovieLens-100K 데이터셋
- 비교: 전통적인 LightGCN vs GPT-4o 리랭킹
- 결과: GPT-4o를 썼더니 오히려 성능(NDCG)이 하락했습니다.
비싼 돈 들여서 모델 지능을 높였더니, 정작 추천은 엉망이 된 셈이죠.
“편향 갖지 마”라고 말하면 해결될까?
보통 이 단계에서 개발자들은 프롬프트에 지시사항(Instruction)을 추가합니다. “사용자의 기록은 배치 순서에 영향을 받았을 수 있으니 공정하게 평가해”라고 말이죠.
결론부터 말씀드리면, 아무 효과 없습니다.
| 구분 | 프롬프트 내용 | 결과 |
|---|---|---|
| A (기본) | “순위를 재정렬해줘” | 성능 하락 |
| B (지시 추가) | “위치 편향을 고려해서 공정하게 정렬해줘” | 여전히 성능 하락 (효과 없음) |
LLM은 “공정하게 해”라는 추상적인 자연어 지시를 실제 확률 계산 단계에 반영하지 못합니다. 마치 편견이 가득한 사람에게 “편견 갖지 말고 봐”라고 말만 한다고 해서 바로 객관적이 되지 않는 것과 비슷합니다.
해결책: 인과관계를 깨뜨리는 ‘카드 섞기’
연구팀이 찾아낸 해결책은 허무할 정도로 간단합니다. 유저의 히스토리 순서를 랜덤하게 섞어서(Shuffling) 넣는 것입니다.
우리는 보통 ‘시간 순서(최신순)’가 중요하다고 생각해서 A → B → C 순으로 데이터를 넣어줍니다. 하지만 LLM에게는 이 정돈된 순서가 오히려 ‘앞쪽 아이템에 집착하게 만드는’ 독이 됩니다.
- 나쁜 사례 (Chronological): [최근 본 영화 1, 2, 3…] → 모델이 앞쪽 데이터에 매몰됨.
- 올바른 사례 (Random Shuffled): [영화 2, 1, 3…] → 순서의 힘이 빠지면서 모델이 비로소 ‘콘텐츠의 맥락’을 보기 시작함.
단순히 random.shuffle() 한 줄을 추가했을 뿐인데, 모든 지표에서 기존 GPT-4o의 성능을 압도하는 결과가 나왔습니다.
개발자를 위한 3단계 액션 플랜
지금 당장 여러분의 추천 파이프라인에 다음 3가지를 적용해 보세요.
- 프롬프트로 실랑이하지 마세요: “편향을 없애줘” 같은 지시는 토큰 낭비일 뿐입니다.
- 데이터를 무작위로 섞으세요: 유저 히스토리를 프롬프트에 넣기 전, 무조건 순서를 섞으세요. 시간적 맥락을 지키는 것보다 편향을 깨는 것이 성능 향상에 훨씬 유리합니다.
- 하이브리드 구조를 쓰세요: 처음부터 LLM을 쓰지 마세요. LightGCN 같은 가벼운 모델로 20~50개를 먼저 뽑고, LLM은 최종 리랭킹에만 투입하는 2-Stage 방식이 가장 효율적입니다.
마치며: 때로는 무질서가 답이다
LLM은 마법의 지팡이가 아니라, 특성이 뚜렷한 도구일 뿐입니다. 도구가 말을 안 들을 땐 “잘 좀 해봐”라고 타이르기보다, 도구가 일하기 편하게 데이터의 구조를 바꿔주는 것이 진짜 엔지니어링이죠.
혹시 지금 추천 모델의 성능이 정체되어 있나요? 그럼 일단 데이터를 섞어보세요. 의외의 정확도는 그 무질서 속에서 나올지도 모릅니다.
