Бот отвечающий да или нет

Задай вопрос, получи ответ «да» или «нет» за секунду. Без воды, без регистрации, только чистая интуиция!

Цель статьи – показать, как создать простого, но надёжного чат‑бота, который отвечает пользователю только «да» или «нет», при этом опираясь на базу знаний и указывая в конце ответа ссылку на конкретный пункт документа.


Зачем нужен бот «да/нет»?

  • Сокращение времени – пользователь получает мгновенный ответ без лишних уточнений.
  • Универсальность – такие боты подходят для FAQ, проверки прав доступа, голосования, подтверждения действий.
  • Контроль качества – чёткие ответы позволяют легко проверять корректность работы системы.

Основные требования к боту

  1. Точность – ответ должен базироваться на проверенной информации.
  2. Прозрачность – в конце ответа необходимо указывать имя документа и номер пункта, из которого получен ответ.
  3. Низкая нагрузка – бот должен работать быстро даже при большом количестве запросов.
  4. Кроссплатформенность – поддержка 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": "да"
 }
 ] }
 ]
}

Такой файл позволяет быстро находить нужный ответ и возвращать имя документа + номер пункта.

Алгоритм работы бота

  1. Получаем сообщение от пользователя.
  2. Нормализуем текст (нижний регистр, удаляем лишние пробелы).
  3. Ищем совпадения в базе знаний:
    • Полное совпадение вопроса.
    • Поиск по ключевым словам (если вопросов много).
  4. Если найдено – отправляем answer («да»/«нет») + ссылку на документ и пункт.
  5. Если не найдено – ответ «неизвестно» и рекомендация уточнить запрос.

Пример реализации на 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).
  • Обратная связь – позволяйте пользователю ставить «правильно/неправильно», чтобы улучшать модель.
  • Безопасность – проверяйте, что бот не раскрывает конфиденциальную информацию.

Создание бота, отвечающего только «да» или «нет», кажется простым, но для корректных и проверяемых ответов требуется продуманный процесс поиска в базе знаний и чёткое указание источника. Приведённый в статье пример кода, структура базы и рекомендации по деплою помогут быстро запустить надёжное решение, которое удовлетворит как бизнес‑задачи, так и потребности конечных пользователей.

Помните: точность ответов напрямую зависит от качества и актуальности вашей базы знаний. Регулярно её обновляйте, собирайте обратную связь и автоматизируйте процесс индексации – тогда ваш «да/нет»‑бот будет работать без сбоев годами.