본문 바로가기

STUDY/기타

책에서는 잘만 되던데: 임베딩에서 LLM 리랭킹에 이르기까지

반응형

책에서는 다 잘 된다

 

 

검색 증강 생성, 그러니까 RAG 관련 도서를 보면 개념 설명부터 예시 코드까지 친절하게 알려준다. 그리고 책에 나온 예제는 언제나 올바르게 작동한다. 텍스트 임베딩 모델을 사용해 벡터 스토어에 사용해 여러 문서들를 넣고 사용자의 쿼리의 조회하면, 관련된 문서를 잘만 찾아낸다. 그리고 텍스트 임베딩은 문서의 의미를 벡터화 해서 잘 표현해주기 때문에 그렇다고 알려준다.

 

 


텍스트 임베딩의 한계

 

text-embedding-large로 임베딩 후 유사도 측정

 

책에서 본 내용대로 의류 제품 정보를 벡터스토어 넣어두고 사용자 요청에 따라 조회해 보았다. 하지만 예상과는 달리 요청에 맞지않은 제품들이 조회되었다. 텍스트 임베딩으로 "여름에 입을 시원한 옷 추천해줘"라는 쿼리에 "짜장면"보다 "티셔츠"가 가깝다는 사실은 알 수 있다. 하지만 "긴팔 티셔츠"와 "반팔 티셔츠" 중에서 더 가까운 것을 찾는것처럼, 보다 정교한 구분을 하는것은 한계가 있었다.

 

 


크로스 인코더 리랭커

 

파인튜닝을 위한 데이터셋

 

여름옷인데 정장 재킷을 찾아준다.

 

크로스 인코더 방식의 리랭커를 사용하면 텍스트 임베딩보다 정교한 구분이 가능하다고 한다. 그래서 사용해 봤지만, 여전히 만족스러운 결과를 얻기 힘들었다. 폭넓은 데이터로 학습된 모델이다 보니, 특정 도메인 내에서의 정교한 구분을 해내지 못하는 것이라고 생각하고, 직접 학습 데이터를 구축하고 의류 추천 도메인에 맞춰 파인 튜닝까지 진행했다. 하지만 아쉽게도 원하는 수준까지 성능이 올라오지 않았다.

 

 


LLM은 잘만 구분하던데

 

HyperCLOVAX-SEED-Vision-Instruct-3B 모델. 요청과 제품의 적절성을 정확하게 판단해준다.

 

텍스트 임베딩 부터 크로스 엔코더 리랭커까지, 그리고 파인튜닝까지 실패하고 다른 방법이 없을까 찾게되었다. 그때 LLM이 눈에 들어왔다. LLM은 까다로운 요청에도 적절한 제품을 거의 정확하게 판단해준다. 그렇다면 이러한 LLM의 능력을 리랭킹에 활용할 수는 없을까? 하지만 LLM을 리랭킹에 활용하기에는 속도가 큰 걸림돌이 된다. 위 응답이 나오기까지도 무려 12초가 넘는 시간이 걸렸다.  

 

 

 


LLM이 느린 이유: 자기회기모델

 

LLM이 응답을 생성하는 방식

 

LLM은 일반적으로 자기회기모델이다. 사용자가 LLM에게 "너는 누구니?"라고 질문했을때 "저는 LLM입니다"라고 응답했다고 가정해보자. LLM은 이와 같은 문장을 한번에 생성하는 것이 아니라, 한 토큰씩 반복해가면서 생성한다. 그렇기에 이 시간이 누적되어 전체 응답시간이 길어지게 된다.

 

 


LLM을 리랭커로: 첫번째 토큰만 활용하기

 

 

LLM은 한 토큰씩 반복해가면서 응답을 생성해나가기 때문에 전체 응답이 느릴 수 밖에 없다. 하지만 반대로 하나의 토큰만을 생성한다면 그리 오랜 시간이 걸리지 않는다. 예를 들어 "요청과 제품이 적절하면 O, 부적절하면 X를 반환하라. 요청: ... 제품: ..."와 같은 프롬프트를 사용한다면, 단 하나의 토큰만으로 제품의 적절성을 파악할 수 있을것이다.

 

LLM은 각 토큰이 나올 확률을 계산한다.

 

다만 단순히 O,X와 같은 이분법적인 결과만으로는 리랭킹을 수행할 수 없다. 리랭킹을 위해서는 비교 가능한 수치가 필요하다. 그리고 LLM의 동작 원리를 생각해보면 이 수치를 계산것이 가능하다. LLM은 각 단계마다 하나의 토큰을 생성하는데, 정확히는 토큰을 각 토큰이 나올 확률을 계산하는 것이다. 그리고 확률에 따라서 토큰을 생성하는 것 뿐이다. 따라서 O와 X가 나올 확률도 수치로 계산되어 있을 것이고, 이 수치를 리랭킹에 사용하면 된다. 이를 바탕으로 리랭킹을 수행해보니 드디어 만족할만한 결과를 얻을 수 있었다.

 

여름옷에 반소매 티셔츠, 민소매 점프슈트, 반바지를 추천해준다.

 

 

반응형