Разбор

FAQ-бот для сайта на Claude API: отвечает как твой лучший менеджер, а не как ChatGPT из 2023 года

91 из 120 чатов в месяц закрыл бот без участия человека. Архитектура без оверинжиниринга: контент сайта в промпт + Claude + JS-виджет. Цена диалога — 3–8 рублей. Для малого бизнеса это работает прямо сейчас.

• 6 мин чтения

В юридической компании «Право и дело» из Новосибирска менеджер каждый день тратил четыре часа на одинаковые вопросы: сколько стоит консультация, что нужно принести на первую встречу, работаете ли вы с физлицами, есть ли рассрочка. Четыре часа из восьми — на вопросы, ответы на которые есть на сайте. Просто никто не читает сайт — все пишут в чат.

91/120
чатов в месяц закрыл бот без участия менеджера. Живому человеку досталось только то, что действительно требует решения
Кейс: юридическая компания «Право и дело», Новосибирск, март 2026

Почему ChatGPT-виджеты 2023 года были бесполезны

Первые чат-боты на GPT для сайтов работали по одной схеме: берёшь OpenAI API, даёшь системный промпт «ты помощник компании X», и бот с воодушевлением начинает выдумывать. Какие у нас скидки? «Конечно, у вас скидки 10–30%» — при том что на сайте этого нет. Как быстро сделаете проект? «Обычно 2–3 дня» — менеджер узнаёт об этом из жалобы клиента.

Проблема была не в модели. Проблема была в архитектуре. Без базы знаний о конкретном бизнесе языковая модель заполняет пробелы из общих знаний. Клиент спрашивает про твой прайс — а модель вспоминает средние рыночные цены.

Решение простое и работает прямо сейчас. Берёшь всё что есть на сайте — FAQ, цены, условия работы, описание услуг — сохраняешь в текстовый файл, засовываешь в system prompt, и говоришь Claude: «отвечай только из этого документа». Для базы до 100 000 символов это работает без векторной базы данных, без Pinecone, без RAG-пайплайнов.

Какие вопросы реально задают клиенты

Прежде чем писать код, я попросил команду из «Право и дело» неделю вести табличку: что спрашивают в чате. Вот что получилось.

Распределение вопросов в чате юридической компании за неделю (n=87)
Цены и стоимость услуг
31%
График работы и адрес
22%
Документы для первой встречи
18%
Сроки и рассрочка
14%
Нестандартные ситуации
15%
85% вопросов — типовые, ответы на которые есть в любом FAQ. 15% требуют живого юриста.

85% вопросов — на них есть ответ в документах компании. Менеджер давал эти ответы вручную, и это было его основное занятие.

Архитектура без оверинжиниринга

📄База знанийFAQ + прайс + условия
🤖Claude APIsystem prompt + контекст
FastAPIбэкенд + история чата
💬JS-виджет200 строк, любой сайт

Ключевой момент: база знаний передаётся в каждый запрос через system prompt. Это означает дополнительные токены на каждое сообщение — но для базы ~50 000 символов это примерно 12 000–15 000 токенов, что на Claude Sonnet стоит около 1,5–2 рублей входящих. При ответе бота ещё 1–2 рубля. Итого диалог — 3–8 рублей в зависимости от длины базы и числа сообщений.

Для баз больше 200 000 символов нужен RAG (разбить документы на чанки, сделать векторный поиск, подгружать только релевантные части). Но большинство сайтов малого бизнеса — это 30–80 страниц, которые в текстовом виде занимают 20 000–70 000 символов. Сюда это всё помещается.

System prompt: как написать чтобы бот не галлюцинировал

Это самая важная часть. Вот шаблон который я использовал:

system_prompt.txt
Ты помощник компании [НАЗВАНИЕ]. Твоя задача — отвечать на вопросы клиентов.

ПРАВИЛО 1: Отвечай ТОЛЬКО на основе базы знаний ниже.
Не додумывай цены, сроки, условия и скидки — только то, что есть в документе.

ПРАВИЛО 2: Если в базе знаний нет ответа на вопрос —
скажи: "Этот вопрос лучше уточнить у менеджера" и предложи контакт:
телефон +7 (XXX) XXX-XX-XX или Telegram @username.

ПРАВИЛО 3: Отвечай коротко и по делу. Один вопрос — один абзац.
Не пиши длинные списки если вопрос простой.

ПРАВИЛО 4: Ты не принимаешь решения о нестандартных скидках,
исключениях и индивидуальных условиях. Для этого — менеджер.

ПРАВИЛО 5: Будь вежливым, но не льстивым. Не нужно "отличный вопрос!"

=== БАЗА ЗНАНИЙ КОМПАНИИ ===

