2025-10-16 10:52:09 +03:00
|
|
|
|
# 🤖 НАСТРОЙКА AI AGENT В n8n ДЛЯ АУДИТА ОТЕЛЕЙ
|
|
|
|
|
|
|
|
|
|
|
|
## 📋 **ФАЙЛЫ ДЛЯ НАСТРОЙКИ:**
|
|
|
|
|
|
|
|
|
|
|
|
1. **`prompt.txt`** (21 KB) - Полный системный промпт
|
|
|
|
|
|
2. **`prompt_short.txt`** (2.1 KB) - Краткий промпт (если не влезет полный)
|
|
|
|
|
|
3. **`questions_17.txt`** (3 KB) - 17 вопросов в текстовом формате
|
|
|
|
|
|
4. **`questions_17.json`** (6.1 KB) - 17 вопросов в JSON формате
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 🔧 **ПОШАГОВАЯ НАСТРОЙКА n8n:**
|
|
|
|
|
|
|
|
|
|
|
|
### **ШАГ 1: Создай AI Agent Node**
|
|
|
|
|
|
|
|
|
|
|
|
1. Добавь ноду **"AI Agent"**
|
|
|
|
|
|
2. Выбери модель: **Ollama** (или GPT-4o-mini)
|
|
|
|
|
|
3. В поле **"System Message"** вставь содержимое из `prompt_short.txt`
|
|
|
|
|
|
|
|
|
|
|
|
### **ШАГ 2: Подключи Vector Store**
|
|
|
|
|
|
|
|
|
|
|
|
1. Добавь ноду **"Postgres Vector Store"**
|
|
|
|
|
|
2. Настрой подключение к БД:
|
|
|
|
|
|
- Host: `147.45.189.234`
|
|
|
|
|
|
- Port: `5432`
|
|
|
|
|
|
- Database: `default_db`
|
|
|
|
|
|
- User: `gen_user`
|
|
|
|
|
|
- Password: `2~~9_^kVsU?2^S`
|
|
|
|
|
|
3. Укажи таблицу: `hotel_website_chunks`
|
|
|
|
|
|
4. Колонка с эмбеддингами: `embedding`
|
|
|
|
|
|
5. Колонка с текстом: `text`
|
|
|
|
|
|
|
|
|
|
|
|
### **ШАГ 3: Создай Loop для 17 вопросов**
|
|
|
|
|
|
|
|
|
|
|
|
1. Добавь ноду **"Code"** с содержимым из `questions_17.json`
|
|
|
|
|
|
2. Код для генерации 17 items:
|
|
|
|
|
|
|
|
|
|
|
|
```javascript
|
|
|
|
|
|
const questions = $input.item.json.questions;
|
|
|
|
|
|
return questions.map(q => ({ json: q }));
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
3. Подключи к **"Loop Over Items"**
|
|
|
|
|
|
|
|
|
|
|
|
### **ШАГ 4: Настрой AI Agent в Loop**
|
|
|
|
|
|
|
|
|
|
|
|
Для каждого вопроса:
|
|
|
|
|
|
1. AI Agent получает вопрос из `{{ $json.question }}`
|
|
|
|
|
|
2. AI Agent ищет в Vector Store
|
|
|
|
|
|
3. AI Agent возвращает ответ в формате:
|
|
|
|
|
|
```
|
|
|
|
|
|
✅ ДА, найдено.
|
|
|
|
|
|
📄 Цитата: "..."
|
|
|
|
|
|
🔗 URL: https://...
|
|
|
|
|
|
📊 Детали: ...
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### **ШАГ 5: Обработка ответов**
|
|
|
|
|
|
|
|
|
|
|
|
Добавь ноду **"Code"** для парсинга ответов:
|
|
|
|
|
|
|
|
|
|
|
|
```javascript
|
|
|
|
|
|
const answer = $input.item.json.output;
|
|
|
|
|
|
|
|
|
|
|
|
// Проверка на наличие информации
|
|
|
|
|
|
const isFound = answer.includes('✅ ДА') || answer.includes('найдено');
|
|
|
|
|
|
const isNotFound = answer.includes('❌ НЕТ') || answer.includes('не найдено');
|
|
|
|
|
|
|
|
|
|
|
|
// Извлечение цитаты
|
|
|
|
|
|
const quoteMatch = answer.match(/📄 Цитата: "(.+?)"/s);
|
|
|
|
|
|
const quote = quoteMatch ? quoteMatch[1] : '';
|
|
|
|
|
|
|
|
|
|
|
|
// Извлечение URL
|
|
|
|
|
|
const urlMatch = answer.match(/🔗 URL: (.+)/);
|
|
|
|
|
|
const url = urlMatch ? urlMatch[1].trim() : '';
|
|
|
|
|
|
|
|
|
|
|
|
// Оценка
|
|
|
|
|
|
let score = 0.0;
|
|
|
|
|
|
if (isFound && quote && url) {
|
|
|
|
|
|
score = 1.0;
|
|
|
|
|
|
} else if (isFound && quote) {
|
|
|
|
|
|
score = 0.5;
|
|
|
|
|
|
} else if (isNotFound) {
|
|
|
|
|
|
score = 0.0;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
score = 0.2;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
|
json: {
|
|
|
|
|
|
criterion_id: $input.item.json.id,
|
|
|
|
|
|
criterion_name: $input.item.json.name,
|
|
|
|
|
|
question: $input.item.json.question,
|
|
|
|
|
|
ai_answer: answer,
|
|
|
|
|
|
score: score,
|
|
|
|
|
|
quote: quote,
|
|
|
|
|
|
url: url,
|
|
|
|
|
|
is_found: isFound
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 📊 **СТРУКТУРА WORKFLOW:**
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
┌─────────────────┐
|
|
|
|
|
|
│ Start │
|
|
|
|
|
|
└────────┬────────┘
|
|
|
|
|
|
│
|
|
|
|
|
|
▼
|
|
|
|
|
|
┌─────────────────────────────┐
|
|
|
|
|
|
│ Code: Load 17 Questions │
|
|
|
|
|
|
│ (из questions_17.json) │
|
|
|
|
|
|
└────────┬────────────────────┘
|
|
|
|
|
|
│
|
|
|
|
|
|
▼
|
|
|
|
|
|
┌─────────────────────────────┐
|
|
|
|
|
|
│ Loop Over Items │
|
|
|
|
|
|
│ (17 вопросов) │
|
|
|
|
|
|
└────────┬────────────────────┘
|
|
|
|
|
|
│
|
|
|
|
|
|
▼
|
|
|
|
|
|
┌─────────────────────────────┐
|
|
|
|
|
|
│ AI Agent │
|
|
|
|
|
|
│ + Postgres Vector Store │
|
|
|
|
|
|
│ (ищет ответ в chunks) │
|
|
|
|
|
|
└────────┬────────────────────┘
|
|
|
|
|
|
│
|
|
|
|
|
|
▼
|
|
|
|
|
|
┌─────────────────────────────┐
|
|
|
|
|
|
│ Code: Parse Answer │
|
|
|
|
|
|
│ (извлекает цитату, URL) │
|
|
|
|
|
|
└────────┬────────────────────┘
|
|
|
|
|
|
│
|
|
|
|
|
|
▼
|
|
|
|
|
|
┌─────────────────────────────┐
|
|
|
|
|
|
│ Aggregate Results │
|
|
|
|
|
|
│ (собирает все 17 ответов) │
|
|
|
|
|
|
└────────┬────────────────────┘
|
|
|
|
|
|
│
|
|
|
|
|
|
▼
|
|
|
|
|
|
┌─────────────────────────────┐
|
|
|
|
|
|
│ PostgreSQL: Save Results │
|
|
|
|
|
|
│ (сохраняет в БД) │
|
|
|
|
|
|
└─────────────────────────────┘
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 🎯 **КЛЮЧЕВЫЕ ПАРАМЕТРЫ:**
|
|
|
|
|
|
|
|
|
|
|
|
### **AI Agent:**
|
|
|
|
|
|
- **Temperature:** `0.1` (низкая, для точности)
|
|
|
|
|
|
- **Max Tokens:** `500` (достаточно для ответа)
|
|
|
|
|
|
- **Top K:** `5` (количество релевантных chunks)
|
|
|
|
|
|
|
|
|
|
|
|
### **Vector Store:**
|
|
|
|
|
|
- **Similarity Threshold:** `0.7` (порог релевантности)
|
|
|
|
|
|
- **Max Results:** `5` (максимум результатов)
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 🚀 **ЗАПУСК:**
|
|
|
|
|
|
|
|
|
|
|
|
1. Импортируй workflow в n8n
|
|
|
|
|
|
2. Укажи `hotel_id` в начальной ноде
|
|
|
|
|
|
3. Запусти workflow
|
|
|
|
|
|
4. Получи 17 оценок по критериям
|
|
|
|
|
|
5. Сохрани результаты в БД
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 📈 **ОЖИДАЕМЫЙ РЕЗУЛЬТАТ:**
|
|
|
|
|
|
|
|
|
|
|
|
Для каждого из 17 критериев получишь:
|
|
|
|
|
|
- ✅ Оценка (0.0 - 1.0)
|
|
|
|
|
|
- 📄 Цитата из текста
|
|
|
|
|
|
- 🔗 URL страницы
|
|
|
|
|
|
- 📊 Детали (найденные значения)
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## ⚠️ **ВАЖНО:**
|
|
|
|
|
|
|
|
|
|
|
|
- Критерий #6 "Роскомнадзор (реестр)" проверяется **отдельно** (не через AI Agent)
|
|
|
|
|
|
- Всего критериев: **18**, но AI Agent проверяет только **17**
|
|
|
|
|
|
- Итоговый балл: сумма всех 18 критериев (включая #6)
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 🔍 **ОТЛАДКА:**
|
|
|
|
|
|
|
|
|
|
|
|
Если AI Agent не находит информацию:
|
|
|
|
|
|
1. Проверь подключение к Vector Store
|
|
|
|
|
|
2. Проверь наличие эмбеддингов для отеля в `hotel_website_chunks`
|
|
|
|
|
|
3. Увеличь `Top K` до 10
|
|
|
|
|
|
4. Уменьши `Similarity Threshold` до 0.5
|
|
|
|
|
|
5. Проверь промпт - используй `prompt_short.txt`
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 📞 **ПОДДЕРЖКА:**
|
|
|
|
|
|
|
|
|
|
|
|
Если что-то не работает:
|
|
|
|
|
|
1. Проверь логи n8n
|
|
|
|
|
|
2. Проверь что Vector Store подключен
|
|
|
|
|
|
3. Проверь что у отеля есть chunks в БД
|
|
|
|
|
|
4. Проверь формат ответа AI Agent
|
|
|
|
|
|
|
|
|
|
|
|
**Удачи! 🚀**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-10-27 22:49:42 +03:00
|
|
|
|
|