Как мы внедрили AI-поддержку в SaaS-продукт и снизили среднее время решения инцидента почти на треть. Подробный разбор архитектуры RAG + агент, интеграции с Intercom, метрик и затрат за 2025–2026 годы.
Статья была полезной?
Мы внедрили систему AI-поддержки в коммерческий SaaS в сентябре 2025 года и масштабировали её по всем клиентским аккаунтам к февралю 2026 года. Результат — ощутимое сокращение time to resolution и повышение качества первых ответов оператора.
Основная бизнес-цель проекта — снизить среднее время решения (time to resolution, TTR) по тикетам поддержки для платной подписки B2B-продукта. До внедрения AI-поддержки средний TTR по платным клиентам составлял 4.2 часа, SLA требовал 2 часа для критичных инцидентов. Дополнительные цели: увеличить долю тикетов, которые можно обработать без эскалации к инженерам, и повысить удовлетворённость (CSAT) первого ответа.
Требования и ограничения проекта были следующими:
В качестве метрик успеха ставили:
Мы выбрали модель Retrieval-Augmented Generation (RAG) в связке с агентной логикой, чтобы сочетать достоверность фактов (через поиск по векторному индексу) и операторскую автоматизацию (через набор действий агента). Схема компонентов:
Инжестовый скрипт запускался по расписанию (раз в час) и при значимых релизах. Для релизов и известных инцидентов была предусмотрена ручная аннотация при помощи UI, чтобы пометить важные фрагменты как "must find".
Ниже сокращённый пример интеграции эмбеддингов, поиска и генерации. Фрагмент демонстрирует идею, не привязан к конкретной библиотеке:
import requests
from vector_db import VectorDBClient
from llm_client import LLMClient
# 1) Эмбеддинг запроса
query = "Не могу подключиться к API, получаю 403"
emb = embed_text(query) # возвращает список чисел
# 2) Поиск по векторной БД
vdb = VectorDBClient(api_key="XXX")
results = vdb.search(vector=emb, top_k=5)
# 3) Собираем контекст
context = "
".join([r['text'] for r in results])
# 4) Генерация ответа с системными ограничениями
prompt = f"System: Не раскрывать PII. Используй только информацию из контекста.
Context:
{context}
User: {query}
Assistant:"
llm = LLMClient(api_key="YYY")
answer = llm.generate(prompt=prompt, max_tokens=300)
print(answer)В реальном проекте мы добавили слои фильтрации, проверку фактов по changelog (например, наличие фикс-патча 2026-01-12) и версию SDK клиента, которую прислал пользователь.
Агент реализован как набор правил + LLM-предсказание следующего шага. Он принимает на вход: тип запроса, найденные документы, метаданные пользователя (план подписки, последние 30 логов) и историю переписки. Решение — одно из следующих действий:
Чтобы минимизировать «галлюцинации», агент сначала проверяет соответствие утверждений релевантными источниками: если LLM генерирует утверждение, агент требует подстроку из источника с exact-match или high-similarity (>=0.82 cosine) перед тем, как вставить утверждение как факт в ответ.
Intercom был основным каналом коммуникации с клиентами, поэтому интеграция включала две плоскости: синхронные ответы в чатах и бек-офисный интерфейс для агентов поддержки.
Мы подписались на события Intercom: conversation.user.created, conversation.admin.replied, conversation.user.replied. Вебхук получал тело запроса, мы парсили тип сообщения, автора и текст, затем передавали в RAG-агрегатор.
# Flask-пример обработки вебхука (упрощённый)
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/webhook/intercom', methods=['POST'])
def intercom_webhook():
payload = request.json
event = payload.get('topic')
convo = payload.get('data', {}).get('item', {})
# извлечение текста, id пользователя и метаданных
user_id = convo['user']['id']
msg = convo['conversation_parts']['conversation_parts'][-1]['body']
# отправляем сообщение в RAG-пайплайн
response = send_to_rag(user_id, msg)
return jsonify({'status': 'ok'})Ответы, сформированные агентом, отправлялись в Intercom через API как draft-предложения. В UI оператора это выглядело как подсказка с возможностью редактирования. При автоскоплении (auto-closure) ответ мог быть отправлен автоматически, но только если confidence >= 0.88 и заметка содержала ссылку на источник.
Пример запроса к Intercom API для отправки сообщения:
POST https://api.intercom.io/conversations
Headers: Authorization: Bearer TOKEN
Body: {
"from": {"type":"admin","id":"ADMIN_ID\
Комментарии (0)
Войдите или зарегистрируйтесь, чтобы оставить комментарий
Загрузка комментариев…