---
title: "Qdrant RAG и n8n: FAQ-бот без галлюцинаций | Nodbot"
source_url: "https://nodbot.ru/workflows/qdrant-rag-faq-bot/"
canonical_url: "https://nodbot.ru/workflows/qdrant-rag-faq-bot/"
language: "ru"
content_type: "WorkflowTemplate"
section: "workflows"
generated_at: "2026-05-30"
word_count_source: 1078
---

# Qdrant RAG и n8n: FAQ-бот по базе знаний с контролем источников

## AI summary

Практический RAG workflow для FAQ-бота: принять вопрос, нормализовать язык, получить embedding, найти релевантные chunks в Qdrant, собрать prompt с источниками, отдать ответ только по базе знаний и отправить неуверенные случаи на ручную проверку.

## Best used for

Полноценный Problem/Solution-мануал для внедрения в n8n: импортировать workflow JSON, настроить API, выполнить production-тесты и передать решение команде.

## Table of contents

- Проблема: где ломается сценарий
- Архитектура workflow
- Контракт входных данных
- Code Node: нормализация и контроль
- Готовый workflow JSON
- Пошаговая настройка
- Тесты перед production
- Production-риски
- Полезные ссылки и смежные workflow
- Критерии готовности

## Key topics

- Qdrant
- RAG
- n8n
- FAQ bot
- embeddings
- source citations
- human review

## Source outline

