| from prompt_injection.evaluators.base import PromptEvaluator | |
| from transformers import GPT2Tokenizer, GPT2LMHeadModel,GPT2Model | |
| import torch | |
| import numpy as np | |
| class GPT2PerplexityEvaluator(PromptEvaluator): | |
| def __init__(self,model_name='gpt2') -> None: | |
| super().__init__() | |
| self.model_name=model_name | |
| self.tokenizer_gpt2 = GPT2Tokenizer.from_pretrained('gpt2') | |
| self.model_gpt2 = GPT2LMHeadModel.from_pretrained('gpt2') | |
| def calculate_perplexity(self,sentence): | |
| inputs = self.tokenizer_gpt2(sentence, return_tensors='pt') | |
| input_ids = inputs['input_ids'] | |
| with torch.no_grad(): | |
| outputs = self.model_gpt2(input_ids, labels=input_ids) | |
| # Calculate the loss | |
| loss = outputs.loss | |
| perplexity = torch.exp(loss) | |
| return perplexity | |
| def eval_sample(self,sample): | |
| try: | |
| return self.calculate_perplexity(sample) | |
| except Exception as err: | |
| print(err) | |
| return np.nan | |
| def get_name(self): | |
| return 'Perplexity' |