Индексация в базу знаний (RAG ingest)
Нода Индексация в базу знаний добавляет произвольный текст в базу знаний организации. Текст проходит через выбранный ingestion-пайплайн (чанкинг, эмбеддинги, индексация в векторное хранилище), после чего по нему можно выполнять семантический поиск нодой Поиск (Retrieve).
Эта нода только добавляет документы. Поиск выполняется отдельной нодой -- две операции разделены, чтобы каждая нода делала одно дело.
Назначение
- Сохранение результата OCR в базу знаний
- Индексация текста, полученного от агента или LLM
- Загрузка содержимого, скачанного через HTTP-ноду
- Постраничная индексация длинных документов через ForEach
- Динамическое пополнение базы знаний прямо из workflow
Когда использовать
| Сценарий | Решение |
|---|---|
| Загрузить файлы вручную через UI | Раздел Индексация документов |
| Импортировать из Notion / Confluence / Google Drive | Коннекторы базы знаний |
| Динамическая индексация прямо из workflow | Эта нода |
| Найти что-то по уже проиндексированному | Поиск (Retrieve) |
Настройки
Текст
Текст, который нужно проиндексировать. Поддерживает подстановку переменных через {{переменная}}:
{{lastOutput.text}}
Кнопка справа от поля позволяет вставить ссылку на переменную из workflow.
Если поле оставлено пустым, нода берёт вывод предыдущей ноды:
- Текущий элемент цикла ForEach (если в нем строка)
- Поле
text/content/outputобъекта-выхода предыдущей ноды - Строковый выход предыдущей ноды
Это удобно для типичной связки OCR → Индексация в базу знаний -- текстовое поле можно оставить пустым, нода сама подхватит text из выхода OCR.
Пайплайн индексации
Обязательное поле. Ingestion-пайплайн определяет:
- Как текст разбивается на чанки (длина, перекрытие, способ разделения)
- Какая модель эмбеддингов используется
- Куда сохраняется индекс (коллекция в Qdrant)
- Какие метаданные добавляются автоматически
Список заполняется активными ingestion-пайплайнами текущей организации. Создать или отредактировать пайплайны можно в разделе База знаний → Пайплайны.
Без выбранного пайплайна нода падает с ConfigurationError ещё до отправки текста.
Имя источника (опционально)
Человекочитаемое имя источника, которое попадёт в метаданные документа. Поддерживает переменные:
contract-{{input.contract_id}}.pdf
Поле полезно для отладки и фильтрации -- когда позже вы делаете поиск по базе знаний, в результатах будет видно, откуда пришёл фрагмент.
Метаданные
Нода автоматически добавляет следующие поля в метаданные документа:
pipeline_id-- ID выбранного пайплайнаproject_ids-- массив с ID проекта workflow (для разделения KB между проектами)source-- значениеrag-ingest-node(отличает от ручной загрузки и коннекторов)source_name-- значение поля «Имя источника», если задано
Эти поля защищены: даже если вы передадите их в пользовательских метаданных, они будут перезаписаны системой.
Входные данные
Текст из настроек ноды или из выхода предыдущей ноды (через fallback-цепочку, см. раздел «Текст»).
Выходные данные
{
"__success": true,
"__error": false,
"documentId": "doc_abc123",
"sourceId": "src_xyz789",
"ingestStatus": "pending",
"pipelineId": "pl_default"
}
| Поле | Описание |
|---|---|
documentId | ID документа в базе знаний. Используется для последующих операций (поиск, удаление) |
sourceId | ID источника (используется внутренне для группировки чанков) |
ingestStatus | Обычно "pending" -- индексация выполняется асинхронно через Celery |
pipelineId | Использованный пайплайн |
При ошибке:
{
"__success": false,
"__error": true,
"error": "rag-service returned HTTP 500",
"errorType": "APIError",
"status": 500
}
Возможные значения errorType: ConfigurationError (нет pipelineId / текст пустой / нет organization_id), APIError (ошибка от rag-service), TimeoutError (rag-service не ответил за 10 секунд), и имя класса исключения для прочих случаев.
Подключения
- Вход: один вход (слева)
- Выход: один выход
output(справа)
Примеры использования
OCR → Индексация
Самая частая связка. OCR распознает документ, индексация кладёт результат в KB:
- OCR -- URL
{{input.contract_url}}, модельpage. Возвращаетtext. - Индексация в базу знаний
- Текст: пусто (подхватит
textиз OCR) - Пайплайн:
default-ingestion - Имя источника:
{{input.contract_filename}}
- Текст: пусто (подхватит
Через несколько секунд (после завершения Celery-задачи) документ можно искать через RAG-ноду.
HTTP → Индексация
Сохранить ответ внешнего API в базу знаний:
- HTTP -- скачивает документ, возвращает
body. - Индексация в базу знаний
- Текст:
{{lastOutput.body}} - Пайплайн:
default-ingestion
- Текст:
Постраничная индексация через ForEach
Сценарий: разбить длинный PDF на страницы и индексировать каждую с отдельным source_name.
- OCR -- возвращает
pages[]. - ForEach --
inputPath: "pages", внутренняя операция «Индексация в базу знаний». - Индексация в базу знаний (внутри ForEach)
- Текст: пусто (подхватит
_loop_item) - Имя источника:
{{input.filename}}-page-{{_loop_index}}
- Текст: пусто (подхватит
Агент-исследователь, который пополняет базу знаний
- Агент -- инструкция «Найди полезную информацию по теме
{{input.topic}}, верни её в виде текста». - Индексация в базу знаний -- сохраняет вывод агента.
Нода возвращает ingestStatus: pending сразу после отправки -- сама обработка (чанкинг, эмбеддинги, запись в Qdrant) идёт асинхронно в Celery-воркере rag-service.
Это значит: если в том же workflow сразу за ингестом стоит RAG-нода, она может ещё не увидеть свежий документ. Для интерактивных сценариев («залей и сразу спрашивай») разделите процесс на два workflow или запуска.
Жёсткого лимита на размер текста на этой ноде нет, но HTTP-таймаут запроса к rag-service составляет 10 секунд -- это таймаут только на отправку запроса, а не на саму индексацию. Огромные документы (десятки МБ) могут не успеть отправиться. В таком случае разбейте текст на части через ForEach.
Поле project_ids ставится автоматически из контекста workflow -- проиндексированный документ виден только в том проекте, где запущен workflow. Если нужно индексировать в общую KB организации без привязки к проекту, такая возможность пока не поддерживается на уровне ноды.