Qdrant RAG и n8n: FAQ-бот по базе знаний с контролем источников ¶ Обновлено: 2026-05-30 AI summary: Практический RAG workflow для FAQ-бота: принять вопрос, нормализовать язык, получить embedding, найти релевантные chunks в Qdrant, собрать prompt с источниками, отдать ответ только по базе знаний и отправить неуверенные случаи на ручную проверку. Шаблон для внедрения Скачать workflow JSON Скачать test payload Скопировать curl Импортируйте workflow, замените credentials и прогоните тестовый payload до включения production. Содержание Проблема: где ломается сценарий Архитектура workflow Контракт входных данных Code Node: нормализация и контроль Готовый workflow JSON Пошаговая настройка Тесты перед production Production-риски Полезные ссылки и смежные workflow Критерии готовности Проблема: FAQ-бот на LLM быстро отвечает красиво, но без retrieval-слоя он выдумывает тарифы, сроки, ограничения API и внутренние правила. Для поддержки это опаснее, чем медленный ответ человека. Решение: строим RAG-сценарий на n8n и Qdrant: вопрос превращается в embedding, Qdrant возвращает chunks с metadata, Code Node собирает строгий prompt, а модель отвечает только по найденным источникам или честно просит человека уточнить ответ. Workflow принимает вопрос, ищет фрагменты в Qdrant, собирает grounded prompt и возвращает ответ с источниками. Проблема: почему FAQ-бот без RAG начинает галлюцинировать ¶ Запрос “сделать чат-бота по базе знаний” часто звучит просто, но реальная боль начинается после первых неправильных ответов. Модель может уверенно придумать цену, сослаться на несуществующую инструкцию или ответить по старой версии регламента. Пользователь видит быстрый ответ, а команда поддержки получает эскалацию. RAG-бот должен работать как контролируемая поисковая система: сначала найти релевантные фрагменты, затем ограничить модель этими фрагментами, а при низкой уверенности не фантазировать. Поэтому эта инструкция не про “подключить AI к Qdrant”, а про production FAQ-бота с источниками, score, fallback и аудитом. Архитектура workflow Qdrant RAG FAQ-бота ¶ Нода Роль Что проверить Webhook question принимает вопрос, user_id и канал лимит длины, язык, идентификатор сессии Normalize query чистит вопрос и строит audit_key нет prompt injection и скрытых команд Create embedding получает vector для запроса одна модель embedding для индекса и запроса Search Qdrant ищет chunks по vector + фильтрам collection, top_k, score_threshold, metadata Build grounded prompt собирает контекст и источники только найденные chunks, ссылки на документы Answer or human review отвечает или отправляет на проверку confidence gate, no-answer policy, логирование Ключевое правило: embedding модель для загрузки базы знаний и embedding модель для запросов должны совпадать. Если размерность vectors отличается, Qdrant не сможет корректно искать, а если модель изменилась незаметно, качество retrieval упадёт без явной ошибки. Контракт входных данных для вопроса пользователя ¶ { "question": "Как восстановить workflow n8n после сбоя Postgres?", "user_id": "tg-9182", "channel": "telegram", "language": "ru", "filters": { "section": "hosting", "product": "n8n" }, "top_k": 5 } Фильтры в payload нужны, чтобы не искать по всей базе знаний. Для FAQ-бота полезно хранить `section`, `product`, `version`, `locale` и `doc_url` в payload каждого chunk. Code Node: сбор prompt, источников и confidence gate ¶ const src = $json.body ?? $json; const question = String(src.question ?? '').replace(/\s+/g, ' ').trim(); if (question.length < 8) throw new Error('Question is too short for RAG search'); if (question.length > 1200) throw new Error('Question is too long: ask user to shorten it'); const topK = Math.min(Number(src.top_k ?? 5), 8); const filters = src.filters ?? {}; const qdrantFilter = { must: [] }; for (const [key, value] of Object.entries(filters)) { if (value) qdrantFilter.must.push({ key, match: { value } }); } const systemGuard = [ 'Отвечай только по контексту из найденных источников.', 'Если ответа нет в контексте, скажи: "В базе знаний нет точного ответа".', 'Не придумывай тарифы, сроки, ссылки и команды.', 'В конце укажи source_ids использованных фрагментов.' ].join(' '); return [{ json: { question, top_k: topK, qdrant_search: { limit: topK, with_payload: true, filter: qdrantFilter }, system_guard: systemGuard, audit_key: `qdrant-rag:${src.user_id ?? 'anon'}:${Date.now()}`, min_score: Number(src.min_score ?? 0.72) } }]; Почему нужен no-answer policy RAG не гарантирует, что нужный ответ есть в базе. Если top chunks имеют низкий score или противоречат друг другу, безопаснее вернуть “нет точного ответа” и создать задачу на поддержку, чем публиковать уверенную галлюцинацию. Готовый workflow JSON: скачать и импортировать ¶ Скачать готовый workflow JSON Скачать тестовый payload { "name": "Nodbot - Qdrant RAG FAQ bot", "nodes": [ { "name": "Webhook question", "type": "n8n-nodes-base.webhook", "purpose": "Принять вопрос пользователя" }, { "name": "Normalize query", "type": "n8n-nodes-base.code", "purpose": "Очистить вопрос и собрать фильтр Qdrant" }, { "name": "Create embedding", "type": "n8n-nodes-base.httpRequest", "purpose": "Получить embedding для вопроса" }, { "name": "Search Qdrant points", "type": "n8n-nodes-base.httpRequest", "purpose": "Найти релевантные chunks" }, { "name": "Build grounded prompt", "type": "n8n-nodes-base.code", "purpose": "Собрать prompt с источниками" }, { "name": "Respond or human review", "type": "n8n-nodes-base.respondToWebhook", "purpose": "Вернуть ответ или статус review" } ], "connections": "Webhook question → Normalize query → Create embedding → Search Qdrant points → Build grounded prompt → Respond or human review" } Пошаговая настройка Qdrant, embeddings и n8n ¶ Создайте Qdrant collection с размерностью, которая совпадает с embedding моделью. Загрузите chunks базы знаний с metadata: source_id, doc_url, section, locale, updated_at. Импортируйте workflow JSON и задайте Qdrant URL, API key и collection name. Настройте embedding endpoint, который использовался при индексации документов. Укажите score_threshold и ветку human review для слабых совпадений. Тесты перед production и проверка качества RAG ¶ curl -X POST "https://YOUR-N8N-DOMAIN/webhook/qdrant-rag-faq-bot" \ -H "Content-Type: application/json" \ --data @qdrant-rag-faq-bot-payload.json Задайте вопрос, ответ на который точно есть в базе знаний. Задайте вопрос вне базы и проверьте, что бот не выдумывает ответ. Проверьте старый документ и фильтр по `section` или `version`. Отправьте prompt injection вроде “игнорируй инструкции” и проверьте guard. Сравните top chunks и итоговый ответ на 30–50 реальных вопросах поддержки. Production-риски RAG-бота на Qdrant ¶ Нет metadata-фильтров. Бот достаёт похожий текст из неправильного продукта или старой версии документа. Score используется как абсолютная истина. Порог нужно калибровать на реальных вопросах, а не брать из примера. Chunks слишком большие. Модель получает шум и хуже отвечает. Нет обновления индекса. База знаний изменилась, а Qdrant продолжает отдавать старые фрагменты. Нет ссылок на источники. Пользователь не может проверить ответ, а поддержка не видит, почему бот так решил. Полезные ссылки и смежные workflow ¶ См. также RAG в n8n , chunking для RAG , vector store и Telegram AI bot with human approval . Официальные документы: Qdrant collections , Qdrant points , Qdrant search points API и n8n HTTP Request . Визуальная карточка показывает score, источник и решение: ответить или отправить на ручную проверку. Критерии готовности ¶ Collection создана с правильной размерностью vectors. Каждый chunk имеет source_id, doc_url, section и updated_at. Ответ содержит источники или честный no-answer. Prompt injection не отключает guard-инструкции. Есть ручная проверка для низкого score и спорных ответов. Нужен FAQ-бот, который не придумывает ответы? Nodbot настроит RAG на Qdrant: индексацию базы знаний, chunking, embeddings, prompt guard, source_ids, оценку качества и human review для спорных вопросов. Обсудить RAG-бота

