Поддержка клиентов остаётся самым окупаемым применением больших языковых моделей в 2026 году. Обращения повторяются, знания записаны в документах, а цена ошибки ограничена передачей разговора живому оператору. Claude Sonnet 4.6, доступный через codexkey по адресу https://api.codexkey.ru/v1, даёт качество рассуждений фронтирной модели, а prompt caching и tool use работают сразу. Поэтому небольшая команда выкатывает боевого бота примерно за неделю. Дальше по порядку: требования, архитектура, промпты, инструменты, eval, эскалация, guardrails и стоимость.
Что должен уметь бот поддержки: требования
Прежде чем писать код, зафиксируйте четыре обязательных пункта. Первый: опора на базу знаний. Бот отвечает по вашим документам и истории тикетов, а не по обучающим данным модели. Выдуманные цены, условия возврата или лимиты API подорвут доверие клиентов быстрее любого медленного ответа. Второй: тон бренда. В три часа ночи бот говорит голосом вашей компании. Ему нужна tone spec: тёплый, но точный, без подобострастия и без роботизированности. Эта спецификация живёт в системном промпте. Третий: эскалация на человека. У любого бота есть вопросы, на которые он не может или не должен отвечать. Передача должна быть чистой, а оператор получает весь контекст разговора. Четвёртый: мультиязычность. Если вы продаёте на международном рынке, поддержка хотя бы на английском, русском, испанском и немецком нужна с первого дня, и Claude обрабатывает все четыре нативно, без слоёв перевода.
Пятое требование забывают чаще остальных: измеримость. Eval-набор нужен с первого дня. Без него каждая правка промпта делается наугад.
Архитектура из четырёх частей
Референсная схема намеренно скучная:
[Веб/Мобайл UI] → [Ваш бэкенд] → [codexkey API] → [Claude Sonnet 4.6]
↓
[Vector DB + CRM]
Фронтенд: виджет чата на React, Vue или нативный мобильный компонент. Он стримит токены, чтобы ответ казался быстрым. Бэкенд: тонкий оркестрационный слой. Он аутентифицирует пользователя, достаёт нужные куски базы знаний, вызывает codexkey, выполняет tool calls (поиск в CRM, создание тикетов) и стримит ответ обратно. Адрес https://api.codexkey.ru/v1 служит drop-in заменой Anthropic API: тот же формат запросов, те же SDK, поэтому можно взять официальный @anthropic-ai/sdk или Python-пакет anthropic.
RAG (retrieval-augmented generation) стоит между документами и промптом. Индексируйте два корпуса: (1) публичный help-центр и продуктовую документацию, нарезанную на куски по ~500 токенов с перекрытием; (2) анонимизированные закрытые тикеты за последние 12 месяцев. Вторые особенно ценны: они показывают, как вопросы задают на самом деле, а не как их формулируют в документации. Положите оба корпуса в векторное хранилище (pgvector, Qdrant или Pinecone), на каждый запрос доставайте top-k=5 и вставляйте найденное в системный промпт под блоком <knowledge>.
Шаблон системного промпта
Системный промпт влияет на результат сильнее всего остального. Относитесь к нему как к продакшен-коду: версионируйте, ревьюйте, прогоняйте через eval. Хороший шаблон состоит из пяти секций:
Ты — Ариа, AI-агент поддержки Acme Corp.
# Роль
Помогаешь платящим клиентам с вопросами по биллингу, аккаунту и продукту.
Ты НЕ продавец. Ты НЕ юрист. Ты НЕ врач.
# Тон
- Тёплый, точный, краткий. Не извиняйся больше одного раза за реплику.
- Никаких филлеров ("Отличный вопрос!"). Сразу к ответу.
- Используй имя клиента один раз — в первом ответе.
- Подстраивайся под язык клиента (en, ru, es, de, fr).
# Инструменты
Тебе доступны:
- lookup_ticket(ticket_id): получить детали тикета
- lookup_customer(email): получить план, статус, MRR
- create_ticket(subject, body, priority): завести новый тикет
- escalate_to_human(reason): передать живому оператору
# Правила эскалации
Эскалируй немедленно если:
- Клиент зол, угрожает уходом или упоминает юристов/прессу
- Вопрос про возврат >$500 или изменение договора
- Твоя уверенность \<80%
- Клиент явно просит человека
# База знаний
<knowledge>
{{retrieved_chunks}}
</knowledge>
Всегда указывай раздел доки, из которого взял ответ. Если знаний нет —
скажи об этом и эскалируй. Никогда не выдумывай политику, цены или лимиты.
Всё, что выше блока <knowledge>, закрепите как кешируемый префикс. С prompt caching от codexkey системный промпт на 800 токенов после первого попадания стоит ~10% от обычной цены input. При 10 000 тикетов в месяц это разница между счётом в $60 и $400.
Tool use: когда бот начинает приносить пользу
Бот, который отвечает только из документации, остаётся поисковиком с хорошими манерами. До «полезного» его доводит tool use. Инструменты описываются прямо в запросе:
const response = await client.messages.create({
model: "claude-sonnet-5",
max_tokens: 1024,
system: [
{ type: "text", text: SYSTEM_PROMPT, cache_control: { type: "ephemeral" } },
{ type: "text", text: `<knowledge>${chunks}</knowledge>` }
],
tools: [
{
name: "lookup_ticket",
description: "Получить детали тикета по ID",
input_schema: {
type: "object",
properties: { ticket_id: { type: "string" } },
required: ["ticket_id"]
}
},
// ... остальные инструменты
],
messages: conversation
}, {
baseURL: "https://api.codexkey.ru/v1"
});
Когда Claude возвращает блок tool_use, бэкенд выполняет вызов в CRM, отдаёт результат как tool_result, и Claude продолжает реплику. Эта петля позволяет боту сказать «Вижу, ваш счёт от 14 марта на $89: карта была отклонена. Повторить списание?» вместо «Обратитесь в биллинг».
Стриминг: бот, который отвечает быстро
Время до первого токена важнее общей задержки. Стримьте каждый ответ:
const stream = await client.messages.stream({
model: "claude-sonnet-5",
max_tokens: 1024,
messages,
system,
tools
}, { baseURL: "https://api.codexkey.ru/v1" });
for await (const event of stream) {
if (event.type === "content_block_delta" && event.delta.type === "text_delta") {
socket.send(event.delta.text);
}
}
Если текст появляется через 400 мс, пользователь считает бота быстрым, даже когда полный ответ занимает 6 секунд. Если же человек 6 секунд смотрит на пустое окно, пока готовится целый ответ, он закрывает чат.
Eval: граница между игрушкой и продуктом
Соберите eval-набор из 200-500 реальных тикетов. К каждому приложите идеальный ответ, корректные tool calls и пометку, нужна ли была эскалация. Каждую новую версию промпта оценивайте по трём осям: фактическая точность (совпадает ли с документацией), верность тону (звучит ли как бренд) и точность эскалации (передаёт ли разговор, когда нужно, и только тогда). Первые две оси проверяйте самим Claude в роли судьи: мета-промпт с рубрикой и ответом-кандидатом. Третью сверяйте точным совпадением с исходами тикетов из истории.
Запускайте eval при каждой правке промпта и при каждом обновлении модели. Иначе вы не узнаете, улучшило ли что-нибудь ваше «улучшение». Как считать стоимость самих прогонов, смотрите в разборе цен.
Эскалация: сначала черновик, потом оценка и маршрут
Самый чистый паттерн эскалации называется draft-then-route. Модель всегда пишет ответ-кандидат. Второй, более лёгкий вызов (или рубрика уверенности внутри того же вызова) оценивает его по шкале 0-1. Если уверенность не ниже 0.85, ответ уходит клиенту. При 0.6-0.85 ответ уходит с припиской «Помогло? Оператор на связи». Если уверенность ниже 0.6, ответ отбрасывается, разговор попадает в очередь, а поле ответа оператора заполняется черновиком: человек правит и отправляет. Операторам это нравится, среднее время обработки падает на 40-60%, даже на эскалированных тикетах.
Guardrails: PII, границы задач и отказы
В каждом боте поддержки нужны три ограничителя. Защита от эха PII: номера карт, полные номера паспортов и пароли вычищайте regex-проходом из входов и выходов до того, как они дойдут до модели. Отказы вне области: системный промпт прямо перечисляет, чего бот НЕ делает (юридические советы, медицинские вопросы, сравнения с конкурентами), а few-shot пример закрепляет это поведение. Защита от prompt injection: недоверенный пользовательский контент (тела тикетов, пересланные письма) в системный промпт не кладут. Он идёт в user-сообщение, обёрнутое в теги <untrusted>, а модели сказано считать инструкции внутри этих тегов данными, а не командами.
Мультиязычность без слоя перевода
Claude Sonnet 4.6 действительно мультиязычен. Язык клиента определяется по первому сообщению (классификатор в одну строку промпта или библиотека вроде franc), затем он задаётся директивой в системном промпте (Respond in: ru). На этом всё. Хопа через Google Translate нет, качество не падает, отдельных промптов под каждый язык не нужно. Каждый язык проверяет тот же eval-набор: Claude переводит его сам, носители языка проверяют выборочно.
Сколько это стоит: расчёт для типичного SMB
Возьмём B2B SaaS с 10 000 тикетов в месяц, средней длиной разговора 6 реплик, примерно 3 000 input-токенов на реплику (система, база знаний и история) и около 400 output-токенов:
- Без prompt caching: ~180M input и ~24M output, около $720/мес
- С prompt caching (система и база знаний в кеше, hit rate ~85%): ~$60/мес
- Плюс эмбеддинги и vector DB: ~$20/мес
В сумме примерно $80/мес за полностью мультиязычного бота с инструментами и эскалацией на 10k тикетов. Это треть стоимости одного места у большинства легаси-вендоров автоматизации поддержки.
Подключение через codexkey
Направьте SDK на https://api.codexkey.ru/v1, подставьте свой API-ключ codexkey, и остальной код совпадёт с официальным Anthropic SDK. Prompt caching, tool use, стриминг и vision работают одинаково. Оплата идёт в рублях или USD, расчёт ведётся с шагом в одну минуту, платы за место нет: вы платите за использованные токены.
Итого: что выкатить за первую неделю
MVP выкатывается за неделю. Дни 1-2: загрузить документы и тикеты в векторное хранилище. День 3: чат-UI со стримингом. День 4: системный промпт и схемы инструментов. День 5: очередь эскалации. День 6: сборка eval-набора. День 7: выкат на 10% трафика за feature flag. Дальше каждая неделя это итерация промпта по результатам eval и живых разговоров. Бот, вышедший на первой неделе, на четвёртой покажется стыдным, и в этом смысл. Стройте петлю, а не идеальный промпт.