Проект аудита отелей: основные скрипты и документация
- Краулеры: smart_crawler.py, regional_crawler.py - Аудит: audit_orel_to_excel.py, audit_chukotka_to_excel.py - РКН проверка: check_rkn_registry.py, recheck_unclear_rkn.py - Отчёты: create_orel_horizontal_report.py - Обработка: process_all_hotels_embeddings.py - Документация: README.md, DB_SCHEMA_REFERENCE.md
This commit is contained in:
218
N8N_SETUP.md
Normal file
218
N8N_SETUP.md
Normal file
@@ -0,0 +1,218 @@
|
||||
# 🤖 НАСТРОЙКА 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
|
||||
|
||||
**Удачи! 🚀**
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user