June 11

Ранжирование векторных ответов в базе данных: как работает умная логика выбора


🔍 Цель гайда

Главная задача — показать, как найти самый релевантный контекст в векторной базе Supabase по запросу пользователя и исключить шум: нерелевантные, слишком короткие или просто мусорные фрагменты документов.


Если вы еще не знакомы с RAG, то читайте следующие статьи:

https://teletype.in/@moneybeast/5_mmUgwfwgn - Зачем нужен Agentic RAG?

https://teletype.in/@moneybeast/Dm6xpsi0I-n - Категориальный роутинг в RAG: Пошаговый гайд

https://teletype.in/@moneybeast/XmeBMO9hrbN - Контекстуализация чанков: как улучшить поиск в векторной базе

https://teletype.in/@moneybeast/8BcRICcRRvY - Когда RAG — это лишнее: простой чат-бот без векторной базы

https://teletype.in/@moneybeast/Hqn6bl9sEx_ - LLM-роутинг для RAG-систем: как навести порядок в хаосе документов

https://teletype.in/@moneybeast/VzWvsbtxEne - LamaIndex + n8n: автоматическая очистка и парсинг документов для RAG-систем


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

Чем отличается поиск в векторной базе данных без ноды AI Agent ?

Если мы используем ноду Supabase Vector Store без ИИ-агента, то получаем несколько разных функций:

При использовании функции "Get ranked documents from vector store" мы получаем также фрагменты из документа по запросу пользователей. Но отличие в том, что мы можем видеть score ответа, который supabase нам предоставила.

score - это показатель, насколько близкий к запросу ответ выдала система

Нода Supabase Vector Store запускает векторный семантический поиск по базе:

  • Использует OpenAI-эмбеддинг (из Embeddings OpenAI) для входящего текста.
  • Производит поиск среди documents (таблица Supabase).
  • Возвращает Top K = 10 наиболее близких документов.

🔹 Фильтрация результатов

📍 После того, как получили ответ от Supabase, то далее установлена нода Filter

Условия:

{{ $json.score >= 0.7 }}

Если документ недостаточно релевантен — он отбрасывается.


📍 Нода Aggregate

Если документы прошли Filter, они агрегируются в один текст:

{
  "fieldsToAggregate": {
    "fieldToAggregate": "document.pageContent"
  }
}

Итог — текстовый блок, который будет контекстом в следующем LLM-запросе.


📍 Нода If

Условия:

  • Есть ли вообще pageContent
  • Его длина > N

Если блок прошёл проверку — он используется как контекст и воркфлоу двигается по ветке true.
Если нет — переход к false


🔁 Многоуровневая архитектура

✅ Почему нужны ветви false (еще называют fallback) :

  • Иногда в категории не хватает документов.
  • Иногда векторный score недостаточно высокий.
  • Иногда документы есть, но очень короткие.

🔄 Уровни fallback:

1 уровень Vector Store:

Порог score ≥ 0.7

2 Уровень Vector Store ≥ 0.6

3 Supabase Vector Store2 ≥ 0.5

Каждый fallback повторяет цикл:

  • Векторный поиск
  • FilterN по score
  • AggregateN
  • IfN — проверка валидности

Если всё пройдено — переход к генерации ответа.


🧠 Генерация финального ответа (OpenAI2)

В данном случае мы не используем ноду AI Agent. Мы просто используем ChatGPT ноду, то есть OpenAI. Туда мы передаем:

  • ❓ Вопрос пользователя (question)
  • 📚 Контекст (агрегированные pageContent)
  • 💬 Историю общения (из Chat Memory Manager + Code)

Формируется готовый ответ для клиента, без «вода», строго по шаблону:

(без «вот ваш ответ», «исходя из» и т.п.)

🔄 Память и история общения

Перед поиском информации в векторной базе данных, запрашиваются последние 5 сообщений с пользователем через ноду Chat Memory Manager.

После отправки ответа:

  • Ответ логируется в Postgres Chat Memory.


🧠 Что делает твоё решение особенным:

✅ Использует интеллектуальную фильтрацию документов через LLM-категории.
✅ Применяет векторный поиск, а не keyword matching.
✅ Включает каскадное ранжирование по score.
✅ Использует многослойную стратегию fallback, повышающую надёжность.
✅ Собирает всю историю переписки, что обеспечивает контекстность.