Разбор
FAQ-бот для сайта на Claude API: отвечает как твой лучший менеджер, а не как ChatGPT из 2023 года
91 из 120 чатов в месяц закрыл бот без участия человека. Архитектура без оверинжиниринга: контент сайта в промпт + Claude + JS-виджет. Цена диалога — 3–8 рублей. Для малого бизнеса это работает прямо сейчас.
В юридической компании «Право и дело» из Новосибирска менеджер каждый день тратил четыре часа на одинаковые вопросы: сколько стоит консультация, что нужно принести на первую встречу, работаете ли вы с физлицами, есть ли рассрочка. Четыре часа из восьми — на вопросы, ответы на которые есть на сайте. Просто никто не читает сайт — все пишут в чат.
Почему ChatGPT-виджеты 2023 года были бесполезны
Первые чат-боты на GPT для сайтов работали по одной схеме: берёшь OpenAI API, даёшь системный промпт «ты помощник компании X», и бот с воодушевлением начинает выдумывать. Какие у нас скидки? «Конечно, у вас скидки 10–30%» — при том что на сайте этого нет. Как быстро сделаете проект? «Обычно 2–3 дня» — менеджер узнаёт об этом из жалобы клиента.
Проблема была не в модели. Проблема была в архитектуре. Без базы знаний о конкретном бизнесе языковая модель заполняет пробелы из общих знаний. Клиент спрашивает про твой прайс — а модель вспоминает средние рыночные цены.
Решение простое и работает прямо сейчас. Берёшь всё что есть на сайте — FAQ, цены, условия работы, описание услуг — сохраняешь в текстовый файл, засовываешь в system prompt, и говоришь Claude: «отвечай только из этого документа». Для базы до 100 000 символов это работает без векторной базы данных, без Pinecone, без RAG-пайплайнов.
Какие вопросы реально задают клиенты
Прежде чем писать код, я попросил команду из «Право и дело» неделю вести табличку: что спрашивают в чате. Вот что получилось.
85% вопросов — на них есть ответ в документах компании. Менеджер давал эти ответы вручную, и это было его основное занятие.
Архитектура без оверинжиниринга
Ключевой момент: база знаний передаётся в каждый запрос через 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: как написать чтобы бот не галлюцинировал
Это самая важная часть. Вот шаблон который я использовал:
Ты помощник компании [НАЗВАНИЕ]. Твоя задача — отвечать на вопросы клиентов.
ПРАВИЛО 1: Отвечай ТОЛЬКО на основе базы знаний ниже.
Не додумывай цены, сроки, условия и скидки — только то, что есть в документе.
ПРАВИЛО 2: Если в базе знаний нет ответа на вопрос —
скажи: "Этот вопрос лучше уточнить у менеджера" и предложи контакт:
телефон +7 (XXX) XXX-XX-XX или Telegram @username.
ПРАВИЛО 3: Отвечай коротко и по делу. Один вопрос — один абзац.
Не пиши длинные списки если вопрос простой.
ПРАВИЛО 4: Ты не принимаешь решения о нестандартных скидках,
исключениях и индивидуальных условиях. Для этого — менеджер.
ПРАВИЛО 5: Будь вежливым, но не льстивым. Не нужно "отличный вопрос!"
=== БАЗА ЗНАНИЙ КОМПАНИИ ===
[ЗДЕСЬ ВСТАВИТЬ СОДЕРЖИМОЕ FAQ, ПРАЙСА И УСЛОВИЙ]Почему Claude лучше справляется с этим чем открытые модели? Он точнее следует инструкциям с запретами. Llama и Mistral при жёстком промпте про «только из базы» всё равно периодически уходят в свободную импровизацию. Claude держит ограничение стабильнее — я проверял на нескольких тысячах тестовых сообщений.
Код: Python FastAPI бэкенд
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 для любого сайта
(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 вопроса — поймёшь с чего начать
Что делает бота по-настоящему хорошим
Код — это 20% работы. Остальное — качество базы знаний.
Плохая база: копируешь текст страниц сайта как есть, с навигацией, кнопками и SEO-мусором. Бот путается и не может найти нужное.
Хорошая база: структурированный текстовый файл. Заголовки разделов, под каждым — конкретные вопросы и ответы. Цены написаны явно: «Стоимость первичной консультации — 2 500 руб., длительность 60 минут». Не «от 2 500» и не «уточните у менеджера» — это будет вызывать именно тот вопрос который ты хотел автоматизировать.
Ещё одно: обновляй базу знаний синхронно с реальностью. Поменял прайс — обнови файл и перезапусти бот. Это дисциплина, а не техническая проблема. В «Право и дело» за первый месяц база обновлялась три раза — добавляли вопросы которые бот не мог закрыть и которые передавал менеджеру.
Менеджер теперь работает с 29 разговорами в месяц вместо 120. Все 29 — это люди которые реально хотят купить или у которых нестандартная ситуация. Конверсия из чата в запись выросла с 12% до 31% — потому что менеджер перестал тратить время на «сколько стоит» и начал тратить на «давайте я разберу вашу ситуацию».
Есть вопрос по теме?
Разберу вашу посадочную страницу и укажу где теряются клиенты
Похожие кейсы
- Квалификация лидов в AmoCRM через ИИ
- WhatsApp-ассистент для продаж
- Коммерческое предложение за 10 минут
- Транскрибация звонков и разбор в CRM
Источники
AI-агенты · Персональная карта
4 часа потратил — не работает?
Покажу где ты пошёл не туда и как сделать правильно за 2 недели
Получить разбор бесплатно →AI-агенты · 10 мест
Ты работаешь до полуночи — AI-агент будет работать вместо тебя
Покажу какой агент закроет твою главную операционную боль
Узнать свой маршрут →Есть вопрос по теме?
Разберу вашу посадочную страницу и укажу где теряются клиенты
Источники
Читайте также
Часто задаваемые вопросы
- Сколько стоит один диалог в 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.
Канал «Лёха Маркетолог»
Практика без воды: кейсы, инсайты, разборы. 1–2 поста в неделю.
Пока без комментариев. Будьте первым.