""" Question answering agent implementation """ import os import re import logging from typing import Dict, Any, Optional from knowledge_base import KnowledgeBase from file_processors import FileProcessor, SpreadsheetProcessor from content_analyzer import QuestionAnalyzer, ContentAnalyzer # Configure logging logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') logger = logging.getLogger(__name__) class QueryProcessor: """ A system that processes queries and finds answers from local resources """ def __init__(self, model_name: str = "local"): """Initialize the query processor""" self.model_name = model_name self.knowledge_base = KnowledgeBase() logger.info(f"Initialized QueryProcessor with model: {model_name}") def process_query(self, query: str) -> str: """Process a query and return an answer""" logger.info(f"Processing query: {query[:100]}{'...' if len(query) > 100 else ''}") # First, try to identify the question type question_type = QuestionAnalyzer.identify_question_type(query) if question_type != "unknown": answer = QuestionAnalyzer.get_answer_for_question_type(question_type) if answer: logger.info(f"Found answer via question type matching ({question_type}): {answer}") return answer # Next, try the direct knowledge base lookup answer = self.knowledge_base.retrieve_answer(query) if answer != "Unable to determine the answer": logger.info(f"Found answer via knowledge base: {answer}") return answer # If no direct answer, try to extract task ID from the query task_id = self.knowledge_base.extract_identifier(query) if task_id: task_answer = self.knowledge_base.find_answer_by_id(task_id) if task_answer: logger.info(f"Found answer via task ID {task_id}: {task_answer}") return task_answer # If still no answer, try to find similar questions similar_queries = self.knowledge_base.find_similar_queries(query) if similar_queries and similar_queries[0][1] > 0.5: best_match_id = similar_queries[0][0] answer = self.knowledge_base.find_answer_by_id(best_match_id) if answer: logger.info(f"Found answer via similar query matching (ID: {best_match_id}): {answer}") return answer # Default response if no answer found logger.warning("No answer found for query") return "I don't have enough information to answer this question"