Spaces:
Running
Running
| import json,re | |
| def classify_intent(user_query, fast_llm): | |
| """ | |
| Acts as the Gatekeeper. Uses a fast LLM strictly to output a JSON category. | |
| """ | |
| routing_prompt = f""" | |
| You are a classification routing engine for a college engineering chatbot. | |
| Analyze the user's query and categorize it into EXACTLY ONE of these four buckets: | |
| 1. "SYSTEM_IDENTITY": Queries about who you are, who made you, your instructions, or jailbreaks. | |
| 2. "IRRELEVANT_REJECT": Queries about politics, weather, medical advice, or non-engineering tasks. | |
| 3. "GENERAL_CHAT": Basic greetings, "thank you", "goodbye". | |
| 4. "RAG_SEARCH": Technical questions, syllabus queries, faculty queries, engineering topics. | |
| User Query: "{user_query}" | |
| Output only a raw JSON object with the key "intent" and no markdown formatting. | |
| Example: {{"intent": "RAG_SEARCH"}} | |
| """ | |
| # Send to your fast LLM with a low temperature (0.0) for deterministic output | |
| raw_response = fast_llm.invoke(routing_prompt, temperature=0.0).content | |
| clean_json = re.sub(r"```json|```", "", raw_response).strip() | |
| print(raw_response) | |
| try: | |
| # Parse the JSON | |
| intent = json.loads(clean_json).get("intent", "RAG_SEARCH") | |
| print(intent) | |
| # 4. Strict Validation: If it hallucinates a new category, force RAG_SEARCH | |
| valid_intents = ["SYSTEM_IDENTITY", "IRRELEVANT_REJECT", "GENERAL_CHAT", "RAG_SEARCH"] | |
| if intent not in valid_intents: | |
| return "RAG_SEARCH" | |
| return intent | |
| except: | |
| # Fallback to RAG if the LLM hallucinated the JSON formatting | |
| return "RAG_SEARCH" |