Интеграция AI-ассистента для поддержки пользователей на сайте

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.
Разработка и обслуживание любых видов сайтов:
Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Интеграция AI-ассистента для поддержки пользователей на сайте
Средняя
~1-2 недели
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1214
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    852
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1041
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    823
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    815

Интеграция AI-ассистента для поддержки пользователей на сайте

AI-ассистент для поддержки — это шаг выше обычного чатбота. Он знает вашу документацию, базу знаний и статусы конкретных пользователей. Когда пользователь спрашивает «почему не работает экспорт», ассистент ищет ответ в вашем Help Center, проверяет тариф пользователя и отвечает конкретно, а не шаблонно.

Архитектура RAG для поддержки

RAG (Retrieval-Augmented Generation) — модель не знает ваш продукт, но при каждом запросе ей подсовывают релевантные куски документации из векторной базы:

Вопрос пользователя
       ↓
Векторизация вопроса (embedding)
       ↓
Поиск похожих чанков в Vector DB
       ↓
LLM получает: вопрос + контекст из документации
       ↓
Ответ на основе вашего контента

Стек для реализации:

Компонент Варианты
Vector DB Pinecone, Weaviate, Qdrant, pgvector
Embeddings OpenAI text-embedding-3-small, Cohere, Ollama (self-hosted)
LLM GPT-4o-mini, Claude 3.5 Haiku
Оркестрация LangChain.js, LlamaIndex, или без фреймворка

Индексирование базы знаний

import OpenAI from 'openai';
import { QdrantClient } from '@qdrant/js-client-rest';

const openai = new OpenAI();
const qdrant = new QdrantClient({ url: 'http://localhost:6333' });

// Подготовка коллекции
await qdrant.createCollection('support-docs', {
  vectors: { size: 1536, distance: 'Cosine' },
});

// Индексирование статей
async function indexArticle(article) {
  // Разбиваем на чанки по 500 токенов с перекрытием 100
  const chunks = splitIntoChunks(article.content, { size: 500, overlap: 100 });

  const embeddings = await openai.embeddings.create({
    model: 'text-embedding-3-small',
    input: chunks.map(c => c.text),
  });

  const points = chunks.map((chunk, i) => ({
    id: generateId(),
    vector: embeddings.data[i].embedding,
    payload: {
      text: chunk.text,
      articleId: article.id,
      articleTitle: article.title,
      category: article.category,
      url: article.url,
    },
  }));

  await qdrant.upsert('support-docs', { points });
}

Поиск и генерация ответа

async function answerQuestion(userId, question) {
  // Контекст пользователя из БД
  const user = await db.users.findById(userId);
  const userContext = `
    Пользователь: ${user.name}
    Тариф: ${user.plan}
    Дата регистрации: ${user.createdAt}
    Последние 3 обращения: ${user.recentTickets.join(', ')}
  `;

  // Векторный поиск
  const queryEmbedding = await openai.embeddings.create({
    model: 'text-embedding-3-small',
    input: question,
  });

  const results = await qdrant.search('support-docs', {
    vector: queryEmbedding.data[0].embedding,
    limit: 4,
    score_threshold: 0.75, // Игнорировать нерелевантное
  });

  const context = results.map(r =>
    `[${r.payload.articleTitle}](${r.payload.url})\n${r.payload.text}`
  ).join('\n\n---\n\n');

  // Генерация ответа
  const response = await openai.chat.completions.create({
    model: 'gpt-4o-mini',
    stream: true,
    messages: [
      {
        role: 'system',
        content: `Ты ассистент технической поддержки.
Отвечай ТОЛЬКО на основе предоставленной документации.
Если ответа нет в документации, скажи это явно и предложи создать тикет.
Всегда указывай источник (ссылку на статью).

Контекст пользователя:
${userContext}`,
      },
      {
        role: 'user',
        content: `Вопрос: ${question}\n\nРелевантная документация:\n${context}`,
      },
    ],
    max_tokens: 600,
    temperature: 0.2,
  });

  return {
    stream: response,
    sources: results.map(r => ({ title: r.payload.articleTitle, url: r.payload.url })),
  };
}

Handoff к живому оператору

Когда бот не может помочь — эскалация к оператору:

const ESCALATION_TRIGGERS = [
  'хочу поговорить с человеком',
  'оператор',
  'жалоба',
  'возврат денег',
  'удалить аккаунт',
];

function shouldEscalate(message, confidenceScore) {
  const lowerMessage = message.toLowerCase();
  const hasKeyword = ESCALATION_TRIGGERS.some(t => lowerMessage.includes(t));
  const lowConfidence = confidenceScore < 0.6;

  return hasKeyword || lowConfidence;
}

async function handleMessage(userId, message) {
  const { answer, confidence, sources } = await answerQuestion(userId, message);

  if (shouldEscalate(message, confidence)) {
    await createSupportTicket(userId, message);
    return {
      type: 'escalation',
      message: 'Передаю ваш запрос оператору. Среднее время ответа — 2 часа.',
      ticketId: ticket.id,
    };
  }

  await logConversation(userId, message, answer);
  return { type: 'answer', content: answer, sources };
}

Обновление базы знаний

Когда обновляется документация — нужно переиндексировать:

// Webhook от CMS при обновлении статьи
app.post('/webhooks/docs-updated', async (req, res) => {
  const { articleId, action } = req.body;

  if (action === 'delete') {
    await qdrant.delete('support-docs', {
      filter: { must: [{ key: 'articleId', match: { value: articleId } }] },
    });
  } else {
    const article = await fetchArticle(articleId);
    // Удаляем старые чанки
    await qdrant.delete('support-docs', {
      filter: { must: [{ key: 'articleId', match: { value: articleId } }] },
    });
    // Переиндексируем
    await indexArticle(article);
  }

  res.json({ ok: true });
});

Аналитика и улучшение

Логируем все диалоги и собираем фидбек:

// После каждого ответа предлагаем оценку
function renderFeedback(messageId) {
  return (
    <div className="feedback">
      <button onClick={() => submitFeedback(messageId, 'helpful')}>Помогло</button>
      <button onClick={() => submitFeedback(messageId, 'not-helpful')}>Не помогло</button>
    </div>
  );
}

// Еженедельный отчёт: топ-20 вопросов без хорошего ответа
SELECT question, COUNT(*) as count
FROM support_conversations
WHERE feedback = 'not-helpful'
GROUP BY question
ORDER BY count DESC
LIMIT 20;

Сроки

  • RAG-ассистент с базой знаний (до 500 статей) — 5–7 дней
  • Персонализация по контексту пользователя — плюс 1–2 дня
  • Handoff к оператору + тикет-система — плюс 2–3 дня
  • Аналитика диалогов и дашборд — плюс 3–4 дня