관련성 점수는 LLM 의 토큰 생성 확률값을 이용하거나, LLM에게 직접 점수를 산출해달라고 할 수 있다.
1
2
3
query="LLM은 리랭커로 어떻게 활용될 수 있나요?"prompt="참조 문서가 주어진 쿼리에 대한 적절한 답변인지 Yes 또는 No로 답변하세요."document="Retriever는 질문에 대한 후보 응답을 생성하는 역할을 한다."
확률값을 사용할 경우 확률값은, 문서가 질의에 대한 적합한 참조 문서인지에 대해 YES/NO 이진 분류 평가를 요청했을 때 YES 가 나올 확률 p를 사용할 수 있다.
이 때의 확률 p 는 LLM이 출력 토큰을 생성할 때 내부적으로 계산하는 log probability 기반의 확률값이다.
log probability
LLM 이 생성할 다음 토큰에 대한 확률분포 P(Wt | Context)를 뜻함
Softmax 함수를 통해 얻어지며, log probability 값으로도 제공 가능
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
importopenairesponse=openai.ChatCompletion.create(model="gpt-4",messages=[{"role":"system","content":"질문에 대한 관련성을 판단하세요."},{"role":"user","content":'''
질문: LLM은 리랭커로 어떻게 활용될 수 있나요?
참조 문서: Retriever는 질문과 유사한 벡터를 기준으로 문서를 추출한다.
'''}],logprobs=True,# 여기
max_tokens=10)# 로그 확률 값 확인
logprobs=response['choices'][0]['logprobs']
(2) Listwise
질의와 여러 후보 문서를 동시에 LLM 에 제공해, 전체 후보 문서를 관련성에 따라 순서를 재정렬 하는 방식
1
2
3
4
5
6
7
8
query="LLM은 리랭커로 어떻게 활용될 수 있나요?"prompt='''
아래 문서들을 주어진 쿼리와의 관련성이 높은 순서대로 순위를 매겨 답변하세요.
[A] LLM은 인간 수준의 의미 이해를 기반으로 질문과 문서 간의 깊은 연관성을 파악할 수 있다.
[B] Retriever는 질문과 유사한 벡터를 기준으로 문서를 추출한다.
[C] Cross-Encoder는 질의와 문서를 함께 처리해 높은 정확도를 보인다.
'''
별도의 확률 계산 없이 LLM 이 출력으로 준 순서대로 문서를 리랭킹할 수 있어 편리함
하지만 LLM 이 감당할 수 있는 토큰 수에 제한이 있으므로, 한 번에 평가할 수 있는 문서 수가 제한됨
이를 극복하고자 슬라이딩 윈도우 방식을 사용하기도 함
슬라이딩 윈도우(Sliding Window) 방식
-전체 N 개의 후보 문서들이 있다고 가정할 때
-윈도우 크기 w, 스텝 크기 s로 이동하며 점진적으로 리랭킹
비교
항목
Pointwise
Listwise
평가 방식
각 문서를 개별적으로 평가하여 관련성 점수 부여
전체 문서 집합을 함께 입력하여 순위를 매김
LLM 입력
쿼리 + 단일 문서
쿼리 + 복수 문서 (리스트 전체)
출력 형식
관련성 점수 또는 “Yes/No”
관련 문서 순서 (예: A > C > B)
장점
- 세밀한 점수 산정 가능 - LLM 토큰 확률 활용 가능
- 직관적인 결과 출력 - 문서 간 상대 비교에 최적화 - 추가 점수 해석 없이 바로 순위 생성 가능
단점
- 문서 간 상대 비교가 어려울 수도 있음 - 토큰 확률 계산 해석 필요
- 토큰 수 제한 있음 - 문서 수가 많을수록 처리 어려움
실습
실습 내용
탐색한 Reranking 방식을 직접 수행하봄
Cross-Encoder 방식, LLM as a Reranker 방식 실습
Cross-Encoder : Huggingface에 있는 BAAI/bge-reranker-v2-m3 모델
query='LLM을 리랭커로 사용할 때 장점은 무엇인가요?'search_documents=["[1] LLM은 여러 문서 중 핵심 정보를 추출하여 요약할 수 있다.","[2] 사전학습된 LLM은 다양한 도메인 지식에 기반한 추론이 가능하다.","[3] LLM은 질의와 문서 간의 의미적 유사성을 깊이 있게 파악할 수 있다.","[4] LLM은 기존 리랭커보다 더 복잡한 문맥을 이해할 수 있는 능력을 갖고 있다.","[5] LLM은 Zero-shot 환경에서도 강력한 관련성 판단을 수행할 수 있다.","[6] Cross-Encoder 방식의 LLM은 질문과 문서를 동시에 고려한다.","[7] LLM은 사용자 질의의 숨겨진 의도까지 파악해 정교한 평가가 가능하다.","[8] 전통적인 BM25 기반 리랭커는 단어 수준 유사도에 한정된다.","[9] Transformer 기반 구조는 멀티턴 질의에도 높은 정확도를 보인다.","[10] 기존 Cross-Encoder는 유연성에서 LLM에 비해 제한적이다.","[11] LLM은 구조화되지 않은 자유 문장도 효과적으로 분석할 수 있다.","[12] LLM은 질의와 문서 간의 상호작용을 문맥 수준에서 학습한다.","[13] 단어 일치보다 의미 일치에 기반한 리랭킹이 가능하다.","[14] LLM은 복잡한 개념 연결 관계도 이해할 수 있다.","[15] 기존 리랭커는 사전 정의된 feature에 의존하는 경우가 많다.","[16] LLM은 이전 학습 데이터 외의 질문에도 유연하게 대응한다.","[17] LLM은 하나의 프롬프트로 여러 유형의 판단을 수행할 수 있다.","[18] 사용자의 질문 의도와 답변 사이의 간극을 줄이는 데 효과적이다.","[19] 대규모 파라미터를 가진 LLM은 문맥 분별력이 뛰어나다.","[20] LLM은 수치 기반 점수보다 자연어 기반 판단에 더 적합하다.",]
fromtransformersimportAutoModelForSequenceClassification,AutoTokenizerimporttorchtokenizer=AutoTokenizer.from_pretrained('BAAI/bge-reranker-v2-m3')model=AutoModelForSequenceClassification.from_pretrained('BAAI/bge-reranker-v2-m3')model.eval()# 질의와 문서를 하나의 리스트에 묶어 준비
# 아래에서 각각의 질의-문서 쌍이 하나의 입력으로 결합됨
pairs=[[query,document]fordocumentinsearch_documents]# (1) 질의와 문서를 결합하여 하나의 텍스트로 토크나이징
# (2) padding 및 truncation을 적용하여 모델 입력 형식으로 변환
withtorch.no_grad():inputs=tokenizer(pairs,padding=True,truncation=True,return_tensors='pt',max_length=512)scores=model(**inputs,return_dict=True).logits.view(-1,).float()# 질의와 문서가 얼마나 관련 있는지 점수(logit)를 계산
# score 기준 관련성이 높은 순서대로 정렬해서 출력
# score 가 높을수록 질의와 문서 간 관련성이 높다는 의미
# 양수 : 관련성 있음 / 0 근처 : 중립적이거나 관련성 불확실 / 음수 : 관련성이 낮거나 없음
sim_score_result=[[sentence,score]forsentence,scoreinzip(search_documents,scores)]sim_score_result=sorted(sim_score_result,key=lambdax:x[1],reverse=True)sim_score_result
# 결과
[4]LLM은기존리랭커보다더복잡한문맥을이해할수있는능력을갖고있다.tensor(1.5858)[19]대규모파라미터를가진LLM은문맥분별력이뛰어나다.tensor(-3.5372)[7]LLM은사용자질의의숨겨진의도까지파악해정교한평가가가능하다.tensor(-4.7256)[15]기존리랭커는사전정의된feature에의존하는경우가많다.tensor(-4.9283)[20]LLM은수치기반점수보다자연어기반판단에더적합하다.tensor(-5.3553)[1]LLM은여러문서중핵심정보를추출하여요약할수있다.tensor(-5.3571)[10]기존Cross-Encoder는유연성에서LLM에비해제한적이다.tensor(-5.4176)[17]LLM은하나의프롬프트로여러유형의판단을수행할수있다.tensor(-5.8128)[11]LLM은구조화되지않은자유문장도효과적으로분석할수있다.tensor(-5.8304)[16]LLM은이전학습데이터외의질문에도유연하게대응한다.tensor(-5.8559)[5]LLM은Zero-shot환경에서도강력한관련성판단을수행할수있다.tensor(-6.0521)[13]단어일치보다의미일치에기반한리랭킹이가능하다.tensor(-6.1061)[3]LLM은질의와문서간의의미적유사성을깊이있게파악할수있다.tensor(-6.5490)[2]사전학습된LLM은다양한도메인지식에기반한추론이가능하다.tensor(-6.7263)[8]전통적인BM25기반리랭커는단어수준유사도에한정된다.tensor(-6.8096)[14]LLM은복잡한개념연결관계도이해할수있다.tensor(-7.3066)[6]Cross-Encoder방식의LLM은질문과문서를동시에고려한다.tensor(-7.8556)[12]LLM은질의와문서간의상호작용을문맥수준에서학습한다.tensor(-8.0627)[18]사용자의질문의도와답변사이의간극을줄이는데효과적이다.tensor(-8.6381)[9]Transformer기반구조는멀티턴질의에도높은정확도를보인다.tensor(-10.2660)
# openai 0.28 버전 사용. (1.0 이상은 logprobs 옵션 사라짐)
importopenaiimportdotenvimportosimportmathenv_path='/Users/jongya/Desktop/github/shopping_llm_recommendation/lab/reranker/jupyter/.env'dotenv.load_dotenv(env_path)openai.api_key=os.getenv('OPENAI_API_KEY')defpointwise(query,document):response=openai.ChatCompletion.create(model="gpt-4o",messages=[{"role":"system","content":"질문과 문서 간 관련성 판단해 Yes 나 No 중 하나로 답변하세요."},{"role":"user","content":f"질문: {query} 문서: {document}"}],logprobs=True,# 핵심 옵션!
max_tokens=10)returnresponse['choices'][0]['logprobs']# 로그 확률 값 확인
result_list=[]fordocumentinsearch_documents:logprobs=pointwise(query=query,document=document)# 답변 (Yes / No)
reply=logprobs['content'][0]['token']iflogprobs['content'][0]['token']!='\\xeb\\x8b'else'No'# Yes = 1 / No = -1
sign=1iflogprobs['content'][0]['token']=='Yes'else-1# 확률값 p = e^log(p)
p=math.exp(logprobs['content'][0]['logprob'])# 결과 적재
result_list.append([document,reply,p,p*sign])# 결과 정렬
result_list=sorted(result_list,key=lambdax:x[3],reverse=True)# 출력
forresultinresult_list:print(result[0],result[3])
# 결과
[3]LLM은질의와문서간의의미적유사성을깊이있게파악할수있다.0.9999998063873693[4]LLM은기존리랭커보다더복잡한문맥을이해할수있는능력을갖고있다.0.999999448776502[13]단어일치보다의미일치에기반한리랭킹이가능하다.0.999999448776502[7]LLM은사용자질의의숨겨진의도까지파악해정교한평가가가능하다.0.999999091165777[19]대규모파라미터를가진LLM은문맥분별력이뛰어나다.0.9999989719621736[5]LLM은Zero-shot환경에서도강력한관련성판단을수행할수있다.0.9999984951481292[12]LLM은질의와문서간의상호작용을문맥수준에서학습한다.0.9999984951481292[6]Cross-Encoder방식의LLM은질문과문서를동시에고려한다.0.9999858596583402[2]사전학습된LLM은다양한도메인지식에기반한추론이가능하다.0.9999720323248966[17]LLM은하나의프롬프트로여러유형의판단을수행할수있다.0.9997378641193743[10]기존Cross-Encoder는유연성에서LLM에비해제한적이다.0.9992882983079844[20]LLM은수치기반점수보다자연어기반판단에더적합하다.0.9980715604067301[11]LLM은구조화되지않은자유문장도효과적으로분석할수있다.0.9975256269669018[18]사용자의질문의도와답변사이의간극을줄이는데효과적이다.0.9959293105107246[14]LLM은복잡한개념연결관계도이해할수있다.0.9820125102859462[16]LLM은이전학습데이터외의질문에도유연하게대응한다.0.7772967623259942[15]기존리랭커는사전정의된feature에의존하는경우가많다.-0.817571080607408[1]LLM은여러문서중핵심정보를추출하여요약할수있다.-0.9241343417785254[9]Transformer기반구조는멀티턴질의에도높은정확도를보인다.-0.9914205538951522[8]전통적인BM25기반리랭커는단어수준유사도에한정된다.-0.9992891321213027
importopenaiimportdotenvimportosimportmathenv_path='/Users/jongya/Desktop/github/shopping_llm_recommendation/lab/reranker/jupyter/.env'dotenv.load_dotenv(env_path)openai.api_key=os.getenv('OPENAI_API_KEY')deflistwise(query,documents:str):response=openai.ChatCompletion.create(model="gpt-4o",messages=[{"role":"system","content":'''아래 문서들을 주어진 쿼리와의 관련성이 높은 순서대로 순위를 매겨 답변하세요.
(1) 별다른 설명은 넣지 마세요.
(2) 주어지는 모든 문서(20개)에 대해 순서를 매겨 답변해야 합니다.
(3) [20] > [10] > [9] 와 같이 답변하세요.'''},{"role":"user","content":f"질문: {query}\n\n 문서: \n{document}"}],max_tokens=1000)returnresponse['choices']# 넣을 문서 텍스트로 변환
documents=''fordocumentinsearch_documents:documents+=document+'\n'# 리랭킹 요청
result=listwise(query,documents)# 결과
result[0]['message']['content']
1
2
3
4
# 출력
[20]>[1]>[2]>[3]>[4]>[5]>[6]>[7]>[8]>[9]>[10]>[11]>[12]>[13]>[14]>[15]>[16]>[17]>[18]>[19]
Comments