Ollama и n8n: локальные AI-сводки без отправки данных в облако ¶
Обновлено: 2026-05-30
Импортируйте workflow, замените credentials и прогоните тестовый payload до включения production.
Проблема: команда хочет автоматизировать сводки писем, заявок или документов, но не может отправлять коммерческие данные в облачные LLM из-за NDA, персональных данных или внутренней политики безопасности.
Решение: использовать n8n как orchestrator и Ollama как локальный AI-runtime: workflow чистит входной текст, режет его на chunks, вызывает локальный `/api/generate`, собирает краткую сводку и пишет audit без лишних персональных данных.
Проблема: почему внутренние тексты нельзя всегда отправлять в облачный AI ¶
Локальная AI-сводка нужна там, где исходный текст нельзя отдавать внешнему провайдеру: коммерческие предложения, обращения клиентов, внутренние отчёты, протоколы встреч или фрагменты базы знаний. Простая интеграция “HTTP Request → облачная модель” решает задачу быстро, но может нарушить правила хранения данных.
Ollama позволяет запускать модели локально, а n8n удобно использовать для маршрутизации, подготовки текста, контроля ошибок и передачи результата в CRM, Telegram или Google Sheets. Такая связка не делает модель магической: нужно контролировать размер текста, таймауты, качество ответа и fallback на ручную обработку.
Архитектура workflow Ollama → n8n для локальной суммаризации ¶
| Нода | Роль | Что проверить |
|---|---|---|
| Webhook input | принимает текст, source_id и режим summary | лимит размера, автор запроса, тип источника |
| Normalize text | удаляет HTML, повторяющиеся пробелы и мусор | нет секретов в логах и stack trace |
| Chunk text | режет длинный текст на фрагменты | размер chunk меньше контекстного окна модели |
| Call Ollama API | вызывает локальный `/api/generate` | base URL, model, timeout, stream=false |
| Merge summary | собирает итоговую сводку | нет выдуманных фактов, есть action items |
| Respond / Save | возвращает JSON или пишет результат | сохраняется source_id и audit_key |
Для production лучше держать Ollama на отдельной машине или контейнере рядом с n8n, а не на случайном ноутбуке. Так проще контролировать GPU/CPU, доступ к порту `11434` и обновления модели.
Контракт входных данных для локальной AI-сводки ¶
{
"source_id": "ticket-9831",
"source_type": "support_thread",
"language": "ru",
"summary_mode": "action_items",
"text": "Клиент просит перенести интеграцию с Google Sheets на Битрикс24, сохранить UTM и убрать дубли по телефону. Нужен срок и оценка."
}
В payload не нужен полный контекст бизнеса. Передавайте только текст, который реально нужен для summary, и стабильный `source_id`, чтобы результат можно было связать с исходным объектом.
Code Node: очистка текста, chunking и prompt для Ollama ¶
const src = $json.body ?? $json;
const text = String(src.text ?? '').replace(/<[^>]*>/g, ' ').replace(/\s+/g, ' ').trim();
if (text.length < 80) throw new Error('Text is too short for useful summary');
if (text.length > 60000) throw new Error('Text is too long: split before workflow');
const maxChunk = 5500;
const chunks = [];
for (let i = 0; i < text.length; i += maxChunk) {
chunks.push(text.slice(i, i + maxChunk));
}
const prompt = `Сделай краткую деловую сводку на русском. Верни JSON: summary, facts, action_items, risks. Не добавляй факты, которых нет в тексте.\n\nТекст:\n${chunks[0]}`;
return [{
json: {
source_id: String(src.source_id ?? 'unknown'),
source_type: String(src.source_type ?? 'text'),
model: src.model ?? 'qwen2.5:7b-instruct',
ollama_body: { model: src.model ?? 'qwen2.5:7b-instruct', prompt, stream: false, options: { temperature: 0.2 } },
chunk_count: chunks.length,
audit_key: `ollama-summary:${src.source_id ?? Date.now()}`
}
}];
Почему stream=false удобнее для автоматизации
Потоковая генерация хороша для интерфейса чата, но workflow проще тестировать и логировать, когда Ollama возвращает один JSON-ответ. Для длинных документов лучше отдельно делать chunking и merge, а не ждать бесконечный stream.
Готовый workflow JSON: скачать и импортировать ¶
Скачать готовый workflow JSON Скачать тестовый payload
{
"name": "Nodbot - Ollama local AI summary",
"nodes": [
{
"name": "Webhook input",
"type": "n8n-nodes-base.webhook",
"purpose": "Принять текст для локальной сводки"
},
{
"name": "Normalize and chunk text",
"type": "n8n-nodes-base.code",
"purpose": "Очистить текст и подготовить prompt"
},
{
"name": "Call Ollama generate",
"type": "n8n-nodes-base.httpRequest",
"purpose": "Вызвать локальный Ollama API"
},
{
"name": "Validate summary",
"type": "n8n-nodes-base.code",
"purpose": "Проверить JSON и отсутствие пустого ответа"
},
{
"name": "Save audit log",
"type": "n8n-nodes-base.postgres",
"purpose": "Сохранить source_id, model и latency"
},
{
"name": "Respond to Webhook",
"type": "n8n-nodes-base.respondToWebhook",
"purpose": "Вернуть summary в вызывающую систему"
}
],
"connections": "Webhook input → Normalize and chunk text → Call Ollama generate → Validate summary → Save audit log → Respond to Webhook"
}
Пошаговая настройка Ollama, n8n и локальной модели ¶
- Установите Ollama и скачайте модель, которую реально выдерживает ваш сервер.
- Закройте порт `11434` от внешнего интернета и разрешите доступ только n8n.
- Импортируйте workflow JSON и замените base URL Ollama, если он отличается от `http://localhost:11434`.
- Настройте prompt под ваш тип данных: заявки, письма, отчёты или протоколы.
- Добавьте audit log: source_id, model, chunk_count, latency и статус ответа.
Тесты перед production и проверка качества summary ¶
curl -X POST "https://YOUR-N8N-DOMAIN/webhook/ollama-local-ai-summary" \
-H "Content-Type: application/json" \
--data @ollama-local-ai-summary-payload.json
- Отправьте короткий текст, длинный текст, HTML-письмо и текст с персональными данными.
- Проверьте, что модель не добавляет факты, которых нет во входном тексте.
- Остановите Ollama и убедитесь, что workflow возвращает контролируемую ошибку.
- Проверьте timeout: зависший локальный AI не должен блокировать очередь n8n.
- Сравните summary с ручной выжимкой на 10 реальных примерах.
Production-риски локального AI и Ollama API ¶
- Ollama доступен извне. Локальная приватность теряет смысл, если порт API открыт в интернет.
- Нет лимита длины. Длинный текст может упасть по timeout или съесть всю память.
- Модель выдумывает факты. Prompt должен требовать evidence и запрет на добавление отсутствующих данных.
- Нет fallback. При недоступности Ollama нужна ручная очередь или облачный резерв только для разрешённых данных.
- Execution logs хранят исходный текст. Настройте политику хранения данных в n8n.
Полезные ссылки и смежные workflow ¶
См. также OpenRouter model fallback, GigaChat support draft и Docker Compose для n8n. Официальные документы: Ollama API и n8n HTTP Request.
Критерии готовности ¶
- Ollama недоступен из интернета и вызывается только из n8n.
- Есть лимиты размера текста, timeout и понятная ошибка при недоступной модели.
- Prompt требует JSON, action items и запрет на выдуманные факты.
- Audit log хранит source_id/model/status, но не избыточные персональные данные.
- Результат проверен на реальных примерах и принят владельцем процесса.
Nodbot настроит Ollama, n8n, Docker, лимиты, prompt-контракт, audit log и интеграцию результата с вашей CRM или базой знаний.
Обсудить локальный AI workflow