266 lines
8.9 KiB
Markdown
266 lines
8.9 KiB
Markdown
|
|
# 🔗 Инструкция: Объединение результатов аудита в n8n
|
|||
|
|
|
|||
|
|
## 📋 Что делает Code Node
|
|||
|
|
|
|||
|
|
Объединяет результаты от **AI Agent** (17 детальных ответов) и **Regex** (17 простых ДА/НЕТ) в единую структуру с итоговой оценкой.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🏗️ Структура workflow в n8n
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
[Start]
|
|||
|
|
↓
|
|||
|
|
[Loop Over Items] ← 17 вопросов
|
|||
|
|
↓
|
|||
|
|
├─→ [AI Agent] → результаты AI (17 items)
|
|||
|
|
↓
|
|||
|
|
└─→ [Postgres Regex] → результаты Regex (17 items)
|
|||
|
|
↓
|
|||
|
|
[Aggregate] → объединяем 34 items в один массив
|
|||
|
|
↓
|
|||
|
|
[Code Node: Merge Results] ← ВОТ СЮДА ВСТАВИТЬ КОД
|
|||
|
|
↓
|
|||
|
|
[Output] → единая сводка
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📥 Входные данные
|
|||
|
|
|
|||
|
|
Code Node должен получить **массив из 34 элементов**:
|
|||
|
|
|
|||
|
|
- **Элементы 0-16** (первые 17): результаты от AI Agent
|
|||
|
|
- **Элементы 17-33** (последние 17): результаты от Regex
|
|||
|
|
|
|||
|
|
### Формат AI Agent (первые 17):
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"question": "полное наименование организации ОПФ ИНН ОГРН...",
|
|||
|
|
"output": {
|
|||
|
|
"found": true,
|
|||
|
|
"score": 0.5,
|
|||
|
|
"quote": "ИП Фролов С.А.",
|
|||
|
|
"url": "https://example.com/page",
|
|||
|
|
"details": "На сайте найдено...",
|
|||
|
|
"checked_pages": 10,
|
|||
|
|
"confidence": "Средняя"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Формат Regex (последние 17):
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"output": {
|
|||
|
|
"found": true,
|
|||
|
|
"answer": "ДА",
|
|||
|
|
"extracted": "ИНН: 1234567890",
|
|||
|
|
"confidence": "Высокая"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📤 Выходные данные
|
|||
|
|
|
|||
|
|
Code Node возвращает **1 элемент** с объединённой сводкой:
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"hotel_name": "Городской отель \"Комфорт\"",
|
|||
|
|
"region": "Камчатский край",
|
|||
|
|
"audit_date": "2025-10-14",
|
|||
|
|
"total_criteria": 17,
|
|||
|
|
"found": 5,
|
|||
|
|
"not_found": 12,
|
|||
|
|
"compliance_percentage": 29.4,
|
|||
|
|
"criteria_results": [
|
|||
|
|
{
|
|||
|
|
"criterion_id": 1,
|
|||
|
|
"criterion_name": "Юридическая идентификация и верификация",
|
|||
|
|
"criterion_description": "ИНН, ОГРН, полное наименование организации",
|
|||
|
|
"found": true,
|
|||
|
|
"status": "НАЙДЕНО",
|
|||
|
|
"score": 0.5,
|
|||
|
|
"final_confidence": "Средняя",
|
|||
|
|
"ai_agent": {
|
|||
|
|
"found": true,
|
|||
|
|
"score": 0.5,
|
|||
|
|
"quote": "ИП Фролов С.А.",
|
|||
|
|
"url": "https://hotelcomfort41.ru/o-kompanii",
|
|||
|
|
"details": "На сайте найдено наименование...",
|
|||
|
|
"confidence": "Средняя",
|
|||
|
|
"checked_pages": 10
|
|||
|
|
},
|
|||
|
|
"regex": {
|
|||
|
|
"found": false,
|
|||
|
|
"answer": "НЕТ",
|
|||
|
|
"extracted": "",
|
|||
|
|
"confidence": "Высокая"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
// ... остальные 16 критериев
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔧 Как использовать в n8n
|
|||
|
|
|
|||
|
|
### Шаг 1: Aggregate Node (перед Code Node)
|
|||
|
|
|
|||
|
|
**Настройки Aggregate:**
|
|||
|
|
- **Aggregate**: `Aggregate All Items` (объединить все в один массив)
|
|||
|
|
- **Output Field**: оставить пустым или `data`
|
|||
|
|
|
|||
|
|
Это объединит 34 отдельных items (17 от AI + 17 от Regex) в один массив.
|
|||
|
|
|
|||
|
|
### Шаг 2: Code Node (вставить код)
|
|||
|
|
|
|||
|
|
1. Добавь **Code Node** после Aggregate
|
|||
|
|
2. Скопируй код из файла `n8n_code_merge_audit_results.js`
|
|||
|
|
3. Вставь в Code Node
|
|||
|
|
|
|||
|
|
**Важно!** Code Node автоматически:
|
|||
|
|
- Разделит массив на AI (0-16) и Regex (17-33)
|
|||
|
|
- Сопоставит результаты по индексу
|
|||
|
|
- Объединит в единую структуру
|
|||
|
|
- Вернёт итоговую сводку
|
|||
|
|
|
|||
|
|
### Шаг 3: Передача данных об отеле
|
|||
|
|
|
|||
|
|
Code Node пытается получить `hotel_name` и `region` из:
|
|||
|
|
1. Workflow variables: `$('Workflow').item.json.hotel_name`
|
|||
|
|
2. Первого input item: `$input.first().json.hotel_name`
|
|||
|
|
|
|||
|
|
**Рекомендация:** Установи workflow variables в начале:
|
|||
|
|
```javascript
|
|||
|
|
// В первом Code Node workflow
|
|||
|
|
return [{
|
|||
|
|
json: {
|
|||
|
|
hotel_name: "{{ $json.hotel_name }}",
|
|||
|
|
region: "{{ $json.region }}",
|
|||
|
|
hotel_id: "{{ $json.hotel_id }}"
|
|||
|
|
}
|
|||
|
|
}];
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📊 Логика объединения
|
|||
|
|
|
|||
|
|
### Статус `found`:
|
|||
|
|
- `true` если **хотя бы один** метод (AI или Regex) нашёл информацию
|
|||
|
|
- `false` если оба не нашли
|
|||
|
|
|
|||
|
|
### Оценка `score` (0-1):
|
|||
|
|
- Берётся **максимум** из AI score и Regex (1 если found, 0 если нет)
|
|||
|
|
|
|||
|
|
### Итоговая уверенность `final_confidence`:
|
|||
|
|
|
|||
|
|
| AI found | AI conf | Regex found | Regex conf | Итог |
|
|||
|
|
|----------|---------|-------------|------------|------|
|
|||
|
|
| ✅ | Высокая | ✅ | Высокая | **Очень высокая** |
|
|||
|
|
| ✅ | Высокая | ❌ | - | **Высокая** |
|
|||
|
|
| ❌ | - | ✅ | Высокая | **Высокая** |
|
|||
|
|
| ✅ | Средняя | ❌ | - | **Средняя** |
|
|||
|
|
| ❌ | Высокая | ❌ | Высокая | **Высокая (не найдено)** |
|
|||
|
|
| ❌ | - | ❌ | - | **Низкая** |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🧪 Пример workflow
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
┌─────────────────────┐
|
|||
|
|
│ 1. Start │
|
|||
|
|
│ hotel_id: xxx │
|
|||
|
|
│ hotel_name: "..." │
|
|||
|
|
│ region: "..." │
|
|||
|
|
└──────────┬──────────┘
|
|||
|
|
│
|
|||
|
|
┌──────────▼──────────┐
|
|||
|
|
│ 2. Set Variables │ ← Сохраняем hotel_name, region
|
|||
|
|
└──────────┬──────────┘
|
|||
|
|
│
|
|||
|
|
┌──────────▼──────────┐
|
|||
|
|
│ 3. Generate Items │ ← Создаём 17 items (вопросы)
|
|||
|
|
└──────────┬──────────┘
|
|||
|
|
│
|
|||
|
|
├─────────────────────────────┐
|
|||
|
|
│ │
|
|||
|
|
┌──────────▼──────────┐ ┌────────────▼──────────┐
|
|||
|
|
│ 4a. AI Agent │ │ 4b. Postgres Regex │
|
|||
|
|
│ (17 детальных) │ │ (17 простых ДА/НЕТ) │
|
|||
|
|
└──────────┬──────────┘ └────────────┬──────────┘
|
|||
|
|
│ │
|
|||
|
|
└─────────┬───────────────────┘
|
|||
|
|
│
|
|||
|
|
┌─────────▼──────────┐
|
|||
|
|
│ 5. Aggregate │ ← 34 items → 1 массив
|
|||
|
|
└─────────┬──────────┘
|
|||
|
|
│
|
|||
|
|
┌─────────▼──────────┐
|
|||
|
|
│ 6. Code Node │ ← ВСТАВИТЬ КОД СЮДА
|
|||
|
|
│ (Merge Results) │
|
|||
|
|
└─────────┬──────────┘
|
|||
|
|
│
|
|||
|
|
┌─────────▼──────────┐
|
|||
|
|
│ 7. Save to DB │ ← Сохраняем в hotel_audit_results
|
|||
|
|
└────────────────────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 💾 Сохранение результатов в БД
|
|||
|
|
|
|||
|
|
После Code Node добавь **Postgres Node** для сохранения:
|
|||
|
|
|
|||
|
|
```sql
|
|||
|
|
INSERT INTO hotel_audit_results
|
|||
|
|
(hotel_id, audit_date, total_criteria, found, not_found,
|
|||
|
|
compliance_percentage, criteria_results, created_at)
|
|||
|
|
VALUES
|
|||
|
|
($1, $2, $3, $4, $5, $6, $7::jsonb, NOW())
|
|||
|
|
ON CONFLICT (hotel_id, audit_date) DO UPDATE SET
|
|||
|
|
total_criteria = EXCLUDED.total_criteria,
|
|||
|
|
found = EXCLUDED.found,
|
|||
|
|
not_found = EXCLUDED.not_found,
|
|||
|
|
compliance_percentage = EXCLUDED.compliance_percentage,
|
|||
|
|
criteria_results = EXCLUDED.criteria_results,
|
|||
|
|
updated_at = NOW()
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Parameters:**
|
|||
|
|
1. `{{ $json.hotel_id }}`
|
|||
|
|
2. `{{ $json.audit_date }}`
|
|||
|
|
3. `{{ $json.total_criteria }}`
|
|||
|
|
4. `{{ $json.found }}`
|
|||
|
|
5. `{{ $json.not_found }}`
|
|||
|
|
6. `{{ $json.compliance_percentage }}`
|
|||
|
|
7. `{{ JSON.stringify($json.criteria_results) }}`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ✅ Чек-лист
|
|||
|
|
|
|||
|
|
- [ ] Aggregate Node объединяет 34 items
|
|||
|
|
- [ ] Code Node получает массив из 34 элементов
|
|||
|
|
- [ ] Первые 17 - от AI Agent (детальные)
|
|||
|
|
- [ ] Последние 17 - от Regex (простые)
|
|||
|
|
- [ ] Workflow variables содержат hotel_name и region
|
|||
|
|
- [ ] Результат сохраняется в БД
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**Файл кода:** `n8n_code_merge_audit_results.js`
|
|||
|
|
**Дата:** 2025-10-14
|
|||
|
|
**Автор:** Фёдор + AI Assistant
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|