Spaces:
Sleeping
Sleeping
| from endpoints.api_models import OutputGuardrailsConfig , LLMResponse | |
| from model_inference.groundedness_checker import GroundednessChecker | |
| import re | |
| # | |
| groundedness_checker = GroundednessChecker(model_path="./grounding_detector") | |
| # A simple result class to hold individual check outcomes. | |
| class Result: | |
| def __init__(self): | |
| self.details = {} | |
| def add(self, rule_name: str, passed: bool): | |
| self.details[rule_name] = passed | |
| def grounded(self) -> bool: | |
| # The response is considered "grounded" if all enabled rules pass. | |
| return all(self.details.values()) | |
| class ContextualGroundednessCheck: | |
| name = "Contextual Groundedness" | |
| def check(self,llm_response:LLMResponse) -> bool: | |
| groundedness_check = groundedness_checker.check(llm_response.question, llm_response.answer, llm_response.context) | |
| print(groundedness_check) | |
| return groundedness_check['is_grounded'] | |
| class ToxicityRule: | |
| name = "Toxicity" | |
| def check(self, llm_response:LLMResponse) -> bool: | |
| no_toxicity = True | |
| matched = re.search(r"(hate|kill|suicide|selfharm)", llm_response.answer, re.IGNORECASE) | |
| if matched: | |
| no_toxicity = False | |
| return no_toxicity | |
| # Manager class to load and execute the enabled guardrail rules. | |
| class GuardrailsManager: | |
| def __init__(self, config: OutputGuardrailsConfig): | |
| self.config = config | |
| self.rules = self.load_rules() | |
| def load_rules(self): | |
| rules = [] | |
| if self.config.contextual_grounding: | |
| rules.append(ContextualGroundednessCheck()) | |
| if self.config.toxicity: | |
| rules.append(ToxicityRule()) | |
| # Add additional rules based on configuration here. | |
| return rules | |
| def check(self, llm_response: LLMResponse) -> Result: | |
| result = Result() | |
| for rule in self.rules: | |
| rule_result = rule.check(llm_response) | |
| result.add(rule.name, rule_result) | |
| return result | |