""" Модуль для обработки вопросов GAIA агентом. Этот код реализует логику обработки вопросов и форматирования ответов для точного соответствия требованиям сертификации. """ import os import json import logging from typing import Dict, Any, Optional, List from agent_implementation import AgentController, Task # Настройка логирования logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', handlers=[ logging.FileHandler("agent_processor.log"), logging.StreamHandler() ] ) logger = logging.getLogger("agent_processor") class GAIAQuestionProcessor: """Процессор вопросов GAIA для сертификации.""" def __init__(self, agent_controller: AgentController): """ Инициализация процессора. Args: agent_controller: Контроллер агента для обработки вопросов """ self.agent = agent_controller logger.info("Инициализирован процессор вопросов GAIA") def process_question(self, question: Dict[str, Any]) -> str: """ Обработка вопроса GAIA и форматирование ответа. Args: question: Вопрос GAIA Returns: Отформатированный ответ для сертификации """ task_id = question.get("task_id", "unknown") question_text = question.get("question", "") logger.info(f"Обработка вопроса {task_id}") try: # Создание задачи для агента task = Task( task_id=task_id, # Исправлено: id -> task_id для соответствия структуре Task question=question_text, # Исправлено: description -> question для соответствия структуре Task level=question.get("level", 1) # Добавлен уровень сложности ) # Обработка задачи агентом response = self.agent.process_question(question_text) # Исправлено: process_task -> process_question # Извлечение ответа из ответа агента # ВАЖНО: Удаляем все префиксы и суффиксы, оставляя только чистый ответ # Система сертификации проверяет ответы методом EXACT MATCH answer = self._extract_clean_answer(response) logger.info(f"Вопрос {task_id} обработан, получен ответ: {answer[:50]}...") return answer except Exception as e: logger.error(f"Ошибка при обработке вопроса {task_id}: {e}") return "" def _extract_clean_answer(self, response: str) -> str: """ Извлечение чистого ответа из ответа агента. Удаляет все префиксы и суффиксы, оставляя только ответ в формате EXACT MATCH. Args: response: Полный ответ агента Returns: Чистый ответ для сертификации """ # Улучшенное извлечение ответа для EXACT MATCH prefixes = [ "FINAL ANSWER:", "ANSWER:", "The answer is:", "My answer is:", "I believe the answer is:", "The correct answer is:", "Answer:", "Final answer:", "Ответ:", "Финальный ответ:", "Мой ответ:" ] result = response.strip() # Поиск и удаление префиксов (регистронезависимый) for prefix in prefixes: if result.upper().startswith(prefix.upper()): result = result[len(prefix):].strip() logger.info(f"Удален префикс '{prefix}' из ответа") break # Удаление кавычек в начале и конце if (result.startswith('"') and result.endswith('"')) or \ (result.startswith("'") and result.endswith("'")): result = result[1:-1].strip() logger.info("Удалены кавычки из ответа") # Удаление точки в конце, если она есть if result.endswith("."): result = result[:-1].strip() logger.info("Удалена точка в конце ответа") # Удаление лишних пробелов result = result.strip() logger.debug(f"Итоговый очищенный ответ: '{result}'") return result def process_questions_batch(self, questions: List[Dict[str, Any]]) -> List[Dict[str, str]]: """ Обработка пакета вопросов GAIA. Args: questions: Список вопросов GAIA Returns: Список ответов в формате [{"task_id": "...", "submitted_answer": "..."}] """ logger.info(f"Обработка пакета из {len(questions)} вопросов") answers = [] for question in questions: task_id = question.get("task_id", "unknown") answer = self.process_question(question) # Проверка на пустой ответ if not answer: logger.warning(f"Получен пустой ответ для вопроса {task_id}. Это может привести к ошибке при сертификации.") answer = "Unknown" # Заглушка вместо пустого ответа answers.append({ "task_id": task_id, "submitted_answer": answer }) logger.info(f"Обработка пакета завершена, получено {len(answers)} ответов") return answers # Пример использования if __name__ == "__main__": # Создание агента agent = AgentController( model_name="gpt-3.5-turbo", username="test_user" ) # Создание процессора processor = GAIAQuestionProcessor(agent) # Пример вопроса sample_question = { "task_id": "sample_task_001", "question": "What is the capital of France?", "level": 1 } # Обработка вопроса answer = processor.process_question(sample_question) print(f"Answer: {answer}")