Ранжирование векторных ответов в базе данных: как работает умная логика выбора
Главная задача — показать, как найти самый релевантный контекст в векторной базе 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
Если блок прошёл проверку — он используется как контекст и воркфлоу двигается по ветке true.
Если нет — переход к false
🔁 Многоуровневая архитектура
✅ Почему нужны ветви false (еще называют fallback) :
- Иногда в категории не хватает документов.
- Иногда векторный
scoreнедостаточно высокий. - Иногда документы есть, но очень короткие.
🔄 Уровни fallback:
3 Supabase Vector Store2 ≥ 0.5
Каждый fallback повторяет цикл:
Если всё пройдено — переход к генерации ответа.
🧠 Генерация финального ответа (OpenAI2)
В данном случае мы не используем ноду AI Agent. Мы просто используем ChatGPT ноду, то есть OpenAI. Туда мы передаем:
- ❓ Вопрос пользователя (
question) - 📚 Контекст (агрегированные
pageContent) - 💬 Историю общения (из
Chat Memory Manager + Code)
Формируется готовый ответ для клиента, без «вода», строго по шаблону:
(без «вот ваш ответ», «исходя из» и т.п.)
🔄 Память и история общения
Перед поиском информации в векторной базе данных, запрашиваются последние 5 сообщений с пользователем через ноду Chat Memory Manager.
🧠 Что делает твоё решение особенным:
✅ Использует интеллектуальную фильтрацию документов через LLM-категории.
✅ Применяет векторный поиск, а не keyword matching.
✅ Включает каскадное ранжирование по score.
✅ Использует многослойную стратегию fallback, повышающую надёжность.
✅ Собирает всю историю переписки, что обеспечивает контекстность.