12 мин. чтения

Как сделать AI-ассистента для бизнеса за неделю.

Пошаговое руководство: как создать умного чат-бота для вашего бизнеса, который реально работает и приносит пользу. Без PhD в машинном обучении - обещаем.

Зачем бизнесу AI-ассистент (и почему прямо сейчас)

Давайте начнём с честного вопроса: а вам вообще нужен AI-ассистент? Может, это просто модный хайп?

Вот несколько признаков того, что вам пора задуматься:

  • Ваша служба поддержки отвечает на одни и те же вопросы каждый день
  • Клиенты пишут в нерабочее время и не получают ответа до утра
  • Менеджеры тратят полдня на объяснение условий доставки/возврата/оплаты
  • У вас есть FAQ-страница, которую никто не читает (классика жанра)
  • Новые сотрудники задают одинаковые вопросы каждую неделю

Если хотя бы 2 пункта - про вас, то AI-ассистент окупится за первый месяц. Не преувеличиваем. А теперь давайте его сделаем.

Что мы будем делать

За неделю мы соберём полноценного AI-ассистента, который:

  1. Знает всё о вашем бизнесе (товары, услуги, условия, FAQ)
  2. Отвечает на вопросы клиентов 24/7
  3. Не придумывает ерунду (отвечает только по вашим данным)
  4. Может работать в Telegram, на сайте или где угодно
  5. Стоит $50-100 в месяц (а не $50,000, как "корпоративные решения")

Звучит как план? Поехали.

День 1-2: Собираем базу знаний

AI-ассистент хорош ровно настолько, насколько хороши данные, которые вы ему дали. Мусор на входе - мусор на выходе. Поэтому первый шаг - самый важный.

Что собирать

Соберите всё, что может пригодиться для ответов клиентам:

  • FAQ - все частые вопросы и ответы
  • Описания товаров/услуг - что продаёте, сколько стоит, чем отличается
  • Условия - доставка, оплата, возврат, гарантия
  • О компании - история, команда, контакты, режим работы
  • Инструкции - как пользоваться продуктом, как оформить заказ

В каком формате

Идеальный формат - простой текст. Не нужно делать красивые PDF или презентации. AI читает текст, а не картинки.

// Пример файла base_knowledge/delivery.txt
// Просто текст, разделённый на логические блоки

# Доставка

## Сроки доставки
- Москва и МО: 1-2 рабочих дня
- Санкт-Петербург: 2-3 рабочих дня
- Другие города: 3-7 рабочих дней
- Самовывоз: в день заказа (после подтверждения)

## Стоимость доставки
- Бесплатно при заказе от 5000 руб
- Москва: 300 руб
- Санкт-Петербург: 400 руб
- Другие города: от 350 руб (зависит от региона)

## Отслеживание
После отправки вы получите трек-номер по SMS и email.
Отследить заказ можно на сайте в разделе "Мои заказы"
или по ссылке из SMS.

День 3: Настраиваем серверную часть

Теперь создадим сервер, который будет обрабатывать вопросы. Не пугайтесь кода - мы объясним каждую строчку:

// server.js - наш AI-ассистент
// Устанавливаем: npm install express openai fs

import express from "express"
import OpenAI from "openai"
import fs from "fs"
import path from "path"

// Создаём сервер
const app = express()
app.use(express.json())  // чтобы понимать JSON-запросы

// Подключаемся к OpenAI
const openai = new OpenAI({
  apiKey: process.env.OPENAI_API_KEY  // ключ из переменных окружения
})

// Загружаем базу знаний из текстовых файлов
function loadKnowledgeBase() {
  const knowledgeDir = "./base_knowledge"
  let allText = ""

  // Читаем все .txt файлы из папки
  const files = fs.readdirSync(knowledgeDir)
  for (const file of files) {
    if (file.endsWith(".txt")) {
      const content = fs.readFileSync(
        path.join(knowledgeDir, file),
        "utf-8"
      )
      allText += `\n\n--- ${file} ---\n${content}`
    }
  }

  console.log(`Загружено файлов: ${files.length}`)
  console.log(`Общий размер базы знаний: ${allText.length} символов`)

  return allText
}

