bge-reranker-v2-m3

손경현·2024년 10월 2일

사용법

FlagReranker, Torch

https://github.com/FlagOpen/FlagEmbedding/blob/master/FlagEmbedding/reranker/README.md
두 가지 사용 방법이 있음

from FlagEmbedding import FlagReranker
reranker = FlagReranker('BAAI/bge-reranker-v2-m3', use_fp16=True) # Setting use_fp16 to True speeds up computation with a slight performance degradation

scores = reranker.compute_score(test)
print(scores)
import torch
from transformers import AutoModelForSequenceClassification, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained('BAAI/bge-reranker-v2-m3')
model = AutoModelForSequenceClassification.from_pretrained('BAAI/bge-reranker-v2-m3')
model.eval()

with torch.no_grad(): 
    inputs = tokenizer(test, padding=True, truncation=True, return_tensors='pt', max_length=512)
    scores = model(**inputs, return_dict=True).logits.view(-1, ).float()
    print(scores)

Output:
결과 내용은 똑같이 나옴
형식은

  • FlagReranker : List
  • Torch : Tensor

Input

Torch를 사용할 때에는 Input 형식에 주의 해야 함
FlagReranker 사용 시에는 신경 쓰지 않아도 됨, 결과가 비슷하게 나온다
str, List[str], List[List[str]]
총 세 가지의 Input 형식이 있음
그런데 이 입력 방식에 따라 점수가 달라짐

str

안써봄

List[str]

단일 질문, 답변에 대해 스코어링
Output: tensor([-6.6179, 1.1968])
2 dims의 tensor가 반환됨

  • index 0 : 질문에 대한 어떤 점수 (같은 질문을 넣으면 비슷한 점수가 나옴, 동일하지 않고 미세한 차이가 날 때 있음)
  • index 1 : score

List[List[str]]

여러 질문, 답변에 대해 스코어링 / batch 사이즈에 맞춰 slice 되었을 때 사용
Output: tensor([ -8.1838, 5.2650, -11.0293, -1.1895, -10.2824, -6.3166])
(Input len) dims의 tensor가 반환됨

UseCase

질문 A - 답변 A
질문 A - 답변 B
질문 A - 답변 C
와 같이 질문이 같고 답변이 여러 가지이며, 이를 비교하고 싶을 때는 List[str]으로 여러 번 시행하는 것 보다 List[List[str]]으로 한 번에 던져주는 것이 좋음 (내 경험상 더 정확한 듯)

예시

  • Code

      test = [
      ['what is panda?', 'hi'], ['what is panda?', 'The giant panda (Ailuropoda melanoleuca), sometimes called a panda bear or simply panda, is a bear species endemic to China.'],
      ['안녕? 네 이름은 뭐야?', '이 꽃 정말 이쁘다.'], ['안녕? 네 이름은 뭐야?', '안녕하세요, 제 이름은 XXX입니다.'], 
      ['판다는 무엇입니까?', '안녕하세요.'], ['판다는 무엇입니까?', '자이언트 팬더(Ailuropoda melanoleuca)는 팬더곰 또는 간단히 팬더라고 불리며, 중국 고유의 곰 종입니다.']
    ]
    
      ### FlagReranker, Input: List[List[str]]
    
      from FlagEmbedding import FlagReranker
      reranker = FlagReranker('BAAI/bge-reranker-v2-m3', use_fp16=True) # Setting use_fp16 to True speeds up computation with a slight performance degradation
    
      scores = reranker.compute_score(test)
      print(scores)
    
      ### FlagReranker, Input: List[str]
    
      from FlagEmbedding import FlagReranker
      reranker = FlagReranker('BAAI/bge-reranker-v2-m3', use_fp16=True) # Setting use_fp16 to True speeds up computation with a slight performance degradation
    
      result = []
    
      for i in test:
          scores = reranker.compute_score(i)
          result.append(scores)
    
      print(result)
    
      ### Local Torch, Input: List[List[str]]
    
      import torch
      from transformers import AutoModelForSequenceClassification, AutoTokenizer
    
      tokenizer = AutoTokenizer.from_pretrained('BAAI/bge-reranker-v2-m3')
      model = AutoModelForSequenceClassification.from_pretrained('BAAI/bge-reranker-v2-m3')
      model.eval()
    
      with torch.no_grad(): 
          inputs = tokenizer(test, padding=True, truncation=True, return_tensors='pt', max_length=512)
          # print(inputs)
          scores = model(**inputs, return_dict=True).logits.view(-1, ).float()
          print(scores)
    
      ### Local Torch, Input: List[str]
      result = []
    
      for i in test:
          with torch.no_grad(): 
              inputs = tokenizer(i, padding=True, truncation=True, return_tensors='pt', max_length=512)
              # print(inputs)
              scores = model(**inputs, return_dict=True).logits.view(-1, ).float()
              result.append(scores)
    
      print(result)        
  • Output

    [-8.183819770812988, 5.265038013458252, -11.029317855834961, -1.1895331144332886, -10.282388687133789, -6.31662654876709]
    [[-8.183816909790039], [5.2650370597839355], [-11.029317855834961], [-1.1895328760147095], [-10.282386779785156], [-6.316624641418457]]
    tensor([ -8.1838,   5.2650, -11.0293,  -1.1895, -10.2824,  -6.3166])
    [tensor([-6.6721, -0.4191]), tensor([-6.6721, -0.0132]), tensor([-4.2597, -1.4813]), tensor([-4.2597, -4.8579]), tensor([-6.6178,  0.2903]), tensor([-6.6179,  1.1968])]
profile
개린이

0개의 댓글