SQL-HR автоматизирует отбор релевантных кандидатов по базе резюме. Система разворачивается как набор Docker‑сервисов: PostgreSQL хранит данные, agent_server строит пайплайн LangGraph и взаимодействует с LLM через vLLM, а результат сохраняется в results/result.txt. Подход позволяет итеративно уточнять поисковые акценты, дозапрашивать новых кандидатов и ранжировать их в соответствии с бизнес‑запросом. Проект изначально использует Qwen2.5‑7B‑GPTQ. Фронтенд позволяет вводить поисковую задачу, вести диалог с чат-ботом и получать итоговых кандидатов.
docker-compose.yml— единая оркестрация для vLLM,agent_server, PostgreSQL и pgAdmin, а также проброс каталогаresults/внутрь контейнера.env.example— пример переменных окружения (доступ к БД, порты, модель LLM и ключ API).agent_server/— исходный код пайплайна (главные файлыmain.py,nodes.py,candidates.py,prompts.py,requirements.txt,Dockerfile), API для фронтенда и взаимодействия с LangGraph.frontend/— Streamlit-приложение (chat.py) с чат-ботом, который принимает запросы пользователя, поддерживает продолжение сессии (session_id) и показывает найденных кандидатов.example/— скриншотexample.pngс примером работы фронтенда.data/— файлы с исходными резюме, загружается в PostgreSQL при старте.db/schema.sql,db/add_rows.sql— описание таблицыcandidatesи импорт исходных данных.results/result.txt— итоговый JSON со списком отобранных кандидатов (создаётся автоматически).hf-cache/— кеш Hugging Face, подключается к vLLM для повторного использования моделей..gitignore,Dockerfile(в корне) и вспомогательные файлы для локальной разработки.
- Диалог с чат-ботом (frontend) — пользователь формулирует поисковый запрос или уточнение в Streamlit UI; сообщения идут на API
agent_server, который сохраняетsession_idи возвращает ответы/кандидатов для карточек. node_test_db— быстрая проверка подключения к PostgreSQL: выбирает пять записей и логирует их.node_get_task— запрашивает у LLM текстовую постановку поиска (например, какая вакансия нужна).node_generate_accents— формирует 1–8 тематических «акцентов» (вариантов запросов) из исходной задачи.node_choose_candidates— для каждого акцента LLM строит первичныйQuerySpec, по которому ORM извлекает кандидатов; затем LLM помечает наиболее подходящих.node_add_candidates— обеспечивает целевое количество кандидатов в каждой группе: повторно создаёт уточнённые запросы, при необходимости «смягчает» фильтры и отдает LLM на повторный выбор.node_rate_candidates— собирает все уникальные резюме, объединяет флагиapprovedи просит LLM выдать ранжированный список (есть детерминированный fallback).node_return_candidates— сериализует результат в JSON и пытается записать его вRESULT_FILE(по умолчаниюresults/result.txt). Если основной путь недоступен, используется/tmp/result.txtвнутри контейнера.node_ask_next— задаёт пользователю вопрос для следующего уточнения и завершает текущий запуск.
- Зависимости. Нужны Docker и Docker Compose. Чтобы vLLM работал, требуется GPU.
- Подготовка окружения.
cp env.example .env # отредактируйте .env: пароли БД, порт pgAdmin, модель/ключ LLM и т.д. - Запуск сервисов.
docker compose up --build
postgresподнимет схему и загрузитdata/candidates.csvчерезdb/*.sql.vllmскачает модель вhf-cache/и откроет API на${VLLM_HOST_PORT}(по умолчанию 18001).agent_serverсоберёт LangGraph пайплайн и запишет результат вresults/result.txt(также доступен внутри контейнера какRESULT_FILE).pgadminбудет доступен на${PGADMIN_PORT}(например, http://localhost:5050) — можно подключиться к БД и проверить данные.