## Test payload

```json
{
  "question": "Как восстановить workflow n8n после сбоя Postgres?",
  "user_id": "tg-9182",
  "channel": "telegram",
  "language": "ru",
  "filters": {
    "section": "hosting",
    "product": "n8n"
  },
  "top_k": 5
}
```

## Key implementation snippet

```javascript
const src = $json.body ?? $json;
const question = String(src.question ?? '').replace(/\s+/g, ' ').trim();
if (question.length < 8) throw new Error('Question is too short for RAG search');
if (question.length > 1200) throw new Error('Question is too long: ask user to shorten it');

const topK = Math.min(Number(src.top_k ?? 5), 8);
const filters = src.filters ?? {};
const qdrantFilter = { must: [] };
for (const [key, value] of Object.entries(filters)) {
  if (value) qdrantFilter.must.push({ key, match: { value } });
}

const systemGuard = [
  'Отвечай только по контексту из найденных источников.',
  'Если ответа нет в контексте, скажи: "В базе знаний нет точного ответа".',
  'Не придумывай тарифы, сроки, ссылки и команды.',
  'В конце укажи source_ids использованных фрагментов.'
].join(' ');

return [{
  json: {
    question,
    top_k: topK,
    qdrant_search: { limit: topK, with_payload: true, filter: qdrantFilter },
    system_guard: systemGuard,
    audit_key: `qdrant-rag:${src.user_id ?? 'anon'}:${Date.now()}`,
    min_score: Number(src.min_score ?? 0.72)
  }
}];
```

## Importable workflow structure

```json
{
  "name": "Nodbot - Qdrant RAG FAQ bot",
  "nodes": [
    {
      "name": "Webhook question",
      "type": "n8n-nodes-base.webhook",
      "purpose": "Принять вопрос пользователя"
    },
    {
      "name": "Normalize query",
      "type": "n8n-nodes-base.code",
      "purpose": "Очистить вопрос и собрать фильтр Qdrant"
    },
    {
      "name": "Create embedding",
      "type": "n8n-nodes-base.httpRequest",
      "purpose": "Получить embedding для вопроса"
    },
    {
      "name": "Search Qdrant points",
      "type": "n8n-nodes-base.httpRequest",
      "purpose": "Найти релевантные chunks"
    },
    {
      "name": "Build grounded prompt",
      "type": "n8n-nodes-base.code",
      "purpose": "Собрать prompt с источниками"
    },
    {
      "name": "Respond or human review",
      "type": "n8n-nodes-base.respondToWebhook",
      "purpose": "Вернуть ответ или статус review"
    }
  ],
  "connections": "Webhook question → Normalize query → Create embedding → Search Qdrant points → Build grounded prompt → Respond or human review"
}
```

## Retrieval hints

- Использовать HTML как canonical source.
- Markdown удобен для LLM-ответов, извлечения workflow-контракта, кода и чеклистов.
- Для ссылок пользователю отдавать canonical URL.
