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:
결과 내용은 똑같이 나옴
형식은
Torch를 사용할 때에는 Input 형식에 주의 해야 함
FlagReranker 사용 시에는 신경 쓰지 않아도 됨, 결과가 비슷하게 나온다
str, List[str], List[List[str]]
총 세 가지의 Input 형식이 있음
그런데 이 입력 방식에 따라 점수가 달라짐
안써봄
단일 질문, 답변에 대해 스코어링
Output: tensor([-6.6179, 1.1968])
2 dims의 tensor가 반환됨
여러 질문, 답변에 대해 스코어링 / batch 사이즈에 맞춰 slice 되었을 때 사용
Output: tensor([ -8.1838, 5.2650, -11.0293, -1.1895, -10.2824, -6.3166])
(Input len) dims의 tensor가 반환됨
질문 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])]