// Загружаем при старте сервера
const knowledgeBase = loadKnowledgeBase()

console.log("База знаний загружена!")
console.log("Сервер готов к работе")

День 3 (продолжение): API для вопросов

// Добавляем обработку вопросов

// Системный промпт - инструкция для AI
// Это САМАЯ ВАЖНАЯ часть! От промпта зависит качество ответов
const systemPrompt = `Ты - AI-ассистент компании [Название вашей компании].

ПРАВИЛА:
1. Отвечай ТОЛЬКО на основе предоставленной базы знаний
2. Если в базе знаний нет информации для ответа - скажи:
   "К сожалению, у меня нет информации по этому вопросу.
    Пожалуйста, свяжитесь с нами: [контакты]"
3. Отвечай дружелюбно, но кратко и по делу
4. Не придумывай информацию - лучше признайся, что не знаешь
5. Если вопрос не связан с компанией - вежливо скажи,
   что можешь помочь только по вопросам о компании

БАЗА ЗНАНИЙ:
${knowledgeBase}`

// Обработчик вопросов
app.post("/api/ask", async (req, res) => {
  try {
    const { question } = req.body

    // Проверяем, что вопрос не пустой
    if (!question || question.trim().length === 0) {
      return res.status(400).json({ error: "Вопрос не может быть пустым" })
    }

    // Отправляем вопрос в ChatGPT вместе с базой знаний
    const response = await openai.chat.completions.create({
      model: "gpt-4o-mini",    // быстрая и недорогая модель
      temperature: 0.3,         // меньше "творчества", больше точности
      max_tokens: 500,          // ограничиваем длину ответа
      messages: [
        { role: "system", content: systemPrompt },
        { role: "user", content: question }
      ]
    })

    // Отправляем ответ клиенту
    const answer = response.choices[0].message.content

    res.json({
      answer: answer,
      // Сколько стоил этот запрос (для мониторинга расходов)
      tokens_used: response.usage.total_tokens
    })

  } catch (error) {
    console.error("Ошибка:", error.message)
    res.status(500).json({
      error: "Что-то пошло не так. Попробуйте ещё раз."
    })
  }
})

// Запускаем сервер
app.listen(3000, () => {
  console.log("AI-ассистент запущен на порту 3000!")
  console.log("Попробуйте: POST /api/ask с телом { question: \"....\" }")
})

Вот и всё! Серверная часть готова. Уже сейчас можно отправлять вопросы и получать ответы.

День 4: Делаем виджет для сайта

Серверная часть работает - теперь нужен красивый интерфейс. Сделаем чат-виджет, который можно встроить на любой сайт:

// chat-widget.js - виджет чата для сайта
// Подключается одной строкой: <script src="chat-widget.js"></script>

