RAG-бот для любого сайта на Python за 60 строк кода
Нейросети уверенно фантазируют о свежих данных. Чтобы ответы опирались на реальный текст сайта, достаточно 60 строк Python, локальной Ollama и чистого Markdown.

Если попросить языковую модель ответить по свежей документации или конкретному сайту, она с блеском выдумает то, чего там нет. Стандартное решение — Retrieval-Augmented Generation (RAG): сначала достать реальный текст, найти в нём нужные куски и только потом передать их модели в качестве контекста.
В этой статье соберём работающего RAG-бота, который отвечает на вопросы о любой веб-странице, примерно на 60 строках Python. Никаких парсеров HTML, headless-браузеров и сложных фреймворков — только requests, локальная Ollama и чистый Markdown.
Что такое RAG
RAG (retrieval-augmented generation) — это подход, при котором языковая модель не отвечает по своей памяти, а сначала ищет релевантные фрагменты во внешнем тексте, а потом генерирует ответ на их основе. Это резко снижает галлюцинации и позволяет работать с данными, которых не было в обучающей выборке.
Ключевые выводы
- RAG-бот на Python укладывается в ~60 строк и работает без облачных LLM.
- Самое неприятное в RAG-пайплайне — очистка HTML; готовый Markdown API убирает эту работу.
- Текст разбивается на чанки (~1200 символов), каждый превращается в эмбеддинг и сравнивается с эмбеддингом вопроса.
- Локальные модели
nomic-embed-textиllama3через Ollama не требуют иностранных карт и VPN. - Качество ответа зависит от качества исходного текста: сырой HTML зашумляет поиск, чистый Markdown улучшает ретривл.
Что мы соберём
Архитектура бота простая и универсальная:
- Отправляем URL в сервис извлечения текста и получаем чистый Markdown.
- Разбиваем Markdown на фрагменты (чанки) по границам абзацев.
- Превращаем каждый чанк в вектор — эмбеддинг.
- То же самое делаем с вопросом пользователя.
- Находим чанки, ближайшие к вопросу, по косинусной близости.
- Отдаём найденные фрагменты + вопрос языковой модели с инструкцией отвечать только по контексту.
Такая схема легко масштабируется: можно заменить локальную Ollama на OpenAI, Anthropic или российские модели, а векторы перенести в Qdrant или Chroma.
Что понадобится
Python 3.9+- Библиотека
requests - Локально запущенная
Ollamaс моделямиnomic-embed-textиllama3 - Доступ к API извлечения текста (в примере — Web to Markdown/JSON API; бесплатный тариф даёт 50 запросов в сутки)
Код бота
Сохраните скрипт как rag_bot.py и подставьте свой ключ, если сервис извлечения текста требует авторизации:
На что обратить внимание:
Если вы используете RapidAPI-версию сервиса, запрос кAPI_URLобычно требует заголовкаX-RapidAPI-Key. Без ключа бесплатный endpoint может вернуть 401.
Разбор по частям
fetch_markdown — единственный внешний вызов. Сервис сам забирает страницу, убирает навигацию, баннеры и футер и возвращает Markdown: заголовки, абзацы, списки. Это освобождает от зависимостей вроде BeautifulSoup или headless Chrome.
chunk_markdown режет текст на фрагменты примерно по 1200 символов, не разрывая абзацы. Мелкие чанки дают более точный ретривл, но увеличивают число эмбеддингов; для начала 1200 символов — хороший баланс.
embed и cosine превращают текст в векторы и считают их близость. Модель nomic-embed-text из Ollama бесплатна, быстрая и неплохо понимает русский и английский.
answer эмбеддит вопрос, выбирает три самых похожих чанка и строит промпт с жёстким ограничением: отвечать только по контексту. Это главная страховка от галлюцинаций.
Запуск
Установите зависимости и скачайте модели в Ollama:
Если всё в порядке, в консоли появится примерно такой результат:
Почему важен чистый Markdown
Если скормить эмбеддинг-модели сырой HTML, в векторах окажутся теги <div>, меню навигации и копирайты из футера. В результате поиск похожести выдаст «Copyright © 2026» вместо полезного ответа. Чистый Markdown — заголовки, абзацы, списки — улучшает качество ретривла почти бесплатно.
Если не хочется зависеть от внешнего API, можно заменить fetch_markdown на один из альтернативных вариантов:
- trafilatura — библиотека на Python для извлечения главного текста.
- r.jina.ai/http://URL — бесплатный сервис без ключа.
- Firecrawl — API с поддержкой сканирования сайтов целиком.
- ScrapingBee — прокси + рендеринг для сложных страниц.
Для российских разработчиков локальная Ollama особенно удобна: модели качаются бесплатно, не нужны иностранные карты, а инференс идёт на своём железе.
Куда развивать
- Направьте бота на документацию, чейнджлог или блог конкурента и задавайте вопросы по ним.
- Замените Ollama на OpenAI, Anthropic, Gemini или российские модели — функция
answerменяется в двух строках. - Сохраняйте эмбеддинги в векторную БД:
Chroma,QdrantилиFAISS, чтобы индексировать сразу много страниц. - Используйте формат
jsonвместо Markdown, если нужна структура: параграфы, заголовки, ссылки — отдельно.
Часто задаваемые вопросы
Что такое RAG простыми словами?
RAG — это подход, при котором языковая модель перед ответом ищет релевантные фрагменты во внешнем документе. Это помогает ей отвечать по свежим или специфическим данным, а не по обучающей выборке.
Можно ли обойтись без внешнего API для извлечения текста?
Да. Вместо Web to Markdown/JSON API можно использовать библиотеку trafilatura, сервис r.jina.ai или написать собственный парсер на BeautifulSoup. Главное — получить чистый текст без навигации и рекламы.
Почему для эмбеддингов и ответов используется Ollama?
Ollama запускает модели локально, бесплатно и без облачных API-ключей. Для учебных и pet-проектов этого достаточно, а при необходимости легко перейти на коммерческий провайдер.
Как повысить качество ответов?
Три очевидных рычага: улучшить очистку текста, подобрать размер чанков и увеличить число релевантных фрагментов в промпте. Также помогает явная инструкция модели отвечать только по контексту.
Какие сайты подходят для такого бота?
Подходят любые текстовые страницы: статьи, документация, справочники, блоги. Сложности возникают со страницами, где весь контент загружается JavaScript, или с капчами — там нужен рендеринг и прокси.
Выводы
RAG — не магия, а последовательность простых шагов: получить чистый текст, разрезать его на фрагменты, найти ближайшие к вопросу и отдать их модели. Весь минимальный пайплайн укладывается в короткий Python-скрипт, который можно запустить на своём ноутбуке.
RAG работает ровно так хорошо, каков текст, который вы ему скармливаете. Уберите самую утомительную часть — очистку HTML, — и останется интересное: поиск и генерация.
Исходник идеи — статья «Chat With Any Website: Build a RAG Bot in ~60 Lines of Python». Попробуйте собрать бота на своей странице и посмотрите, где он справляется, а где начинает фантазировать.