[ЗДЕСЬ ВСТАВИТЬ СОДЕРЖИМОЕ FAQ, ПРАЙСА И УСЛОВИЙ]

Почему Claude лучше справляется с этим чем открытые модели? Он точнее следует инструкциям с запретами. Llama и Mistral при жёстком промпте про «только из базы» всё равно периодически уходят в свободную импровизацию. Claude держит ограничение стабильнее — я проверял на нескольких тысячах тестовых сообщений.

Код: Python FastAPI бэкенд

main.py — установить: pip install fastapi uvicorn anthropic
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
import anthropic
from pathlib import Path
import json, uuid

app = FastAPI()

# Разрешаем запросы с сайта
app.add_middleware(
  CORSMiddleware,
  allow_origins=["https://your-site.ru"],  # замени на свой домен
  allow_methods=["POST"],
  allow_headers=["*"],
)

# Загружаем базу знаний один раз при старте
KNOWLEDGE_BASE = Path("knowledge_base.txt").read_text(encoding="utf-8")

SYSTEM_PROMPT = f"""Ты помощник компании. Отвечай ТОЛЬКО из базы знаний ниже.
Если ответа нет — предложи связаться с менеджером: +7 (383) 200-00-00.
Не додумывай цены, сроки и условия.

=== БАЗА ЗНАНИЙ ===
{KNOWLEDGE_BASE}"""

client = anthropic.Anthropic(api_key="YOUR_API_KEY")

# Хранилище истории диалогов (для продакшена — Redis или SQLite)
sessions: dict[str, list] = {}

class ChatRequest(BaseModel):
  session_id: str | None = None
  message: str

@app.post("/chat")
async def chat(req: ChatRequest):
  # Создаём или продолжаем сессию
  sid = req.session_id or str(uuid.uuid4())
  if sid not in sessions:
      sessions[sid] = []

  # Добавляем сообщение пользователя
  sessions[sid].append({"role": "user", "content": req.message})

  # Ограничиваем историю — последние 10 сообщений
  history = sessions[sid][-10:]

  response = client.messages.create(
      model="claude-sonnet-4-5",
      max_tokens=512,
      system=SYSTEM_PROMPT,
      messages=history
  )

  bot_reply = response.content[0].text

  # Сохраняем ответ в историю
  sessions[sid].append({"role": "assistant", "content": bot_reply})

  return {"session_id": sid, "reply": bot_reply}

# Запуск: uvicorn main:app --host 0.0.0.0 --port 8000

Виджет: 200 строк JS для любого сайта

