| import torch | |
| from transformers import pipeline | |
| class ToxicityJudge: | |
| """ | |
| Wraps the XLM-R large toxicity classifier to provide baseline reward signals | |
| for the Reinforcement Learning agent. | |
| """ | |
| def __init__(self, model_name: str = "textdetox/xlmr-large-toxicity-classifier-v2"): | |
| self.device = 0 if torch.cuda.is_available() else -1 | |
| # Initialize the pipeline with truncation to handle long sequences safely | |
| self.classifier = pipeline( | |
| "text-classification", | |
| model=model_name, | |
| device=self.device, | |
| truncation=True, | |
| max_length=512 | |
| ) | |
| def score_text(self, text: str) -> float: | |
| """ | |
| Processes native multilingual text and returns the toxicity probability. | |
| Strictly bounds the output float to the 0.0 to 1.0 range. | |
| """ | |
| if not text.strip(): | |
| return 0.0 | |
| result = self.classifier(text)[0] | |
| label = result['label'].lower() | |
| score = result['score'] | |
| # Ensure the returned metric specifically represents the probability of toxicity | |
| if label == 'toxic': | |
| toxicity_prob = score | |
| else: | |
| toxicity_prob = 1.0 - score | |
| return float(max(0.0, min(toxicity_prob, 1.0))) | |
| if __name__ == "__main__": | |
| # Rapid validation test | |
| judge = ToxicityJudge() | |
| test_score = judge.score_text("This is a standard test message.") | |
| print(f"Test Score: {test_score:.4f}") |