AI SyncData Workflow
1. Обзор workflow
Workflow для обработки данных опросов сотрудников и генерации аналитических инсайтов.
| Название | ai/syncdata |
|---|---|
| База данных | PostgreSQL (raw_survey_data, questions, translations, employees, surveys) |
| Основные функции | Анализ ответов, расчет средних значений, генерация инсайтов и рекомендаций |
| Webhook-узлы | 2 основных workflow (short и long версии) |
2. Основной workflow (short)
Обработка данных опроса и генерация кратких инсайтов и рекомендаций.
Цепочка выполнения:
-
Execute Workflow Trigger
Запускает workflow с параметрами:
departments_ids- ID отдела (number)survey_token- токен опроса (string)
-
Edit Fields1
Подготавливает параметры для запросов:
query.survey_token = $json.survey_token query.departmentId = $json.departments_ids -
Find companyID by company token
Получает ID компании и опроса по токену:
SELECT "surveyId", "companyId" FROM surveys WHERE "token" = $1;Параметр:
$1 = survey_token -
Merge1
Объединяет данные из Edit Fields1 и Find companyID.
-
Postgres get metrics
Получает сырые данные ответов на опрос:
SELECT "paramNameMetric", "value", "userId", "questionId", "comment" FROM "raw_survey_data" WHERE "surveyId" = $1 AND ("departmentId" = $2 OR $2 = 1);Параметры:
- $1 = surveyId
- $2 = departmentId (если 1 - игнорируется фильтр по отделу)
-
Make average value for question
Python-код для агрегации данных:
Основная логика:
- Группировка ответов по questionId
- Фильтрация некорректных и пустых ответов
- Учет пользователей с комментариями (без оценок)
- Расчет средних значений по пользователям
- Подсчет процента без ответов
- Сбор комментариев
- Специальная обработка вопроса с ID 123 (пропуск расчета среднего)
Структура результата:
{ "questionId": number, "paramNameMetric": string, "totalUserCount": number, "noAnswerCount": number, "noAnswerPercentage": number, "comments": string[], "averageValue": number (optional) } -
Postgres find questions names
Получает названия вопросов и переводы метрик:
SELECT q."questionId", q."questionRussian", q."paramNameMetric", t."ru" AS "paramNameMetricRu" FROM questions q LEFT JOIN translations t ON q."paramNameMetric" = t."key"; -
If
Проверяет, нужно ли считать сотрудников отдела или всей компании:
Условие: $json.query.departmentId != 1 -
Ветка 1 (departmentId != 1):
-
Postgres employees count
Считает активных сотрудников отдела:
SELECT COUNT(*) AS active_employees_count FROM employees e WHERE e."departmentId" = $1 AND e."status" = 'active';
-
Postgres employees count
-
Ветка 2 (departmentId == 1):
-
Postgres employees count2
Считает всех респондентов опроса:
SELECT total_respondents_count as active_employees_count FROM surveys WHERE "surveyId" = $1;
-
Postgres employees count2
-
Merge
Объединяет данные вопросов с агрегированными ответами.
-
Merge2
Добавляет информацию о количестве сотрудников.
-
Make insight promt
Генерирует промт для AI с инсайтами:
Особенности:
- Формирует детализированный контент по каждому вопросу
- Учитывает статистику ответов и комментарии
- Запрашивает инсайты с приоритезацией (important/critical/normal)
- Формат ответа - JSON с полями text, priority, paramNameMetric, questions, type
-
Make advice promt
Генерирует промт для AI с рекомендациями:
Особенности:
- Группирует вопросы по paramNameMetric
- Для каждой метрики формирует отдельный запрос
- Запрашивает конкретные рекомендации по улучшению
- Формат ответа аналогичен инсайтам (type=advice)
-
Merge4
Объединяет промты для инсайтов и рекомендаций.
-
HTTP deepseek1
Отправляет запросы на генерацию AI:
POST https://api.hroom.ai/webhook/ai/syncdata/gen Body: { survey_token: $json.query.survey_token, departmentId: $json.query.departmentId, surveyId: $json.surveyId, companyId: $json.companyId, request: $json.request }
Особенности обработки данных:
- Специальная обработка вопроса с ID 123 (без расчета среднего)
- Разделение пользователей на ответивших, не ответивших и оставивших комментарии
- Поддержка как отдела, так и всей компании (departmentId=1)
- Использование переводов для метрик вопросов
3. Дополнительный workflow (long)
Генерация расширенных версий инсайтов и рекомендаций на основе AI.
Цепочка выполнения:
-
Webhook1
Принимает POST-запрос с параметрами:
headers.authorization- токен опросаbody.ai_data_id- ID данных для расширения
-
Edit Fields
Извлекает параметры:
token = $json.headers.authorization ai_data_id = $json.body.ai_data_id -
Find companyID by company token1
Проверяет токен компании:
SELECT "companyId" FROM companies WHERE "token" = $1; -
Postgres
Получает исходные AI-данные для расширения:
SELECT * FROM raw_ai_data WHERE "id" = $1; -
Postgres get metrics 1
Получает данные опроса для выбранных вопросов:
SELECT "paramNameMetric", "value", "userId", "questionId", "comment" FROM "raw_survey_data" WHERE "surveyId" = $1 AND ("departmentId" = $2 OR $2 = 1) AND "questionId" = ANY(ARRAY(SELECT jsonb_array_elements_text($3::jsonb)::integer));Параметр $3 - массив ID вопросов из исходных данных
-
Make average value for question1
Аналогичная агрегация данных как в основном workflow.
-
Postgres find questions names1
Получает названия только для нужных вопросов.
-
If1
Аналогичное ветвление для подсчета сотрудников.
-
Switch
Разделяет обработку для инсайтов и рекомендаций:
Условия: 1. $json.type == "insight" → Make insight long 2. $json.type == "advice" → Make advice long -
Ветка 1 (insight):
-
Make insight long
Генерирует расширенную версию инсайта:
Особенности:
- Использует короткий инсайт как основу
- Добавляет детализированную аналитику
- Форматирует ответ в HTML с тегами для читаемости
- Объем ~5000 символов
-
Make insight long
-
Ветка 2 (advice):
-
Make advice long
Генерирует расширенную версию рекомендации:
Особенности:
- Группирует по метрикам (paramNameMetric)
- Предоставляет конкретные инструкции по улучшению
- Использует HTML-форматирование с списками
- Объем ~5000 символов на метрику
-
Make advice long
-
HTTP deepseek
Отправляет запрос на генерацию расширенного контента:
POST https://api.hroom.ai/webhook/ai/syncdata/deepseek/long Body: { survey_token: $json.headers.authorization, request: $json.request, ai_data_id: $json.body.ai_data_id } -
Respond to Webhook
Возвращает сгенерированный контент.
Отличия от основного workflow:
- Работает только с выбранными вопросами из исходных данных
- Генерирует более детализированный контент
- Использует HTML-форматирование для лучшей читаемости
- Принимает ID существующих данных для расширения
4. Общие компоненты
Структура БД
Таблица raw_survey_data
- surveyId - ID опроса
- departmentId - ID отдела
- questionId - ID вопроса
- userId - ID пользователя
- value - значение ответа
- comment - текстовый комментарий
- paramNameMetric - метрика вопроса
Таблица questions
- questionId - ID вопроса
- questionRussian - текст вопроса
- paramNameMetric - ключ метрики
Таблица translations
- key - ключ перевода
- ru - русский перевод
Таблица employees
- departmentId - ID отдела
- status - статус сотрудника
Таблица surveys
- surveyId - ID опроса
- token - токен доступа
- companyId - ID компании
- total_respondents_count - общее количество респондентов
Особенности обработки данных
- Специальная обработка вопроса с ID 123 (без расчета среднего)
- Раздельный учет пользователей с оценками, без ответов и с комментариями
- Поддержка как отдела, так и всей компании (departmentId=1)
- Использование параметризованных запросов для безопасности