AI-чат-бот для интернет-магазина: консультации, подбор товаров, предзаказы
Введение: Почему чат-бот — это не экономия на поддержке, а увеличение конверсии
Большинство владельцев интернет-магазинов воспринимают чат-бота как способ сэкономить на зарплате оператора. Это ошибка. Хороший AI-чат-бот — это не замена человека, а инструмент увеличения конверсии. Пока оператор спит, едет домой или общается с другим клиентом, бот работает 24/7, консультирует, помогает выбрать товар, принимает предзаказы и собирает информацию о клиенте.
Средний показатель: чат-боты увеличивают конверсию на 10-30%, снижают нагрузку на поддержку на 40-60%, собирают в 3 раза больше данных о клиентах. Но только при условии, что это умный бот, а не простой скрипт с кнопками.
В этой статье мы разберём, как создать чат-бота, который действительно понимает вопросы клиентов, помогает выбрать товар, принимает заказы и интегрируется с вашей CRM. От архитектуры до обучения модели на русском языке.
Часть 1: Как AI-бот понимает вопросы на естественном языке
Архитектура NLP-бота для русского языка
Проблема русскоязычных чат-ботов в том, что большинство готовых решений (Dialogflow, Amazon Lex) плохо работают с русским языком, особенно с его морфологическим богатством. «Купить кофемашину», «кофемашина купить», «хочу кофемашину» — для человека это один и тот же запрос, для простого бота — три разных.
Решение: использовать современные языковые модели, предобученные на русском корпусе текстов. Лучшие варианты на 2024 год:
- ruBERT от DeepPavlov: Модель, специально обученная на русских текстах. Хорошо справляется с классификацией интентов.
- ruGPT-3 от SberAI: Генеративная модель, которая может создавать осмысленные ответы.
- Yandex GPT: Модель от Яндекса, интегрированная с Yandex Dialogues.
Техническая реализация: от текста к интенту
Шаг 1: Подготовка данных для обучения
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
# Структура датасета для обучения
data = [
{"text": "сколько стоит доставка", "intent": "delivery_cost"},
{"text": "какая стоимость доставки", "intent": "delivery_cost"},
{"text": "доставка бесплатная?", "intent": "delivery_cost"},
{"text": "есть ли скидки", "intent": "discounts"},
{"text": "акции сейчас", "intent": "discounts"},
{"text": "предложения со скидкой", "intent": "discounts"},
# ... минимум 30-50 примеров на каждый интент
]
df = pd.DataFrame(data)
# Разделяем на тренировочную и тестовую выборку
train_df, test_df = train_test_split(df, test_size=0.2, random_state=42)
Шаг 2: Загрузка предобученной модели ruBERT
import torch
from transformers import BertTokenizer, BertForSequenceClassification
from transformers import Trainer, TrainingArguments
# Загружаем токенизатор и модель
tokenizer = BertTokenizer.from_pretrained('DeepPavlov/rubert-base-cased')
model = BertForSequenceClassification.from_pretrained(
'DeepPavlov/rubert-base-cased',
num_labels=len(df['intent'].unique()) # Количество наших интентов
)
# Токенизация данных
def tokenize_function(examples):
return tokenizer(
examples["text"],
padding="max_length",
truncation=True,
max_length=128
)
train_encodings = tokenizer(train_df['text'].tolist(), truncation=True, padding=True)
test_encodings = tokenizer(test_df['text'].tolist(), truncation=True, padding=True)
Шаг 3: Создание датасета для PyTorch
import torch
class IntentDataset(torch.utils.data.Dataset):
def __init__(self, encodings, labels):
self.encodings = encodings
self.labels = labels
def __getitem__(self, idx):
item = {key: torch.tensor(val[idx]) for key, val in self.encodings.items()}
item['labels'] = torch.tensor(self.labels[idx])
return item
def __len__(self):
return len(self.labels)
# Преобразуем метки в числовой формат
intent_to_id = {intent: i for i, intent in enumerate(df['intent'].unique())}
id_to_intent = {i: intent for intent, i in intent_to_id.items()}
train_labels = [intent_to_id[intent] for intent in train_df['intent']]
test_labels = [intent_to_id[intent] for intent in test_df['intent']]
train_dataset = IntentDataset(train_encodings, train_labels)
test_dataset = IntentDataset(test_encodings, test_labels)
Шаг 4: Обучение модели
training_args = TrainingArguments(
output_dir='./results',
num_train_epochs=10,
per_device_train_batch_size=16,
per_device_eval_batch_size=64,
warmup_steps=500,
weight_decay=0.01,
logging_dir='./logs',
logging_steps=10,
evaluation_strategy="epoch"
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
eval_dataset=test_dataset
)
trainer.train()
Извлечение сущностей (NER — Named Entity Recognition)
Помимо понимания интента, бот должен извлекать конкретные данные из запроса: названия товаров, размеры, цвета, цены. Для этого нужна NER-модель.
from transformers import BertTokenizerFast, BertForTokenClassification
from transformers import pipeline
# Загружаем модель для NER (предобученную на русском)
ner_tokenizer = BertTokenizerFast.from_pretrained('DeepPavlov/rubert-base-cased')
ner_model = BertForTokenClassification.from_pretrained(
'DeepPavlov/rubert-base-cased',
num_labels=7 # BIO-схема для сущностей
)
ner_pipeline = pipeline("ner", model=ner_model, tokenizer=ner_tokenizer)
def extract_entities(text):
entities = ner_pipeline(text)
# Группируем токены в сущности
extracted = {}
current_entity = ""
current_type = ""
for entity in entities:
if entity['entity'].startswith('B-'): # Beginning
if current_entity:
extracted[current_type] = current_entity.strip()
current_type = entity['entity'][2:]
current_entity = entity['word']
elif entity['entity'].startswith('I-'): # Inside
if entity['word'].startswith('##'):
current_entity += entity['word'][2:]
else:
current_entity += " " + entity['word']
if current_entity:
extracted[current_type] = current_entity.strip()
return extracted
# Пример использования
text = "хочу купить кофемашину Delonghi за 30000 рублей"
entities = extract_entities(text)
# entities = {'PRODUCT': 'кофемашину Delonghi', 'PRICE': '30000 рублей'}
Часть 2: подбор товаров по параметрам — от простого фильтра до умного ассистента
Проблема: пользователь не знает, что ищет
Типичный диалог:
Пользователь: «Нужен подарок жене»
Обычный бот: «У нас 5000 товаров, воспользуйтесь фильтрами»
Умный бот: «Расскажите больше. Какой у неё характер? Какие хобби? Какой бюджет?»
Умный бот ведёт диалог как опытный продавец: задаёт уточняющие вопросы, предлагает варианты, учится на ответах.
Реализация диалогового подбора
Архитектура диалоговой системы:
class ProductRecommenderBot:
def __init__(self):
self.dialog_states = {} # Состояния диалогов по user_id
self.product_catalog = ProductCatalog()
def process_message(self, user_id, message):
# Получаем или создаём состояние диалога
if user_id not in self.dialog_states:
self.dialog_states[user_id] = {
'state': 'start',
'collected_data': {},
'step': 0
}
state = self.dialog_states[user_id]
# Определяем интент сообщения
intent = self.classify_intent(message)
# Обрабатываем в зависимости от состояния
if state['state'] == 'start':
return self.handle_start_state(user_id, message, intent)
elif state['state'] == 'collecting_preferences':
return self.handle_collecting_state(user_id, message, intent)
elif state['state'] == 'showing_options':
return self.handle_showing_state(user_id, message, intent)
def handle_start_state(self, user_id, message, intent):