(function() {
  // Создаём кнопку чата (кружок в правом нижнем углу)
  const button = document.createElement("div")
  button.innerHTML = "💬"
  button.style.cssText = `
    position: fixed;
    bottom: 20px;
    right: 20px;
    width: 60px;
    height: 60px;
    border-radius: 50%;
    background: #00ff88;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 28px;
    cursor: pointer;
    box-shadow: 0 4px 20px rgba(0,255,136,0.3);
    z-index: 10000;
    transition: transform 0.2s;
  `
  button.onmouseover = () => button.style.transform = "scale(1.1)"
  button.onmouseout = () => button.style.transform = "scale(1)"

  // Создаём окно чата
  const chat = document.createElement("div")
  chat.style.cssText = `
    position: fixed;
    bottom: 90px;
    right: 20px;
    width: 380px;
    max-height: 500px;
    border-radius: 16px;
    background: #1a1a1a;
    border: 1px solid rgba(255,255,255,0.1);
    display: none;
    flex-direction: column;
    overflow: hidden;
    z-index: 10000;
    box-shadow: 0 10px 40px rgba(0,0,0,0.5);
  `

  // HTML внутри окна чата
  chat.innerHTML = `
    <div style="padding:16px;background:#111;border-bottom:1px solid rgba(255,255,255,0.1)">
      <div style="font-weight:bold;color:#fff;font-size:14px">
        AI-ассистент
      </div>
      <div style="color:rgba(255,255,255,0.4);font-size:12px">
        Обычно отвечаем за пару секунд
      </div>
    </div>
    <div id="chat-messages" style="flex:1;overflow-y:auto;padding:16px;min-height:300px">
      <div style="background:rgba(0,255,136,0.1);padding:10px 14px;border-radius:12px;
                  color:rgba(255,255,255,0.7);font-size:13px;max-width:80%">
        Привет! Я AI-ассистент. Задайте мне любой вопрос о нашей компании.
      </div>
    </div>
    <div style="padding:12px;border-top:1px solid rgba(255,255,255,0.1);display:flex;gap:8px">
      <input id="chat-input" type="text" placeholder="Введите вопрос..."
             style="flex:1;background:rgba(255,255,255,0.05);border:1px solid rgba(255,255,255,0.1);
                    border-radius:10px;padding:10px 14px;color:#fff;font-size:13px;outline:none" />
      <button id="chat-send"
              style="background:#00ff88;color:#000;border:none;border-radius:10px;
                     padding:10px 16px;font-weight:bold;cursor:pointer;font-size:13px">
        →
      </button>
    </div>
  `

  document.body.appendChild(button)
  document.body.appendChild(chat)

  // Открываем/закрываем чат
  let isOpen = false
  button.onclick = () => {
    isOpen = !isOpen
    chat.style.display = isOpen ? "flex" : "none"
    button.innerHTML = isOpen ? "✕" : "💬"
  }

  // Отправка сообщения
  const input = chat.querySelector("#chat-input")
  const sendBtn = chat.querySelector("#chat-send")
  const messages = chat.querySelector("#chat-messages")

  async function sendMessage() {
    const text = input.value.trim()
    if (!text) return

    // Показываем сообщение пользователя
    messages.innerHTML += `
      <div style="text-align:right;margin-top:12px">
        <span style="background:rgba(255,255,255,0.1);padding:10px 14px;
              border-radius:12px;color:#fff;font-size:13px;display:inline-block;
              max-width:80%;text-align:left">${text}</span>
      </div>`

    input.value = ""

    // Показываем индикатор загрузки
    const loadingId = "loading-" + Date.now()
    messages.innerHTML += `
      <div id="${loadingId}" style="margin-top:12px">
        <span style="color:rgba(255,255,255,0.3);font-size:13px">
          Думаю...
        </span>
      </div>`
    messages.scrollTop = messages.scrollHeight

    try {
      // Отправляем вопрос на сервер
      const response = await fetch("/api/ask", {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({ question: text })
      })
      const data = await response.json()

      // Убираем индикатор загрузки
      document.getElementById(loadingId).remove()

      // Показываем ответ
      messages.innerHTML += `
        <div style="margin-top:12px">
          <div style="background:rgba(0,255,136,0.1);padding:10px 14px;
                border-radius:12px;color:rgba(255,255,255,0.8);font-size:13px;
                max-width:85%;line-height:1.5">
            ${data.answer}
          </div>
        </div>`
    } catch (err) {
      document.getElementById(loadingId).remove()
      messages.innerHTML += `
        <div style="margin-top:12px">
          <span style="color:rgba(255,100,100,0.7);font-size:13px">
            Ошибка. Попробуйте ещё раз.
          </span>
        </div>`
    }

    messages.scrollTop = messages.scrollHeight
  }

  sendBtn.onclick = sendMessage
  input.onkeydown = (e) => { if (e.key === "Enter") sendMessage() }
})()

// Теперь добавьте на сайт:
// <script src="/chat-widget.js"></script>
// И чат-виджет появится в правом нижнем углу!

День 5: Подключаем Telegram

