sasio06 / agent_processor.py
Sasa06's picture
Upload 7 files
1fa212d verified
raw
history blame
7.29 kB
"""
Модуль для обработки вопросов 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}")