Перейти к основному содержимому

Индексация в базу знаний (RAG ingest)

Нода Индексация в базу знаний добавляет произвольный текст в базу знаний организации. Текст проходит через выбранный ingestion-пайплайн (чанкинг, эмбеддинги, индексация в векторное хранилище), после чего по нему можно выполнять семантический поиск нодой Поиск (Retrieve).

Эта нода только добавляет документы. Поиск выполняется отдельной нодой -- две операции разделены, чтобы каждая нода делала одно дело.

Назначение

  • Сохранение результата OCR в базу знаний
  • Индексация текста, полученного от агента или LLM
  • Загрузка содержимого, скачанного через HTTP-ноду
  • Постраничная индексация длинных документов через ForEach
  • Динамическое пополнение базы знаний прямо из workflow

Когда использовать

СценарийРешение
Загрузить файлы вручную через UIРаздел Индексация документов
Импортировать из Notion / Confluence / Google DriveКоннекторы базы знаний
Динамическая индексация прямо из workflowЭта нода
Найти что-то по уже проиндексированномуПоиск (Retrieve)

Настройки

Текст

Текст, который нужно проиндексировать. Поддерживает подстановку переменных через {{переменная}}:

{{lastOutput.text}}

Кнопка справа от поля позволяет вставить ссылку на переменную из workflow.

Если поле оставлено пустым, нода берёт вывод предыдущей ноды:

  1. Текущий элемент цикла ForEach (если в нем строка)
  2. Поле text / content / output объекта-выхода предыдущей ноды
  3. Строковый выход предыдущей ноды

Это удобно для типичной связки 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"
}
ПолеОписание
documentIdID документа в базе знаний. Используется для последующих операций (поиск, удаление)
sourceIdID источника (используется внутренне для группировки чанков)
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:

  1. OCR -- URL {{input.contract_url}}, модель page. Возвращает text.
  2. Индексация в базу знаний
    • Текст: пусто (подхватит text из OCR)
    • Пайплайн: default-ingestion
    • Имя источника: {{input.contract_filename}}

Через несколько секунд (после завершения Celery-задачи) документ можно искать через RAG-ноду.

HTTP → Индексация

Сохранить ответ внешнего API в базу знаний:

  1. HTTP -- скачивает документ, возвращает body.
  2. Индексация в базу знаний
    • Текст: {{lastOutput.body}}
    • Пайплайн: default-ingestion

Постраничная индексация через ForEach

Сценарий: разбить длинный PDF на страницы и индексировать каждую с отдельным source_name.

  1. OCR -- возвращает pages[].
  2. ForEach -- inputPath: "pages", внутренняя операция «Индексация в базу знаний».
  3. Индексация в базу знаний (внутри ForEach)
    • Текст: пусто (подхватит _loop_item)
    • Имя источника: {{input.filename}}-page-{{_loop_index}}

Агент-исследователь, который пополняет базу знаний

  1. Агент -- инструкция «Найди полезную информацию по теме {{input.topic}}, верни её в виде текста».
  2. Индексация в базу знаний -- сохраняет вывод агента.
Индексация выполняется в фоне

Нода возвращает ingestStatus: pending сразу после отправки -- сама обработка (чанкинг, эмбеддинги, запись в Qdrant) идёт асинхронно в Celery-воркере rag-service.

Это значит: если в том же workflow сразу за ингестом стоит RAG-нода, она может ещё не увидеть свежий документ. Для интерактивных сценариев («залей и сразу спрашивай») разделите процесс на два workflow или запуска.

Размер текста

Жёсткого лимита на размер текста на этой ноде нет, но HTTP-таймаут запроса к rag-service составляет 10 секунд -- это таймаут только на отправку запроса, а не на саму индексацию. Огромные документы (десятки МБ) могут не успеть отправиться. В таком случае разбейте текст на части через ForEach.

Доступ к базе знаний между проектами

Поле project_ids ставится автоматически из контекста workflow -- проиндексированный документ виден только в том проекте, где запущен workflow. Если нужно индексировать в общую KB организации без привязки к проекту, такая возможность пока не поддерживается на уровне ноды.