chat-widget.js — вставить перед </body>
(function() {
var API_URL = 'https://bot.your-site.ru/chat';
var sessionId = null;

// Создаём HTML виджета
var html = '<div id="fb-widget">' +
  '<button id="fb-toggle">💬</button>' +
  '<div id="fb-window" style="display:none">' +
    '<div id="fb-header"><span>Онлайн-консультант</span>' +
      '<button id="fb-close">✕</button></div>' +
    '<div id="fb-messages"></div>' +
    '<div id="fb-input-wrap">' +
      '<input id="fb-input" type="text" placeholder="Задайте вопрос..." />' +
      '<button id="fb-send">→</button>' +
    '</div>' +
  '</div>' +
'</div>';

var style = '<style>' +
  '#fb-widget{position:fixed;bottom:24px;right:24px;z-index:9999;font-family:sans-serif}' +
  '#fb-toggle{width:56px;height:56px;border-radius:50%;background:#7c3aed;color:#fff;' +
    'border:none;font-size:24px;cursor:pointer;box-shadow:0 4px 16px rgba(124,58,237,.4)}' +
  '#fb-window{width:340px;height:480px;background:#1a1a2e;border:1px solid #2d2d4e;' +
    'border-radius:16px;display:flex;flex-direction:column;box-shadow:0 8px 32px rgba(0,0,0,.4);margin-bottom:8px}' +
  '#fb-header{padding:14px 16px;background:#7c3aed;border-radius:16px 16px 0 0;' +
    'display:flex;justify-content:space-between;align-items:center;color:#fff;font-weight:600;font-size:14px}' +
  '#fb-close{background:none;border:none;color:#fff;cursor:pointer;font-size:18px;line-height:1}' +
  '#fb-messages{flex:1;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:8px}' +
  '.fb-msg{max-width:80%;padding:8px 12px;border-radius:12px;font-size:13px;line-height:1.5}' +
  '.fb-msg--user{background:#7c3aed;color:#fff;align-self:flex-end;border-radius:12px 12px 2px 12px}' +
  '.fb-msg--bot{background:#2d2d4e;color:#e2e8f0;align-self:flex-start;border-radius:12px 12px 12px 2px}' +
  '.fb-msg--typing{opacity:.6}' +
  '#fb-input-wrap{padding:12px;border-top:1px solid #2d2d4e;display:flex;gap:8px}' +
  '#fb-input{flex:1;background:#2d2d4e;border:1px solid #3d3d5e;border-radius:8px;' +
    'padding:8px 12px;color:#e2e8f0;font-size:13px;outline:none}' +
  '#fb-send{background:#7c3aed;color:#fff;border:none;border-radius:8px;' +
    'padding:8px 14px;cursor:pointer;font-size:16px}' +
  '@media(max-width:400px){#fb-window{width:calc(100vw - 32px)}}' +
'</style>';

document.head.insertAdjacentHTML('beforeend', style);
document.body.insertAdjacentHTML('beforeend', html);

var toggle = document.getElementById('fb-toggle');
var win = document.getElementById('fb-window');
var closeBtn = document.getElementById('fb-close');
var input = document.getElementById('fb-input');
var send = document.getElementById('fb-send');
var messages = document.getElementById('fb-messages');

function addMsg(text, role) {
  var div = document.createElement('div');
  div.className = 'fb-msg fb-msg--' + role;
  div.textContent = text;
  messages.appendChild(div);
  messages.scrollTop = messages.scrollHeight;
  return div;
}

function sendMsg() {
  var text = input.value.trim();
  if (!text) return;
  addMsg(text, 'user');
  input.value = '';
  var typing = addMsg('...', 'bot fb-msg--typing');

  fetch(API_URL, {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body: JSON.stringify({session_id: sessionId, message: text})
  })
  .then(function(r) { return r.json(); })
  .then(function(data) {
    sessionId = data.session_id;
    typing.textContent = data.reply;
    typing.className = 'fb-msg fb-msg--bot';
    messages.scrollTop = messages.scrollHeight;
  })
  .catch(function() {
    typing.textContent = 'Ошибка соединения. Попробуйте ещё раз.';
  });
}

toggle.addEventListener('click', function() {
  win.style.display = win.style.display === 'none' ? 'flex' : 'none';
  if (win.style.display !== 'none' && !messages.children.length) {
    addMsg('Здравствуйте! Задайте вопрос — отвечу по информации о нашей компании.', 'bot');
  }
});
closeBtn.addEventListener('click', function() { win.style.display = 'none'; });
send.addEventListener('click', sendMsg);
input.addEventListener('keydown', function(e) { if (e.key === 'Enter') sendMsg(); });
})();

Виджет намеренно примитивный: никаких зависимостей, копируешь файл на сервер, вставляешь тег <script src="/chat-widget.js"></script> перед закрывающим </body>. Работает на WordPress, Tilda, самописных сайтах — на чём угодно.

Цвета в CSS жёстко прописаны под тёмный фон — для продакшена замени #1a1a2e и #7c3aed на цвета своего бренда или вытащи в CSS-переменные.

Как это работает на практике: кейс юридической компании

Внедрение заняло три дня. Первый день — подготовка базы знаний. Мы взяли все страницы сайта, собрали FAQ вручную (47 вопросов), добавили прайс-лист с пояснениями, описание каждой услуги. Вышло 68 000 символов — в пределах контекста.

Второй день — настройка бота и тестирование. Самое сложное — написать system prompt так, чтобы бот уверенно говорил «не знаю» а не выдумывал. Мы прогнали 200 тестовых вопросов вручную, нашли 12 мест где бот уходил в фантазии (в основном про процессуальные сроки которые не были в базе), добавили их в базу знаний.

Третий день — деплой и запуск на реальных посетителях.

Через месяц: 120 чатов, 91 закрыл бот без привлечения менеджера. Из 29 переданных менеджеру — 21 это реальные консультации где человек записался. Четыре часа менеджерского времени в день сократились до одного.

СравнениеСамописный бот (Claude API)Jivo/Carrot Quest
Стоимость запуска~8 000 руб. (разработка)0 (SaaS)
Ежемесячные расходы360–960 руб. (API)2 790–7 900 руб./мес.
Качество ответовТолько из базы знанийШаблоны + операторы
Контроль данныхПолный (ваш сервер)На серверах SaaS
Время внедрения1–3 дня (нужен Python)1–2 часа (no-code)
Гибкость настройкиПолнаяВ рамках платформы

Jivo и Carrot Quest — нормальные продукты. Если у вас нет разработчика и вы хотите запустить за день — берите их. Но если есть хоть базовый Python и вы планируете работать с ботом больше полугода, самописное решение на Claude API дешевле уже с третьего месяца.

