| ... | ... | @@ -21,6 +21,12 @@ |
|
|
|
|
|
|
|
## 1.3 Описание алгоритма и принципа работы модулей системы
|
|
|
|
|
|
|
|
>>>
|
|
|
|
:warning: **Внимание!** :warning:
|
|
|
|
|
|
|
|
Все ссылки с учетом строк приведены для программы на момент следующего [коммита](240/competence-search@c911531e19c93a1f7a0dc6b70b70c419284db23d). В будущем номера строк **могут быть смещены** в следствие редактирования исходного кода!
|
|
|
|
>>>
|
|
|
|
|
|
|
|
### 1.3.1 Описание алгоритма и принципа работы микросервисов-обработчиков
|
|
|
|
|
|
|
|
Алгоритм работы микросервисов-обработчиков представлен на рисунке.
|
| ... | ... | @@ -37,12 +43,6 @@ |
|
|
|
- [`W`](https://git.miem.hse.ru/240/competence-search/-/tree/master/wiki) - ссылка на код из обработчика данных **МИЭМ Wiki**;
|
|
|
|
- [`C`](https://git.miem.hse.ru/240/competence-search/-/tree/master/cabinet) - ссылка на код из обработчика данных ***Личный Кабинет МИЭМ**;
|
|
|
|
|
|
|
|
>>>
|
|
|
|
:warning: **Внимание!** :warning:
|
|
|
|
|
|
|
|
Все ссылки с учетом строк приведены для программы на момент следующего [коммита](240/competence-search@c911531e19c93a1f7a0dc6b70b70c419284db23d). В будущем номера строк **могут быть смещены** в следствие редактирования исходного кода!
|
|
|
|
>>>
|
|
|
|
|
|
|
|
Каждый обработчик в начале своей работы запускает **два** параллельных процесса ([`Z`](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/zulip/src/main.py#L20), [`W`](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/wiki/src/main.py#L20), [`C`](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/cabinet/src/main.py#L20)). Точкой входа для запуска процессов является строчка с ключом `command` в конфигурации запуска в файле [`docker-compose.yml`](https://git.miem.hse.ru/240/competence-search/-/blob/master/docker-compose.yml) или [`docker-compose.prod.yml`](https://git.miem.hse.ru/240/competence-search/-/blob/master/docker-compose.prod.yml).
|
|
|
|
|
|
|
|
Слева изображен **процесс-сервер**. Большую часть времени сервер ожидает получения запроса. Как только запрос был отправлен, сервер принимает его и определяет тип запроса. Если запрос является поисковым, сервер использует обученную модель обработки данных для формирования ответа на поисковой запрос (метод `GET` **/users** [`Z`](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/zulip/src/server/server.py#L66), [`W`](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/wiki/src/server/server.py#L39), [`C`](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/cabinet/src/server/server.py#L37)). В случае, если модель обработки данных не загружена в оперативную память (это происходит при первом запуске или при перезагрузке контейнера в случае сбоя), модель сначала загружается программой, затем формируется ответ. В конце ответ на запрос отправляется клиенту. `HTTP` статус запроса – `200` («Ok», «Успешно»). Если запрос является запросом на обновление модели (метод `PATCH` **/handler** [`Z`](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/zulip/src/server/server.py#L36), [`W`](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/wiki/src/server/server.py#L25), [`C`](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/cabinet/src/server/server.py#L23)), программа загружает из файла модель и отправляет клиенту сообщение с `HTTP` статусом `200` («Ok», «Успешно»). Все остальные запросы являются не валидными и клиенту возвращается сообщение с ошибкой и статусом HTTP `404` («Not found», «Не найден»).
|
| ... | ... | @@ -61,45 +61,87 @@ |
|
|
|
|
|
|
|
```json
|
|
|
|
{
|
|
|
|
"data": {
|
|
|
|
"user_1": {
|
|
|
|
"<имя>_score": 9.3
|
|
|
|
},
|
|
|
|
"user_2": {
|
|
|
|
"<имя>_score": 6.4
|
|
|
|
}
|
|
|
|
"data": {
|
|
|
|
"user_1": {
|
|
|
|
"<имя>_score": 9.3
|
|
|
|
},
|
|
|
|
"message": "Сообщение"
|
|
|
|
"user_2": {
|
|
|
|
"<имя>_score": 6.4
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"message": "Сообщение"
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
Ключами корневого объекта `JSON` являются `data` и `message`. Ключ `message` является опциональным и служит для передачи служебных сообщений (например, если запрос был выполнен, но часть данных не была загружена). По ключу `data` находится объект, хранящий префиксы почты пользователей в виде ключей объекта. Значениями этих ключей являются объекты, содержащие как минимум один ключ – имя модели (или обрабатываемого сервиса), нижнее подчеркивание и слово `score`. Значением является оценка релевантности пользователя **моделей обработки данных**. В объектах пользователей также может быть представлена любая другая дополнительная информация (например, имя пользователя в корпоративном чате **Zulip**), если в параметрах запроса был указан параметр `more` со значением `true`.
|
|
|
|
|
|
|
|
### 1.3.2 Описание алгоритма и принципа работы главного микросервиса
|
|
|
|
Алгоритм работы микросервиса «Competence Search» можно описать следующей последовательностью действий:
|
|
|
|
1) Ожидание поискового запроса;
|
|
|
|
2) Получение запроса, асинхронная отправка копий текстового запроса всем микросервисам-обработчикам, хранящемся в списке обработчиков;
|
|
|
|
3) Асинхронный сбор ответов микросервисов-обработчиков, суммирование оценки с заранее проставленными весами для получения итоговой оценки, сортировка списка кандидатов по убыванию итоговой оценки релевантности;
|
|
|
|
4) Отправка ответа на запрос клиенту.
|
|
|
|
Список публичных REST API запросов, на которые может отвечать данные сервис представлен в таблице 2.
|
|
|
|
|
|
|
|
Алгоритм работы микросервиса **Competence Search** можно описать следующей последовательностью действий:
|
|
|
|
|
|
|
|
1. Ожидание поискового запроса;
|
|
|
|
2. Получение запроса, **асинхронная** отправка копий текстового запроса всем _микросервисам-обработчикам_ ([код](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/competence_search/src/main.py#L48)), хранящемся в списке обработчиков ([код](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/competence_search/src/services.py#L8));
|
|
|
|
3. Асинхронный сбор ответов микросервисов-обработчиков ([код](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/competence_search/src/services.py#L75)), суммирование оценки с заранее проставленными весами для получения итоговой оценки и сортировка списка кандидатов по убыванию итоговой оценки релевантности ([код](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/competence_search/src/services.py#L36));
|
|
|
|
4. Отправка ответа на запрос клиенту.
|
|
|
|
|
|
|
|
Список публичных `REST API` запросов, на которые может отвечать данные сервис:
|
|
|
|
|
|
|
|
| URL и метод запроса | Описание |
|
|
|
|
| ------ | ------ |
|
|
|
|
| /ping (GET) | Описание |
|
|
|
|
| /help (GET) | Запрос на получение справочной информации. Возвращает информацию в виде JSON строки, где по ключу «message» находится строка со справочной информацией. HTTP статус ответа – 200 («Ok», «Успешно»). |
|
|
|
|
| /users (GET) | Запрос на поиск кандидатов. В параметрах запроса должно быть задано ключевое слово «query» со значением в виде строки (поисковой запрос). Опционально можно передать параметр «more». Если его значение равно «true», запрос вернет дополнительную информацию. В случае отсутствия параметра «query» возвращает ответ с HTTP статусом 400 («Bad request», «Неправильный, некорректный запрос»). Иначе возвращает JSON ответ с HTTP статусом 200 («Ok», «Успешно»). |
|
|
|
|
| /feedback (POST) | Запрос, сохраняющий обратную связь. В теле запроса должна находиться JSON строка с ключами «bot_answer», «user_answer» и «user_info». Перенаправляет всю информацию на метод /feedback микросервиса «Gtable» и возвращает те же сообщения, что и микросервис с обратной связью. |
|
|
|
|
| `GET` **/ping** ([код](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/competence_search/src/main.py#L28))| Запрос, возвращающий `JSON` строку, содержащей все ответы модулей-обработчиков на запрос `GET` **/ping**. Используется в отладочных целях. Возвращает ответ `HTTP` со статусом `200` («Ok», «Успешно»). |
|
|
|
|
| `GET` **/help** ([код](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/competence_search/src/main.py#L34)) | Запрос на получение справочной информации. Возвращает информацию в виде `JSON` строки, где по ключу `message` находится строка со справочной информацией. `HTTP` статус ответа – `200` («Ok», «Успешно»). |
|
|
|
|
| `GET` **/users** ([код](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/competence_search/src/main.py#L39)) | Запрос на поиск кандидатов. В параметрах запроса должно быть задано ключевое слово `query` со значением в виде строки (поисковой запрос). Опционально можно передать параметр `more`. Если его значение равно `true`, запрос вернет дополнительную информацию. В случае отсутствия параметра `query` возвращает ответ с `HTTP` статусом `400` («Bad request», «Неправильный, некорректный запрос»). Иначе возвращает `JSON` ответ с `HTTP` статусом `200` («Ok», «Успешно»). |
|
|
|
|
| `POST` **/feedback** ([код](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/competence_search/src/main.py#L54)) | Запрос, сохраняющий обратную связь. В теле запроса должна находиться `JSON` строка с ключами `bot_answer`, `user_answer` и `user_info`. Перенаправляет всю информацию на метод `POST` **/feedback** микросервиса **Gtable** и возвращает те же сообщения, что и микросервис с обратной связью. |
|
|
|
|
|
|
|
|
Формат `JSON` ответа на запрос `GET` **/ping**:
|
|
|
|
|
|
|
|
```json
|
|
|
|
{
|
|
|
|
"cabinet": {
|
|
|
|
"alert_message": "Could not connect to the service container.",
|
|
|
|
"status_code": 503
|
|
|
|
},
|
|
|
|
"wiki" : {
|
|
|
|
"status_code": 200
|
|
|
|
},
|
|
|
|
"zulip": {
|
|
|
|
"status_code": 200
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
Формат JSON ответа на запрос GET /ping представлен на рисунке.
|
|
|
|
В возвращаемом объекте `JSON` представлены ответы всех модулей-обработчиков данных на запрос `GET` **/ping**. Если значение поля `status_code` внутри объектов по ключу с именем сервиса равно `200` («Ok», «Успешно»), обработчик доступен поисковику. Иначе модуль-обработчик не доступен поисковику и его данные не будут использованы для выполнения запроса.
|
|
|
|
|
|
|
|

|
|
|
|
Формат `JSON` ответа на запрос `GET` **/users**:
|
|
|
|
|
|
|
|
Формат JSON ответа на запрос GET /users представлен на рисунке.
|
|
|
|
```json
|
|
|
|
{
|
|
|
|
"data": [
|
|
|
|
{
|
|
|
|
"email_prefix": "user_1",
|
|
|
|
"total_score": 1.0,
|
|
|
|
"wiki_score": 0.7,
|
|
|
|
"zulip_score": 4.3
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"email_prefix": "user_2",
|
|
|
|
"total_score": 0.8,
|
|
|
|
"wiki_score": 0.4,
|
|
|
|
"zulip_score": 6.2
|
|
|
|
},
|
|
|
|
],
|
|
|
|
"cabinet": {
|
|
|
|
"alert_message": "Could not connect to the service container.",
|
|
|
|
"status_code": 503
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|

|
|
|
|
Обязательным ключом корневого объекта `JSON` является ключ `data`. Он содержит массив, отсортированный по убыванию значения `total_score` (итоговой оценки релевантности).
|
|
|
|
|
|
|
|
Обязательным ключом корневого объекта JSON является ключ «data». Он содержит массив, отсортированный по убыванию значения «total_score» (итоговой оценки релевантности). Элементами массива являются объекты, содержащие префикс корпоративной почты пользователя, оценку релевантности каждой модели обработки данных, суммарную оценку релевантности пользователя и дополнительную информацию (если в параметрах запроса был указан параметр «more» со значением «true»). В случае, если микросервис-обработчик не смог обработать запрос, к корневому объекту JSON добавляется ключ с названием сервиса. В нем хранится объект, содержащий сообщение-предупреждение, а также HTTP статус ошибки 503 – «Service unavailable», «Сервис недоступен».
|
|
|
|
Элементами массива являются объекты, содержащие префикс корпоративной почты пользователя, оценку релевантности каждого модуля-обработчика, суммарную оценку релевантности пользователя и дополнительную информацию (если в параметрах запроса был указан параметр `more` со значением `true`).
|
|
|
|
|
|
|
|
В случае, если модуль-обработчик не смог обработать запрос, к корневому объекту `JSON` добавляется ключ с названием сервиса. В нем хранится объект, содержащий сообщение-предупреждение, а также `HTTP` статус ошибки `503` – «Service unavailable», «Сервис недоступен».
|
|
|
|
|
|
|
|
# 2 Интерфейс общения с пользователем и обратная связь
|
|
|
|
## 2.1 Описание работы микросервисов обратной связи и чат-бота
|
| ... | ... | |