Многие клиенты предпочитают Telegram. Подключить бота - дело на пару часов:

// telegram-bot.js
// Устанавливаем: npm install telegraf

import { Telegraf } from "telegraf"

// Создаём бота (токен получаем у @BotFather в Telegram)
const bot = new Telegraf(process.env.TELEGRAM_BOT_TOKEN)

// Приветствие при старте
bot.start((ctx) => {
  ctx.reply(
    "Привет! Я AI-ассистент компании [Название].\n\n" +
    "Задайте мне любой вопрос о наших товарах, " +
    "доставке, оплате или услугах.\n\n" +
    "Например: \"Сколько стоит доставка в Москву?\""
  )
})

// Обработка сообщений
bot.on("text", async (ctx) => {
  const question = ctx.message.text

  // Показываем, что бот "печатает"
  await ctx.sendChatAction("typing")

  try {
    // Отправляем вопрос на наш сервер
    const response = await fetch("http://localhost:3000/api/ask", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ question })
    })

    const data = await response.json()

    // Отправляем ответ пользователю
    await ctx.reply(data.answer)

  } catch (error) {
    await ctx.reply(
      "Извините, произошла ошибка. " +
      "Попробуйте повторить вопрос или свяжитесь с нами напрямую."
    )
  }
})

// Запускаем бота
bot.launch()
console.log("Telegram-бот запущен!")

// Корректное завершение при остановке
process.once("SIGINT", () => bot.stop("SIGINT"))
process.once("SIGTERM", () => bot.stop("SIGTERM"))

День 6: Добавляем историю диалога

Сейчас наш бот отвечает на каждый вопрос отдельно. Но клиенты часто ведут диалог:

"Сколько стоит доставка?" - "300 рублей" - "А если заказ больше 5000?" - ???

Бот не помнит, что разговор про доставку! Исправим:

// Добавляем память диалогов

// Хранилище диалогов (в памяти - для простоты)
// В продакшене лучше использовать Redis или базу данных
const conversations = new Map()

// Максимум сообщений в истории (чтобы не тратить все токены)
const MAX_HISTORY = 10

app.post("/api/ask", async (req, res) => {
  const { question, sessionId } = req.body

  // sessionId - уникальный ID пользователя/сессии
  // На сайте можно генерировать случайный ID при первом визите
  // В Telegram - это ctx.from.id

  // Получаем историю диалога (или создаём новую)
  if (!conversations.has(sessionId)) {
    conversations.set(sessionId, [])
  }
  const history = conversations.get(sessionId)

  // Добавляем новый вопрос в историю
  history.push({ role: "user", content: question })

  // Обрезаем, если история слишком длинная
  if (history.length > MAX_HISTORY) {
    // Удаляем самые старые сообщения (но НЕ первое!)
    history.splice(0, history.length - MAX_HISTORY)
  }

  // Отправляем в GPT с полной историей
  const response = await openai.chat.completions.create({
    model: "gpt-4o-mini",
    temperature: 0.3,
    messages: [
      { role: "system", content: systemPrompt },
      ...history  // вся история диалога
    ]
  })

  const answer = response.choices[0].message.content

  // Добавляем ответ в историю
  history.push({ role: "assistant", content: answer })

  res.json({ answer })
})

// Теперь бот помнит контекст:
// Клиент: "Сколько стоит доставка в Москву?"
// Бот: "Доставка в Москву стоит 300 рублей..."
// Клиент: "А если заказ больше 5000?"
// Бот: "При заказе от 5000 рублей доставка бесплатная!"
//       (бот помнит, что речь про доставку)

День 7: Тестируем и запускаем

Последний день - тестирование. Вот чек-лист:

  1. Базовые вопросы - проверьте 20-30 типичных вопросов клиентов
  2. Каверзные вопросы - "какая у вас зарплата?", "расскажи анекдот" - бот должен корректно отклонять
  3. Несуществующая информация - спросите то, чего нет в базе знаний - бот должен честно ответить "не знаю"
  4. Контекст диалога - проверьте, что бот помнит предыдущие сообщения
  5. Нагрузка - отправьте 10 вопросов одновременно - всё должно работать

