Цель статьи – показать, как создать простого, но надёжного чат‑бота, который отвечает пользователю только «да» или «нет», при этом опираясь на базу знаний и указывая в конце ответа ссылку на конкретный пункт документа.
Зачем нужен бот «да/нет»?
- Сокращение времени – пользователь получает мгновенный ответ без лишних уточнений.
- Универсальность – такие боты подходят для FAQ, проверки прав доступа, голосования, подтверждения действий.
- Контроль качества – чёткие ответы позволяют легко проверять корректность работы системы.
Основные требования к боту
- Точность – ответ должен базироваться на проверенной информации.
- Прозрачность – в конце ответа необходимо указывать имя документа и номер пункта, из которого получен ответ.
- Низкая нагрузка – бот должен работать быстро даже при большом количестве запросов.
- Кроссплатформенность – поддержка Telegram, VK, веб‑чата и т.д.
Выбор платформы и стека технологий
| Платформа | Библиотека / Фреймворк | Язык | Плюсы |
|---|---|---|---|
| Telegram | aiogram или python‑telegram‑bot | Python | Простая настройка webhook, хорошая документация. |
| VK | vk_api | Python | Поддержка сообщений и кнопок. |
| Web‑чат | Node.js + socket.io / Python + FastAPI | JS / Python | Гибкость UI, возможность встраивать в сайт. |
Структура базы знаний
База знаний должна быть представлена в виде простого и машиночитаемого формата. Самый популярный вариант – JSON:
{
"documents": [
{ "name": "policy_2024.pdf",
"sections": [
{
"id": "1.2",
"question": "Можно ли работать удаленно?",
"answer": "да"
},
{
"id": "3.5",
"question": "Разрешено ли курить в офисе?",
"answer": "нет"
}
]
},
{
"name": "faq.txt",
"sections": [
{
"id": "A7",
"question": "Есть ли бесплатный Wi‑Fi?",
"answer": "да"
}
] }
]
}
Такой файл позволяет быстро находить нужный ответ и возвращать имя документа + номер пункта.
Алгоритм работы бота
- Получаем сообщение от пользователя.
- Нормализуем текст (нижний регистр, удаляем лишние пробелы).
- Ищем совпадения в базе знаний:
- Полное совпадение вопроса.
- Поиск по ключевым словам (если вопросов много).
- Если найдено – отправляем answer («да»/«нет») + ссылку на документ и пункт.
- Если не найдено – ответ «неизвестно» и рекомендация уточнить запрос.
Пример реализации на Python (aiogram)
Ниже – минимальный, но полностью рабочий пример Telegram‑бота.
import json
import logging
from aiogram import Bot, Dispatcher, executor, types
API_TOKEN = 'YOUR_TELEGRAM_BOT_TOKEN'
logging.basicConfig(level=logging.INFO)
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)
with open('knowledge.json', encoding='utf-8') as f:
KNOWLEDGE = json.load(f)
def find_answer(user_question: str):
"""Ищет ответ в базе знаний и возвращает кортеж (answer, doc_name, section_id)"""
q = user_question.strip.lower
for doc in KNOWLEDGE['documents']:
for sec in doc['sections']:
if sec['question'].lower == q:
return sec['answer'], doc['name'], sec['id']
# Если точного совпадения нет – пробуем искать по ключевым словам
for doc in KNOWLEDGE['documents']:
for sec in doc['sections']:
if all(word in q for word in sec['question'].lower.split):
return sec['answer'], doc['name'], sec['id']
return None
@dp.message_handler(commands=['start', 'help'])
async def send_welcome(message: types;Message):
await message.reply(
"Привет! Я бот, отвечающий только «да» или «нет». "
"Просто задайте вопрос, например: Можно ли работать удаленно?", )
@dp.message_handler
async def answer_yes_no(message: types.Message):
result = find_answer(message.text)
if result:
answer, doc_name, section_id = result
reply = (f"{answer.upper}\n"
f"Источник: {doc_name}, пункт {section_id}")
else:
reply = ("НЕИЗВЕСТНО\n"
"Попробуйте переформулировать вопрос.")
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)
Ключевые моменты кода:
- Функция
find_answerищет точное совпадение, а затем пытается найти совпадения по ключевым словам. - В конце ответа отображается имя документа и номер пункта, что решает проблему, описанную в исходных данных (бот часто не указывает имя документа).
Расширенные возможности
Генерация случайного ответа
Если база знаний не покрывает вопрос, но требуется всё‑равно дать «да» или «нет», можно использовать модуль random:
import random
def random_yes_no:
return random.choice(['да', 'нет'])
Подключение внешних источников
Для более сложных систем можно добавить:
- Поиск по Elasticsearch.
- Обращение к API корпоративного Wiki.
- Кеширование часто задаваемых вопросов в Redis.
Отправка ссылки в виде кнопки
Telegram поддерживает InlineKeyboardButton. Это делает ответ более удобным:
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
markup = InlineKeyboardMarkup
markup.add(InlineKeyboardButton(
text="См. пункт",
url=f"https://example.com/docs/{doc_name}#section-{section_id}"
)) Тестирование и отладка
Для гарантии точности 95‑99 % следует:
- Создать набор тестовых вопросов (unit‑тесты) и сравнить ответы с ожидаемыми.
- Проводить load‑testing (например,
locust) для проверки нагрузки. - Вести журнал запросов и ответов, чтобы быстро находить несоответствия.
Развёртывание в продакшн
Самый простой способ – Docker.
# Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "bot.py"]
После сборки образа можно разместить в любой облачной платформе (Heroku, Render, Railway, Yandex Cloud Functions). Не забывайте настроить Webhook вместо polling, чтобы сократить задержки.
Лучшие практики
- Ясные правила поиска – фиксируйте, какие части вопроса считаются ключевыми.
- Обновление базы знаний – автоматизируйте импорт новых документов (например, парсинг PDF → JSON).
- Обратная связь – позволяйте пользователю ставить «правильно/неправильно», чтобы улучшать модель.
- Безопасность – проверяйте, что бот не раскрывает конфиденциальную информацию.
Создание бота, отвечающего только «да» или «нет», кажется простым, но для корректных и проверяемых ответов требуется продуманный процесс поиска в базе знаний и чёткое указание источника. Приведённый в статье пример кода, структура базы и рекомендации по деплою помогут быстро запустить надёжное решение, которое удовлетворит как бизнес‑задачи, так и потребности конечных пользователей.
Помните: точность ответов напрямую зависит от качества и актуальности вашей базы знаний. Регулярно её обновляйте, собирайте обратную связь и автоматизируйте процесс индексации – тогда ваш «да/нет»‑бот будет работать без сбоев годами.