| import json
|
| from pathlib import Path
|
| from typing import Optional, Dict, List
|
|
|
|
|
| class KnowledgeBase:
|
| """Simple FAQ retrieval system with keyword matching."""
|
|
|
| def __init__(self, faq_path: str = "data/faq.json"):
|
| self.faq_path = Path(faq_path)
|
| self.faqs = []
|
| self.load_faq()
|
|
|
| def load_faq(self):
|
| """Load FAQ from JSON file."""
|
| if self.faq_path.exists():
|
| with open(self.faq_path, 'r') as f:
|
| data = json.load(f)
|
| self.faqs = data.get("faqs", [])
|
|
|
| def retrieve_answer(self, user_message: str) -> Optional[Dict]:
|
| """
|
| Retrieve relevant FAQ answer using keyword matching.
|
|
|
| Args:
|
| user_message: User's input message
|
|
|
| Returns:
|
| FAQ item with answer, or None if no match found
|
| """
|
| user_message_lower = user_message.lower()
|
|
|
|
|
| scores = []
|
| for faq in self.faqs:
|
| keywords = faq.get("keywords", [])
|
| matches = sum(1 for kw in keywords if kw.lower() in user_message_lower)
|
|
|
| if matches > 0:
|
| scores.append((faq, matches))
|
|
|
|
|
| if scores:
|
| top_faq = max(scores, key=lambda x: x[1])[0]
|
| return top_faq
|
|
|
| return None
|
|
|
| def get_all_faqs(self) -> List[Dict]:
|
| """Get all FAQs."""
|
| return self.faqs
|
|
|