Бот поддержки по вашей базе знаний
У вас будет бот, который отвечает клиентам только по вашей базе знаний, а если ответа нет — пишет «передаю сотруднику» и шлёт вопрос в чат операторов.
Нужно: ключ fetch_... с лимитом расхода (создать, лимиты), баланс (пополнить), Python 3.10+. Для Telegram — бот из статьи Telegram-бот с нейросетью.
- 1Соберите базу знаний
Создайте
knowledge_base.md: доставка, оплата, возврат, гарантия, часы работы, контакты. Пишите конкретно, с цифрами. Пример — ниже. - 2Сохраните код
Скопируйте код из раздела «Готовый код» ниже в
support.pyрядом с базой. - 3Проверьте в терминалеbash
pip install openai export ZUKKO_API_KEY="fetch_..." python support.pyЗадайте вопросы из базы и вне её. На каждый придёт JSON: ответ,
needs_humanи причина. - 4Проверьте на 20 реальных вопросах
Возьмите вопросы клиентов, включая неудобные. Бот не должен выдумывать цены и сроки. Автоматическая проверка — LLM как судья.
1Пример базы знаний
# Доставка
- По Москве курьером: 1–2 дня, 300 ₽, бесплатно от 5000 ₽.
- По России: СДЭК, 3–7 дней, стоимость считается при оформлении заказа.
- Самовывоз: Москва, ул. Примерная, 1, пн–пт 10:00–20:00.
# Оплата
- Картой на сайте, через СБП, наличными курьеру.
# Возврат
- 14 дней с момента получения, если товар не был в использовании.
- Деньги возвращаем в течение 10 рабочих дней тем же способом оплаты.
# Контакты
- Поддержка работает пн–пт 9:00–21:00 по Москве.2Готовый код
Модель — claude-haiku-5-5 (или deepseek-v4.1-flash): обе строго соблюдают схему JSON. Вопросы без ответа пишутся в unanswered.jsonl — раз в неделю дописывайте их в базу. Изменили базу — перезапустите бота.
import asyncio
import json
import logging
import os
from datetime import datetime, timezone
from pathlib import Path
from openai import APIConnectionError, APIStatusError, AsyncOpenAI
log = logging.getLogger("support")
MODEL = os.environ.get("ZUKKO_SUPPORT_MODEL", "claude-haiku-5-5")
COMPANY = "Магазин «Пример»"
KNOWLEDGE_BASE = Path(os.environ.get("KB_FILE", "knowledge_base.md")).read_text(encoding="utf-8")3Подключите к Telegram
- 1Положите файлы рядом
support.pyиknowledge_base.md— в папку сbot.pyиз статьи Telegram-бот с нейросетью. - 2Создайте чат операторов
Создайте группу в Telegram и добавьте в неё бота.
- 3Вставьте код в bot.py
Код заменяет
on_messageи добавляет команду /id. Вmain()добавьте строкуapp.add_handler(CommandHandler("id", show_id)).bot.py (добавить)from support import answer as support_answer ADMIN_CHAT_ID = int(os.environ["ADMIN_CHAT_ID"]) # чат, куда приходят вопросы для оператора async def show_id(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: """Команда /id: подсказывает номер чата — нужен для ADMIN_CHAT_ID.""" await update.message.reply_text(f"chat id: {update.effective_chat.id}") async def on_message(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: chat_id = update.effective_chat.id if chat_id == ADMIN_CHAT_ID: return # в рабочем чате операторов бот молчит - 4Узнайте номер чата
Напишите
/idв группе операторов. Бот пришлёт номер (у групп он начинается с минуса). - 5Запустите
Задайте
export ADMIN_CHAT_ID="-100..."и запустите бота. Вопросы для человека придут в чат операторов, клиенту оператор пишет сам.
4Если не работает
| Что видите | Что сделать |
|---|---|
FileNotFoundError: knowledge_base.md | Положите файл рядом с support.py или укажите путь в KB_FILE |
| Бот выдумывает цену или срок | Добавьте факт в базу. Повторяется — возьмите модель сильнее |
| Бот зовёт человека почти всегда | Добавьте в базу формулировки клиентов, посмотрите unanswered.jsonl |
| В логе «неверный JSON» | Возьмите claude-haiku-5-5 или deepseek-v4.1-flash |
| Операторам ничего не приходит | Отправьте /id в группе операторов и скопируйте номер с минусом в ADMIN_CHAT_ID. Бот должен быть в группе |
| 401, 402, 403, 429 | См. Telegram-бот и Ошибки API |