Инструмент используется для предложения пользователям наиболее подходящих вариантов университетов и факультетов на основании их интересов и предпочтений.
Здесь представлена часть кода по хакатону UrFU + UniGoTo
от моей команды, соответствующая практическому заданию №4 по предмету MLOps с использованием AirFlow
для периодической обработки данных.
Данный код реализует постоянную загрузку сырых данных из unigoto.ru/api
в базу данных PostGreSQL
посредством контейнера data-collector
.
AirFlow
используется для запуска периодической задачи, которая преобразует новые данные из API в эмбединги (при помощи SentenceTransformer) и складывает их в БД с расширением pgvector.
Выдача результатов анализа подходящего университета реализуется с помощью перевода введенных пользователем данных в эмбединг и поиском наименьшего косинусного расстояния по существующей базе. Взаимодействие с базой данных осуществляется с помощью FastAPI
. Благодаря периодическому запуску преобразования новых данных в эмбединги с помощью AirFlow
эффективность такого поиска постоянно увеличивается.
Для удобства взаимодействия с инструментом реализован пользовательский web-интерфейс на основе библиотеки Streamlit
.
.
├───configs
│ ├───dev
│ │ ├───h-data-pg
│ │ │ └───docker-entrypoint-initdb.d
│ │ └───nginx
│ │ └───conf.d
│ └───local
│ ├───h-data-pg
│ │ └───docker-entrypoint-initdb.d
│ └───nginx
│ └───conf.d
├───img
├───src
│ ├───airflow
│ │ └───dags
│ │ └───h_dags
│ ├───api
│ │ └───api
│ │ └───endpoints
│ ├───client
│ ├───data_collector
│ │ └───scripts
│ └───workers
└───volumes
cp configs/dev/.env .env
- add COLLECTOR_ACCESS_TOKEN to .env
up db
docker compose up -d --build h-data-pg
create tables
docker compose run --rm --no-deps data-collector sh -c 'python -m scripts.init_db_tables'
run collector
docker compose up -d --build data-collector
run all services
docker compose up -d --build
docker compose logs -n 100 data-collector
docker compose exec h-data-pg psql -U h_user -d h_core
UPDATE h_raw_data
SET about = regexp_replace(about, E'[\\n\\r]+', ' ', 'g' ),
activities=regexp_replace(activities, E'[\\n\\r]+', ' ', 'g' ),
books=regexp_replace(books, E'[\\n\\r]+', ' ', 'g' ),
games=regexp_replace(games, E'[\\n\\r]+', ' ', 'g' ),
interests=regexp_replace(interests, E'[\\n\\r]+', ' ', 'g' ),
university_name=regexp_replace(university_name, E'[\\n\\r]+', ' ', 'g' ),
faculty_name=regexp_replace(faculty_name, E'[\\n\\r]+', ' ', 'g' );
SELECT count(DISTINCT page_number)
FROM h_raw_data;
SELECT min(page_number)
FROM h_raw_data;
SELECT count(*)
FROM h_raw_data;
COPY h_raw_data TO '/csv/h_raw_data.csv' DELIMITER ',' CSV HEADER;
COPY (SELECT *
FROM h_raw_data
WHERE education_status IN
('Выпускник (бакалавр)', 'Выпускник (магистр)', 'Выпускник (специалист)', 'Выпускница (бакалавр)',
'Выпускница (магистр)',
'Выпускница (специалист)')) to '/csv/graduates.csv' with (format csv, DELIMITER ',', HEADER);
create DB
cat configs/dev/h-data-pg/docker-entrypoint-initdb.d/0_initial_postgresql.sql | psql -U postgres
export env variables
export $(grep -v '^#' configs/dev/.env | xargs)
create DB tables
python -m src.data_collector.scripts.init_db_tables