Spaces:
Running
Running
| """End-to-end support agent: classify intent -> generate response -> return result.""" | |
| from pathlib import Path | |
| from typing import Dict | |
| from loguru import logger | |
| from src.generation.response_generator import ResponseGenerator | |
| from src.models.intent_classifier import IntentClassifier | |
| class SupportAgent: | |
| """Two-stage customer support automation pipeline. | |
| Stage 1: DistilBERT intent classifier. | |
| Stage 2: LLM response generator conditioned on the classified intent. | |
| Args: | |
| classifier: Fitted IntentClassifier instance. | |
| generator: Initialised ResponseGenerator instance. | |
| low_confidence_threshold: Confidence below which queries are flagged | |
| for human review. | |
| """ | |
| def __init__( | |
| self, | |
| classifier: IntentClassifier, | |
| generator: ResponseGenerator, | |
| low_confidence_threshold: float = 0.70, | |
| ) -> None: | |
| self.classifier = classifier | |
| self.generator = generator | |
| self.low_confidence_threshold = low_confidence_threshold | |
| def resolve(self, query: str) -> Dict: | |
| """Classify a query and generate a support response.""" | |
| intent, confidence = self.classifier.predict(query) | |
| logger.debug(f"Classified '{query[:60]}' -> {intent} ({confidence:.3f})") | |
| response, context = self.generator.generate(query, intent) | |
| logger.debug(f"Generated response ({len(response)} chars)") | |
| return { | |
| "query": query, | |
| "predicted_intent": intent, | |
| "confidence": confidence, | |
| "response": response, | |
| "context": context, | |
| "requires_human": confidence < self.low_confidence_threshold, | |
| } | |
| def build_agent(cfg: dict) -> SupportAgent: | |
| """Build a SupportAgent from config, loading the saved DistilBERT model.""" | |
| model_dir = str(Path(cfg["paths"]["models_distilbert"]) / "best") | |
| classifier = IntentClassifier( | |
| model_dir=model_dir, | |
| max_length=cfg["classifier"]["max_length"], | |
| ) | |
| generator = ResponseGenerator(cfg=cfg) | |
| return SupportAgent( | |
| classifier=classifier, | |
| generator=generator, | |
| low_confidence_threshold=cfg["generation"]["low_confidence_threshold"], | |
| ) | |