Что можно улучшить дальше

Базовый бот готов и работает. Но его можно сделать ещё лучше:

  • Векторный поиск - вместо загрузки всей базы знаний в промпт, использовать RAG (поиск релевантных фрагментов). Это обязательно для больших баз знаний
  • Аналитика - какие вопросы задают чаще всего? На какие бот не может ответить?
  • Оценка ответов - кнопки "полезно/не полезно" под каждым ответом
  • Передача оператору - если бот не может помочь - подключить живого человека
  • Мультиязычность - GPT отлично работает на разных языках
  • Интеграция с CRM - сохранять все диалоги, анализировать потребности клиентов
Всё это мы уже делали для наших клиентов. Базовый бот - за неделю. Продвинутый с RAG, аналитикой и интеграциями - за 1-2 недели. Если не хотите возиться с кодом сами - напишите нам, сделаем всё под ключ. А если хотите попробовать сами - эта статья вам в помощь.

Сколько это стоит

Давайте посчитаем месячные расходы на содержание бота:

Статья расходовСтоимостьКомментарий
OpenAI API (GPT-4o-mini)$20-50/месЗависит от количества вопросов
Сервер (VPS)$10-20/месХватит самого простого
Домен + SSL$1-2/месЕсли нужен свой домен для виджета
Итого$30-70/месДешевле одного сотрудника поддержки

Для сравнения: один сотрудник службы поддержки обходится в 40,000-80,000 руб/месяц. AI-ассистент не заменит людей полностью, но может взять на себя 60-80% типовых вопросов. Считайте сами.

Реальные примеры использования

Вот несколько кейсов, которые мы реализовали (без имён клиентов - NDA):

  • Интернет-магазин электроники - бот отвечает на вопросы о товарах, наличии, сравнивает характеристики. Снизил нагрузку на поддержку на 45%
  • Юридическая компания - бот проводит первичную консультацию, определяет тип проблемы клиента и записывает на приём к нужному специалисту
  • Образовательная платформа - бот-наставник, который помогает студентам с вопросами по курсу и даёт подсказки (но не решает за них!)
  • HR-отдел крупной компании - внутренний бот для сотрудников. Отпуска, больничные, регламенты - всё в одном месте

Типичные ошибки (чтобы вы их не повторяли)

  1. Слишком креативный промпт - не просите бота "быть весёлым и креативным". Клиентам нужны точные ответы, а не стендап
  2. Нет fallback-а - если бот не знает ответ, он должен предложить связаться с живым человеком. Не оставляйте клиента в тупике
  3. Устаревшая база знаний - обновили цены на сайте, но забыли обновить базу для бота? Бот будет говорить старые цены. Настройте регулярное обновление
  4. Нет лимитов - без ограничений один любопытный пользователь может "наговорить" на $100 за день. Добавьте лимит запросов

Итого: ваш план на неделю

  • День 1-2: Собираем и структурируем базу знаний
  • День 3: Настраиваем сервер и API
  • День 4: Делаем виджет для сайта
  • День 5: Подключаем Telegram
  • День 6: Добавляем историю диалогов
  • День 7: Тестируем и запускаем!

Это базовый AI-ассистент, который уже приносит пользу. Дальше можно улучшать бесконечно: добавлять RAG, аналитику, интеграции с CRM и мессенджерами.

Главное - начать. Базовый бот за неделю лучше идеального бота, который "когда-нибудь потом".

Если хотите сэкономить время и получить сразу продвинутую версию - мы в ENOT.SOFTWARE делаем AI-ассистентов для бизнеса "под ключ". От идеи до запуска - 1-2 недели. Оставьте заявку, и мы бесплатно оценим, подходит ли AI-ассистент для вашего бизнеса. Спойлер: в 90% случаев - подходит.
Все статьи
Как сделать AI-ассистента для бизнеса за неделю | Enot Software