Проверь готовность своего сайта

Готов ли ваш сайт к FAQ-боту?

4 вопроса — поймёшь с чего начать

Вопрос 1 из 4
Есть ли у вас собранный FAQ — хотя бы 20 типовых вопросов с ответами?
Вопрос 2 из 4
Сколько однотипных вопросов получают ваши менеджеры в день?
Вопрос 3 из 4
Есть ли у вас (или партнёра) базовый Python для запуска бэкенда?
Вопрос 4 из 4
Ваша база знаний о продукте — сколько символов примерно?

Что делает бота по-настоящему хорошим

Код — это 20% работы. Остальное — качество базы знаний.

Плохая база: копируешь текст страниц сайта как есть, с навигацией, кнопками и SEO-мусором. Бот путается и не может найти нужное.

Хорошая база: структурированный текстовый файл. Заголовки разделов, под каждым — конкретные вопросы и ответы. Цены написаны явно: «Стоимость первичной консультации — 2 500 руб., длительность 60 минут». Не «от 2 500» и не «уточните у менеджера» — это будет вызывать именно тот вопрос который ты хотел автоматизировать.

Ещё одно: обновляй базу знаний синхронно с реальностью. Поменял прайс — обнови файл и перезапусти бот. Это дисциплина, а не техническая проблема. В «Право и дело» за первый месяц база обновлялась три раза — добавляли вопросы которые бот не мог закрыть и которые передавал менеджеру.


Менеджер теперь работает с 29 разговорами в месяц вместо 120. Все 29 — это люди которые реально хотят купить или у которых нестандартная ситуация. Конверсия из чата в запись выросла с 12% до 31% — потому что менеджер перестал тратить время на «сколько стоит» и начал тратить на «давайте я разберу вашу ситуацию».

Похожие кейсы

Источники

Источники

Часто задаваемые вопросы

Сколько стоит один диалог в FAQ-боте на Claude API?
Диалог из 5–7 сообщений с базой знаний ~50 000 символов обходится в 3–8 рублей на Claude Sonnet 4.5. Это учитывая и входящие токены (контекст + история), и исходящие (ответ бота). При 120 чатах в месяц — от 360 до 960 рублей. Для сравнения: Carrot Quest от 2 790 руб./мес. только за лицензию, без учёта базы операторов.
Нужна ли векторная база данных для бота по сайту?
Для базы знаний до 100 000 символов — нет. Claude Sonnet поддерживает 200 000 токенов контекста, и весь FAQ, прайс-лист и условия сервиса помещаются туда целиком. Векторная база (Pinecone, Weaviate, pgvector) нужна только если у вас тысячи страниц документации. Для малого бизнеса это оверинжиниринг.
Как сделать чтобы бот не галлюцинировал и не выдумывал цены?
Всё решается в system prompt двумя правилами: 1) отвечать только из предоставленной базы знаний, 2) если ответа нет в базе — говорить 'не знаю' и предлагать позвонить или написать менеджеру. Claude хорошо следует этим инструкциям в отличие от открытых моделей. Важно явно запретить: 'не додумывай цены, сроки и условия — только из документа'.
Какой Python-стек нужен для FAQ-бота на Claude API?
FastAPI для бэкенда (асинхронный, быстрый), anthropic SDK для вызовов Claude, обычный JSON-файл или SQLite для хранения истории диалогов. Фронтенд — 200 строк vanilla JS: виджет, открытие/закрытие чата, отправка сообщений. Никаких фреймворков. Деплой — на любой VPS или даже serverless-функцию.
Сколько времени занимает внедрение такого бота?
От идеи до рабочего бота на сайте — 1–2 дня для человека с базовым Python. Основное время уходит не на код, а на подготовку базы знаний: собрать FAQ, прописать цены, описать условия. Именно качество базы знаний определяет 80% качества ответов бота.
Как бот передаёт разговор живому менеджеру?
В system prompt прописывается триггер: если вопрос требует персонального решения, нестандартной скидки или жалобы — бот пишет 'Это лучше обсудить с менеджером' и предлагает телефон или Telegram. В продвинутой версии можно добавить кнопку 'Позвать менеджера' которая создаёт тикет в CRM.
Обсуждение

    Пока без комментариев. Будьте первым.

    Войдите, чтобы отправить комментарий

    Вы сможете комментировать статьи, сохранять материалы

    или войдите по email

    Бесплатная диагностика · 30 минут · без обязательств

    Маркетинг работает, но продажи не растут?

    Отвечу на 3–5 вопросов о вашем бизнесе — и мы вместе разберём, где именно теряются клиенты и что с этим делать.

    Без продаж. Без навязчивых звонков.