Урок 3. Бот отвечает по вашим документам
Бот из урока 1 знает только то, что знает модель. Этот — отвечает по вашему прайсу, регламенту или инструкции: перед каждым ответом он ищет подходящие куски текста в загруженных файлах и отвечает по ним.
Что получится в конце: та же публичная ссылка, что и в уроке 1, но на вопрос «сколько стоит доставка в Казань» бот процитирует ваш документ, а на вопрос, ответа на который в документах нет, честно скажет, что не знает.
- Исполнение + данные
- Данные
- LLM
- Исполнение + данные + стрим
Шаг 1. Создайте базу знаний
-
Откройте раздел База знаний и нажмите Новая.
-
Заполните название и описание — по ним вы потом будете отличать базы друг от друга.
-
В поле Модель эмбеддингов оставьте модель, выбранную по умолчанию: список открывается на локальной
all-MiniLM-L6-v2. Если у вас есть свой ключ облачного провайдера, его модели тоже будут в этом списке — но для урока он не нужен. -
Поля Размер фрагмента (по умолчанию 500) и Перекрытие фрагментов (по умолчанию 50) оставьте как есть. Это длина куска текста в символах и то, сколько символов соседние куски делят между собой, чтобы фраза не разрывалась ровно по границе.
-
Нажмите Создать.
Новая база знаний
Новая база знаний
Локальная модель, ключ не нужен.
Шаг 2. Загрузите документ и дождитесь готовности
-
Откройте созданную базу и нажмите Добавить документ.
-
Либо Загрузить файл — принимаются PDF, DOCX, TXT, MD, — либо URL веб-страницы, тогда платформа сама заберёт текст страницы.
-
При желании добавьте Метаданные (доступны для жёстких фильтров) — пары ключ/значение вроде
раздел = доставка. Они пригодятся позже, когда документов станет много и поиск нужно будет сужать; для урока их можно пропустить. -
Дождитесь статуса Готово. Документ проходит путь Ожидание → Обработка → Готово; при неудаче остаётся Ошибка с текстом причины. Рядом со статусом видно число фрагментов — это и есть нарезанный документ.
Ограничения загрузки на бесплатном тарифе: один файл — до 10 МБ, все документы вместе — до 100 МБ, и не больше 50 000 векторных точек (одна точка = один фрагмент). Формат за пределами PDF, DOCX, TXT, MD отклоняется сразу, до загрузки.
Шаг 3. Соберите граф
Это тот же граф, что в уроке 1, с одной вставкой перед агентом.
-
Создайте новый воркфлоу (или скопируйте бота из урока 1) и поставьте на холст Вход и Выход.
-
Перетащите RAG-запрос (раздел
AI, группаRAG) и соедините: выход Входа → портQueryэтой ноды. -
Перетащите База знаний — ноду-конфигурацию — и протяните провод от неё к порту
KBноды RAG-запрос. В её настройках выберите базу из шага 1. -
Поставьте ИИ-агент, соедините выход RAG-запрос → вход агента, выход агента → Выход.
-
Добавьте ноду LLM и подключите к порту
LLMагента; выберите модель. -
Нажмите Проверить, затем Сохранить.
Почему база знаний висит сбоку, а не в цепочке
База знаний ничего не ищет — это конфигурация. Она отдаёт RAG-запрос четыре значения (какая база, сколько фрагментов вернуть, порог близости, сколько соседних фрагментов приклеить) и выигрывает у одноимённых полей самой ноды поиска. Смысл в том, что одну и ту же ноду базы можно подключить сразу к нескольким потребителям и менять параметры в одном месте. Фильтры по метаданным — единственное исключение: они не заменяют фильтры потребителя, а складываются с ними по И.
Искать и отвечать — тоже разные ноды, и это не формальность: RAG-запрос — детерминированный шаг, его результат виден в запуске отдельной строкой, поэтому на вопрос «бот выдумал или в документах правда так написано» отвечают, не гадая.
Шаг 4. Напишите промпт, который требует опоры на найденное
Здесь урок ломается о неочевидную вещь. На вход агента приезжает весь результат поиска — фрагменты, их оценки и сам запрос, — а не готовый вопрос пользователя. Агент увидит это как реплику собеседника. Поэтому вопрос и контекст надо назвать в системном промпте явно, по именам нод:
Ты отвечаешь на вопросы клиентов по документам компании.
Вопрос: {{ nodes.entry_1.output }}
Найденные фрагменты:
{{ nodes.rag_query_1.output.context }}
Отвечай только по фрагментам выше. Если ответа в них нет — так и скажи:
«В наших документах этого нет». Не додумывай и не отвечай по общим знаниям.
entry_1 и rag_query_1 — идентификаторы ваших нод: они видны в окне настройки ноды,
под её названием, и там же переименовываются. Подставьте свои.
Вторая половина промпта — не вежливость, а единственное, что отделяет «бота по документам» от обычного бота: без явного запрета модель спокойно ответит по общим знаниям, и отличить такой ответ от процитированного будет нечем.
Шаг 5. Проверьте на вкладке «Тест»
Вкладка Тест — настоящий запуск, с настоящими списаниями. Задайте три вопроса подряд:
- то, что в документе точно есть, — ответ должен опираться на текст;
- то, чего там точно нет, — должен прийти отказ, а не рассказ по общим знаниям;
- переформулировку первого вопроса другими словами — поиск идёт по смыслу, а не по совпадению слов, и именно это здесь проверяется.
Кликните ноду RAG-запрос на холсте вкладки: видно, что именно она нашла. Если фрагменты релевантные, а ответ плохой — виноват промпт. Если фрагменты не те — виноваты параметры поиска или нарезка, и лечить надо их, а не промпт.
Шаг 6. Опубликуйте
Вкладка Публикация → канал Публичный чат → включите переключатель и нажмите Опубликовать версию 1. Дальше всё как в уроке 1: ссылка, отдельный браузер, разговор от лица посетителя. Если бот из урока 1 всё ещё опубликован, снимите его с публикации — на бесплатном тарифе опубликован может быть один воркфлоу.
Сколько это стоит
Эмбеддинги считаются дважды: когда документ загружается в базу и когда задаётся вопрос — запрос тоже нужно превратить в вектор. Тариф по умолчанию — 1 кредит за 10 000 токенов, одинаковый на запись и на чтение.
На практике вопрос стоит доли кредита, а вот загрузка большого документа заметна: сотня страниц текста — это единицы кредитов из ста месячных, и повторная загрузка того же файла списывается заново.
Если не получилось
| Что видно | Почему | Что делать |
|---|---|---|
| Документ надолго завис в «Обработка» | Обработка идёт фоновой задачей внутри процесса API. Если сервер перезапустили в этот момент, файловые документы помечаются ошибкой «загрузите заново», а документы из URL ставятся в очередь снова | Обновите страницу; при статусе «Ошибка» прочитайте её текст и загрузите файл заново |
| Статус «Готово», но фрагментов 0 | В файле нет текстового слоя — обычно это PDF-скан или фото страниц | Распознайте текст заранее и загрузите TXT/MD или текстовый PDF |
| Бот отвечает общими словами, документ будто не читал | Либо нода базы знаний не подключена к порту KB ноды поиска, либо промпт не требует опираться на найденное | Проверьте провод в порт KB; добавьте в промпт и вывод фрагментов, и явный запрет отвечать по общим знаниям |
| «Ничего не найдено», хотя текст в документе точно есть | Порог близости отсекает всё: по умолчанию он 0 («ничего не отсекать»), но выставленный вручную 0.7–0.8 режет живые попадания. Второй частый случай — ответ разорван нарезкой | Верните порог в 0, поднимите число фрагментов (top_k, до 20) и включите контекстное окно, чтобы к найденному приклеивались соседние фрагменты |
| Найдено не то, что нужно | Фрагмент 500 символов режет длинные таблицы и списки посреди строки | Создайте новую базу с большим размером фрагмента: у существующей его не поменять |
| В списке моделей эмбеддингов пусто или нет нужной | Список = каталог платформы плюс модели ваших подключений. Модели облачных провайдеров появляются только вместе с подключением и ключом | Для урока берите локальную all-MiniLM-L6-v2 — ей ключ не нужен |
| Файл не загружается | Формат вне PDF/DOCX/TXT/MD, файл больше 10 МБ или база упёрлась в квоту тарифа (100 МБ, 50 000 фрагментов) | Разбейте документ на части или удалите ненужные |
| Запуск отклонён | Кончились кредиты: на бесплатном тарифе работа сверх остатка запрещена | Настройки → Использование |
Разбор параметров поиска целиком — в «Базах знаний и RAG»; что показывает сам раздел — в «Базе знаний»; общий список симптомов — в «Что делать, если не работает».