Spaces:
Sleeping
Sleeping
| """ | |
| Модуль для обработки вопросов 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}") | |