import sys sys.dont_write_bytecode = True import unicodedata import numpy import sentencepiece from helper import onnxSessionBuild pathModel = "./" rerankerBatchLength = 8 rerankerTokenMax = 512 rerankerPromptTokenMax = 128 rerankerBosId = 0 rerankerPadId = 1 rerankerEosId = 2 rerankerUnkId = 3 rerankerOffset = 1 sentencepieceReranker = sentencepiece.SentencePieceProcessor() sentencepieceReranker.Load(f"{pathModel}sentencepiece.bpe.model") onnxSessionReranker = onnxSessionBuild(f"{pathModel}onnx/model.onnx") def rerankTokenize(text): resultList = [] for spmId in sentencepieceReranker.encode(text, out_type=int): if spmId == 0: resultList.append(rerankerUnkId) else: resultList.append(spmId + rerankerOffset) return resultList def rerank(prompt, textList): scoreList = [] promptIdList = rerankTokenize(prompt) if len(promptIdList) > rerankerPromptTokenMax: promptIdList = promptIdList[0:rerankerPromptTokenMax] for a in range(0, len(textList), rerankerBatchLength): batchList = textList[a:a + rerankerBatchLength] sequenceList = [] lengthMax = 0 for b in range(len(batchList)): textIdList = rerankTokenize(batchList[b]) lengthText = rerankerTokenMax - len(promptIdList) - 4 if len(textIdList) > lengthText: textIdList = textIdList[0:lengthText] idList = [rerankerBosId] + promptIdList + [rerankerEosId, rerankerEosId] + textIdList + [rerankerEosId] if len(idList) > lengthMax: lengthMax = len(idList) sequenceList.append(idList) inputIds = numpy.full((len(sequenceList), lengthMax), rerankerPadId, dtype=numpy.int64) attentionMask = numpy.zeros((len(sequenceList), lengthMax), dtype=numpy.int64) for b in range(len(sequenceList)): inputIds[b, 0:len(sequenceList[b])] = sequenceList[b] attentionMask[b, 0:len(sequenceList[b])] = 1 feedObject = {"input_ids": inputIds, "attention_mask": attentionMask} logits = onnxSessionReranker.run(["logits"], feedObject)[0] for b in range(len(logits)): scoreList.append(float(1.0 / (1.0 + numpy.exp(-logits[b][0])))) return scoreList prompt = unicodedata.normalize("NFKC", "what is panda?") textList = [ "The giant panda (Ailuropoda melanoleuca), sometimes called a panda bear, is a bear species endemic to China.", "hi", "パンダはクマ科の哺乳類で、中国の固有種である。" ] for a in range(len(textList)): textList[a] = unicodedata.normalize("NFKC", textList[a]) scoreList = rerank(prompt, textList) for a in range(len(textList)): print(f"{scoreList[a]:.6f} | {textList[a]}")