Spaces:
Sleeping
Sleeping
File size: 7,293 Bytes
1fa212d |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 |
"""
Модуль для обработки вопросов 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}")
|