June 10

🧭 Категориальный роутинг в RAG: Пошаговый гайд


В прошлой статье мы разбирали, что такое RAG и зачем он нужен, как загружать в него данные. Но так ли все просто ?

Порой ты загрузил данные в векторную базу данных, но ИИ агент дает неполный ответ, иногда он может вообще пропустить поиск по вектору, потому что решил найти ответ в своей памяти. Для этого и требуется использовать категориальный роутинг.


🧠 Что такое категориальный роутинг?

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

Что я понимаю под классификации по определенным тематикам ?

При загрузке документов в векторную базу данных одним из самых важных моментов является создание метаданных для вашей информации.

При поиске по БД используется фильтрация по метаданным. Это значит, что когда вы задаете вопрос, то система определяет, что он относится, например, к категории финансов. Далее она знает, что в метаданных есть категория: finance и обращается к документам именно из этой части. Но не всегда это определяется корректно, для этого и требуется категориальный роутинг.


Как использовать категориальный роутинг:

Шаг 1: Подготовка категорий

🔹 Определите и зафиксируйте список категорий.
Примеры:

  • HR
  • Финансы
  • Продажи
  • Документация

🔹 Для каждой категории составьте чёткое описание:

  • ключевые слова,
  • типичные вопросы,
  • характерные данные.

🔹 Пример описания:

Продажи: включает отчёты по сделкам, чеки, историю заказов, метрики выручки.
Типичные вопросы: «Что купил клиент X?», «Выручка по регионам».

Если помните, что ранее я рассказывал вам, как загружать документы в векторную базу данных. Все документы мы разбиваем на чанки, потом мы загружаем их в векторную базу данных.

Чтобы выдача была более точная, то требуется правильно настроить метаданные для каждого чанка.

Пример промпта может быть такой:

Act: Действуй как эксперт по систематизации документов и извлечению метаданных для RAG-систем, специализирующийся на анализе фрагментов текста (chunk) и имен файлов.

Context: На вход ты получаешь:

  1. filename — строка с названием файла (например, "Туризм_Гастрономия_Италии.pdf")
  2. chunk — часть текста из документа, не полный текст: H1: Итальянская гастрономия 1. Введение в традиционные блюда региона Тоскана 2. Специфика приготовления пиццы в Неаполе Упомянуты сети ERC20 и BEP20 для оплаты блюд, а также валюты EUR и USD. Формула расчёта бюджета поездки: Budget = Σ(cost_i) + tax
  3. file_id — уникальный идентификатор файла (строка), например, "d4f5a6b7-c8e9-10fa-b11c-d12e13f14g15"
  4. context — релевантный и расширенный текстовый контекст, связанный с этим чанком: Этот документ предназначен для туристов, планирующих гастрономические туры по Италии. Содержит советы по выбору ресторанов, расчёту бюджета и интеграции с крипто-платформами оплаты.

На выходе ты должен сформировать строго валидный JSON-объект, содержащий только указанные ниже поля. Порядок полей не важен. Обязательные поля всегда должны присутствовать, даже если их значение минимальное. Поля с отсутствующими данными заполняются пустыми строками ("") или массивами ([]) по контексту.

Вот нужная структура JSON:

{
  "title": string,
  "file_id": string,
  "doc_type": string,
  "category": string,
  "subcategory": string,
  "difficulty_level": string,
  "keywords": [string],
  "sections": [string],
  "region"?: string,
  "network"?: [string],
  "supported_currencies"?: [string]
}

Deep Thinking: Используй как сам chunk, так и его context — вместе они обеспечивают достаточно информации для точного извлечения метаданных. Прежде чем формировать JSON, глубоко проанализируй содержание chunk и filename. Определи смысловую нагрузку даже при ограниченной информации, максимально точно вычлени метаданные. Используй эвристику, контекст, правила построения имени и структуры chunk.

Подробные правила:

  1. title — строка формата "Категория_Подкатегория". Извлекай category и subcategory из filename. Если в chunk явно указан заголовок (начинается с H1/большими буквами) и он точнее — используй его.
  2. doc_type — по расширению файла: .pdf"PDF", .docx"DOCX", .html"HTML" и т.п.
  3. category — всё до первого _ в filename.
  4. subcategory — всё после первого _ в filename, замени _ на пробелы, удали лишние точки, двойные пробелы и т.д.
  5. difficulty_level:
    • "Beginner"chunk содержит простые инструкции, без формул и сложных понятий.
    • "Intermediate" — есть формулы, расчёты, упоминания нескольких валют или платформ.
    • "Expert" — сложные API, алгоритмы, глубокая тех. спецификация.
  6. keywords — массив из 5–8 ключевых слов или фраз, встречающихся в chunk (желательно в начале или в заголовках).
  7. sections — массив названий H1/H2-заголовков или номеров пунктов (1., 2., 3. …) из chunk, если они есть. Если нет — [].

Важно:

  • Возвращай только JSON-объект, без пояснений, без текста до или после.
  • Все строки — в двойных кавычках, JSON должен быть валидным.
  • Если chunk не содержит достаточно данных, старайся заполнить как можно больше полей логически (на основе filename или даже предположений), но без выдумки.

Удобно, что такие метаданные, как category, subcategory можно заполнить уже из названия. Поэтому, если у вас большая база знаний, то разбейте ее на категории. Например: Общее, ошибки, финансы, hr. Далее можно заполнить подкатегории, в названии использовать разделитель _ .

Чтобы корректно подгрузить метаданные, то требуется использовать ноду Default Data Loader. Так как нода OpenAI передает данные в формате JSON кода, то их будет легко передать.


Шаг 2: Классификация запросов

Когда вы уже подгрузили данные, то следует проверить, как отвечает наш агентю

С помощью LLM (agentic routing)

📌 Используется prompt-инженерия.
Пример prompt для OpenAI:

Ты — классификатор запросов. Категории: HR, Финансы, Продажи.
На вход будет поступать пользовательский запрос. Верни только название наиболее подходящей категории.

🎯 Преимущества:

  • Гибкость — LLM распознаёт нестандартные формулировки.
  • Не требует ручной настройки правил.

⚠️ Недостатки:

  • Стохастичность: один и тот же запрос может быть классифицирован по-разному.
  • Нужно тестировать prompt, задавать temperature=0, использовать few-shot примеры.

ВАЖНО: Промпт следует подстроить под себя. Для каждой категории нужно расписать ключевые слова, возможные типы вопросов.


Шаг 3: Фильтрация по метаданным


Далее все просто. Нужно только передать название категории из LLM роутера в Metadata Filter ноды Supabase, которая подключена к AI Agent.


🧑‍💻 Best practices

✅ Добавляйте в документы явную метку категории.
✅ Используйте temperature=0 для LLM-классификации.
✅ Тестируйте с реальными запросами.
✅ Ведите логирование выбранной категории — поможет обучить кастомный классификатор.


🧩 Когда использовать категориальный роутинг?

✔️ Чёткие, ограниченные категории (до ~10).
✔️ Высокая интерпретируемость важнее гибкости.
✔️ Важна контролируемость и предсказуемость.


Как на этом можно заработать:

  1. Создание и настройка специализированных ИИ-агентов
  2. Консультации по настройке баз данных.