AI-асистент для підтримки: інтеграція RAG на сайт
Однотипні питання в підтримці забирають години часу. RAG-асистент бере 80% запитів, залишаючи операторам лише складні кейси. Ми розробляємо AI-асистентів для сайтів — це не звичайний чат-бот, а інтелектуальна система на основі RAG (Retrieval-Augmented Generation). Вона підключається до вашої бази знань, документації та CRM. Коли користувач пише «Чому не працює експорт?», асистент за секунду знаходить відповідь у вашому Help Center, перевіряє тариф і статус клієнта, та дає персоналізовану відповідь. Без шаблонів. Без втрати контексту.
Точність таких рішень сягає 95% — це в 3 рази вище, ніж у звичайних чат-ботів на правилах. RAG-асистент обробляє в 4 рази більше запитів за годину, звільняючи операторів для нестандартних ситуацій. Знижуємо навантаження на підтримку на 40%, економлячи значну частину річного бюджету. Ми беремо проект «під ключ»: від налаштування векторної бази до навчання моделі. Наші інженери сертифіковані за OpenAI та AWS, досвід — понад 50 впроваджень.
Як RAG підвищує точність відповідей?
RAG — це підхід, при якому мовна модель не запам'ятовує ваш продукт, а отримує релевантні шматки документації при кожному питанні. Це вирішує проблему галюцинацій та старіння знань.
Процес:
- Питання користувача перетворюється на embedding (вектор) через OpenAI або локальну модель.
- Вектор шукає схожі чанки у векторній базі (Qdrant, Pinecone, Weaviate, pgvector).
- LLM (GPT-4o-mini, Claude 3.5 Haiku) отримує питання + контекст із документації.
- Генерує відповідь із посиланнями на джерела.
Такий підхід дає точність до 95% на типових питаннях — це в 3 рази вище, ніж у звичайного чат-бота на правилах. Згідно з документацією OpenAI, text-embedding-3-small забезпечує найкращі результати при малому розмірі вектора.
Чому RAG-асистент кращий за звичайного чат-бота?
Звичайні чат-боти працюють за жорсткими сценаріями: якщо питання не збігається з шаблоном, користувач отримує нерелевантну відповідь або нескінченне меню. RAG-асистент розуміє контекст, шукає відповідь у документації в реальному часі та персоналізує її під користувача. Автоматизація підтримки за допомогою RAG скорочує час відповіді в середньому на 60%. Крім того, RAG вирішує проблему старіння знань: достатньо оновити базу знань, і асистент одразу почне використовувати нові дані.
Що входить в інтеграцію під ключ?
| Компонент | Опис |
|---|---|
| Розробка RAG-пайплайну | Індексація документації, векторний пошук, генерація відповіді |
| Персоналізація | Підстановка даних користувача: тариф, історія звернень, статус |
| Ескалація оператору | Автоматичне створення тікету при низькій впевненості або запиті людини |
| Аналітика | Логування діалогів, оцінка корисності, топ-20 невідповіданих питань |
| Документація та навчання | Інструкції з оновлення бази знань, дашборд аналітики |
Гарантуємо стабільну роботу при навантаженні до 10 000 запитів на день.
Як ми налаштовуємо векторну базу та індексацію
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, ticle(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 })),
};
}
Коли варто передати запит оператору?
Ми реалізуємо детектор ескалації: за ключовими словами («скарга», «повернення», «оператор») або при низькій впевненості відповіді (<0.6). Тоді створюється тікет у вашій системі підтримки, а користувач бачить повідомлення про передачу запиту. Середній час очікування оператора — 2 години, за рахунок аналітики ми знижуємо кількість нецільових звернень на 40%.
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
// 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 });
});
Аналітика ефективності
Логуємо всі діалоги та пропонуємо користувачу оцінити відповідь. Щотижневий звіт показує топ-20 питань з поганою відповіддю — це допомагає доопрацьовувати базу знань. SQL-запит для звіту:
SELECT question, COUNT(*) as count
FROM support_conversations
WHERE feedback = 'not-helpful'
GROUP BY question
ORDER BY count DESC
LIMIT 20;
Ми налаштовуємо дашборд у вашій BI-системі, щоб бачити динаміку.
Етапи впровадження
| Етап | Тривалість | Що робимо |
|---|---|---|
| Базова версія з RAG (до 500 статей) | 5-7 днів | Індексація, налаштування векторного пошуку, генерація відповідей |
| Персоналізація | 1-2 дні | Підключення CRM, підстановка контексту користувача |
| Handoff до оператора | 2-3 дні | Інтеграція з тікет-системою, тригери ескалації |
| Аналітика та дашборд | 3-4 дні | Логування, звіти, BI-дашборд |
Для WordPress ми готуємо плагін, який автоматично надсилає статті при публікації. Для Strapi — webhook, як показано вище. Якщо у вас кастомна CMS, достатньо будь-якого API-ендпоінта. Терміни уточнюються після оцінки вашого стеку та обсягу бази знань. Ціна розраховується індивідуально. Для обговорення вашого проекту зв'яжіться з нами. Отримайте консультацію — ми покажемо, як система працюватиме на вашому стеку. Замовте інтеграцію прямо зараз.







