Мультиагентная система для проведения технического интервью с кандидатом и формирования фидбэка.
Решение реализует agentic workflow: разные агенты отвечают за разные роли.
Я использовал модель mistral-nemo на 12B, но в теории можно использовать и просто mistral на 7B
Необходимо иметь установленный клиент Ollama
Установить и запустить модель:
ollama run mistral-nemo:latestУстановить виртуальное окружение и библиотеки:
python venv venv
pip install -r requirements.txt
python start_with_logger.pyПосле проведения собеседования, можно визуализировать полученные логи и отчёт:
streamlit run visualize.pyМожно привести логи к структуре из ТЗ:
python adapter.pyТолько необходимо указать нужные вам пути в самом adapter.py
├── start_with_logger.py # Главный скрипт. Запуск интервью (CLI) и оркестрация агентов
├── interview_state.py # Глобальное состояние интервью (позиция, грейд, метрики)
├── interviewer.py # Агент-интервьюер (генерация вопросов и ответов)
├── observer.py # Агент-наблюдатель (оценка ответов кандидата)
├── strategy.py # Агент-стратег (выбор следующего шага интервью)
├── hiring_manager.py # Агент-менеджер (принимает финальное решение о кандидате и даёт фидбэк)
├── build_summary.py # Сбор агрегированных метрик интервью для HiringManager
├── logger.py # Логгер интервью
├── adapter.py # Адаптер логов под формат submission
├── visualize.py # Утилита для визуального просмотра логов (Streamlit)
├── call_llm.py # Унифицированный вызов LLM (prompt → response)
├── topics.py # Скрипт для нормализации темы интервью (чтобы LLM не отходили от разрешенного пула)
├── requirements.txt # Зависимости проекта
├── README.md # Описание проекта
├── LICENSE # Лицензия
└── .gitignore # Исключения для репозитория
Роль: технический интервьюер
Файл: interviewer.py
- Общается с кандидатом
- Задаёт ему вопросы на основе решения от модуля
Strategy - Не анализирует ответы и не принимает решений о найме
Роль: аналитик ответов кандидата
Файл: observer.py
- Оценивает релевантность и корректность ответа
- Определяет вопрос и глубину погружения в тему
- Управляет параметрами:
status- статус ответа (OK|WEAK|WRONG|OFFTOPIC|QUESTION_TO_COMPANY)score- мера того, насколько успешно кандидат справился с вопросомnotes- массив замечаний дляHiringManager
Роль: управляющий логикой интервью
Файл: strategy.py
- Получает вывод
Observer - Решает, что делать дальше:
- усложнить вопрос
- упростить
- сменить тему
- ответить на вопрос кандидата
- завершить интервью
- Не анализирует ответы напрямую
Роль: общее состояние интервью
Файл: interview_state.py
Хранит:
- позицию и грейд кандидата
- счётчики и метрики ответов
- текущую тему и глубину
- историю сообщений
Роль: менеджер процесса найма (типа)
Файл: hiring_manager.py
- Не участвует в диалоге
- Анализирует только агрегированную сводку на основе логов
- Выносит решение о найме
- Формирует финальный фидбэк и roadmap для кандидата
Файл: logger.py
Выполняет логгирование на протяжении работы всего решения.
Формирует json-файл с логами
Файл: visualize.py
Streamlit-демка чтобы не смотреть сырой json с логами =)
Файл: adapter.py
Приводит логи к нужному формату для проверки экспертами
User
↓
Interviewer (вопрос)
↓
Observer (анализ ответа)
↓
Strategy (решение, что делать дальше)
↓
Interviewer (следующий шаг)
...
↓
Interview ends
↓
Summary Builder (код, без LLM)
↓
Hiring Manager (LLM)
↓
Final Feedback