RAG Reranker
RAG Reranker — это сервис для интеллектуального ранжирования документов по релевантности к поисковому запросу. Он использует семантические эмбеддинги для определения степени схожести между запросом и документами, что позволяет находить наиболее релевантные результаты даже при отсутствии точных совпадений слов.
Принцип работы
Reranker преобразует текстовые данные в векторные представления (эмбеддинги) и вычисляет косинусную схожесть между векторами запроса и документов. Чем выше схожесть, тем более релевантен документ запросу.
Основные возможности:
- Семантический поиск — находит документы по смыслу, а не только по ключевым словам
- Кеширование эмбеддингов — экономия до 90% затрат при повторных запросах
- Две модели — выбор между скоростью (small) и точностью (large)
- Работа с таблицами — интеллектуальная обработка структурированных данных
Эндпоинт
POST https://chat.jarv.tech/api/v1/rerank
Параметры запроса
Параметр | Тип | По умолчанию | Описание |
---|---|---|---|
query |
string |
обязательный | Поисковый запрос для ранжирования документов |
content |
string | array |
обязательный | Текст или массив документов для ранжирования |
model |
string |
"small" |
Модель эмбеддингов: "small" (1536 измерений) или "large" (3072 измерения) |
similarity_threshold |
float |
0.0 |
Минимальный порог схожести (от 0.0 до 1.0) |
top_k |
integer |
10 |
Количество топ результатов для возврата |
caching |
boolean |
true |
Использовать кеширование эмбеддингов |
column_to_embed |
string |
null |
Колонка для создания эмбеддингов (только для табличных данных) |
column_id |
string |
null |
Колонка с идентификаторами (только для табличных данных) |
Работа с текстом
При передаче простого текста, Reranker автоматически разбивает его на чанки (фрагменты) размером 1000 символов с перекрытием 200 символов. Это позволяет эффективно обрабатывать длинные документы.
Пример: Поиск в тексте
curl -X POST https://chat.jarv.tech/api/v1/rerank \
-H "api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "машинное обучение и нейронные сети",
"content": "Искусственный интеллект включает в себя множество подходов... Глубокое обучение использует многослойные нейронные сети... Классические алгоритмы машинного обучения включают деревья решений...",
"model": "small",
"top_k": 3
}'
Пример: Поиск в массиве документов
curl -X POST https://chat.jarv.tech/api/v1/rerank \
-H "api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "преимущества облачных технологий",
"content": [
{
"id": "doc_1",
"data": "Облачные вычисления предоставляют масштабируемую инфраструктуру...",
"metadata": {"category": "cloud", "date": "2024-01-15"}
},
{
"id": "doc_2",
"data": "Локальные серверы требуют больших капитальных вложений...",
"metadata": {"category": "on-premise", "date": "2024-01-10"}
},
{
"id": "doc_3",
"data": "Гибридная архитектура сочетает преимущества облака и локальной инфраструктуры...",
"metadata": {"category": "hybrid", "date": "2024-01-20"}
}
],
"similarity_threshold": 0.3,
"top_k": 2
}'
Работа с таблицами
Reranker поддерживает интеллектуальную обработку табличных данных с гибкими настройками того, какие колонки использовать для поиска и идентификации.
Сценарии использования таблиц
1. Поиск по конкретной колонке
Используйте column_to_embed
для указания колонки, по которой нужно искать, и column_id
для идентификации строк.
Пример: База знаний компании
У вас есть таблица с вопросами и ответами. Нужно найти релевантные ответы по запросу пользователя.
curl -X POST https://chat.jarv.tech/api/v1/rerank \
-H "api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "как оформить отпуск",
"content": [
{
"question_id": "Q001",
"question": "Как оформить ежегодный отпуск?",
"answer": "Для оформления отпуска необходимо подать заявление за 14 дней...",
"category": "HR",
"updated": "2024-12-01"
},
{
"question_id": "Q002",
"question": "Какие документы нужны для больничного?",
"answer": "Больничный лист оформляется в медицинском учреждении...",
"category": "HR",
"updated": "2024-11-15"
},
{
"question_id": "Q003",
"question": "Как получить справку о доходах?",
"answer": "Справка 2-НДФЛ выдается бухгалтерией по запросу...",
"category": "Finance",
"updated": "2024-12-10"
}
],
"column_to_embed": "answer",
"column_id": "question_id",
"model": "large",
"top_k": 2
}'
Ответ:
{
"query": "как оформить отпуск",
"results": [
{
"rank": 1,
"id": "Q001",
"data": "Для оформления отпуска необходимо подать заявление за 14 дней...",
"metadata": {
"question": "Как оформить ежегодный отпуск?",
"category": "HR",
"updated": "2024-12-01"
},
"similarity_score": 0.8234,
"similarity_percentage": "82.3%"
},
{
"rank": 2,
"id": "Q002",
"data": "Больничный лист оформляется в медицинском учреждении...",
"metadata": {
"question": "Какие документы нужны для больничного?",
"category": "HR",
"updated": "2024-11-15"
},
"similarity_score": 0.4567,
"similarity_percentage": "45.7%"
}
],
"total_documents": 3,
"filtered_documents": 2,
"returned_documents": 2,
...
}
2. Поиск по всем колонкам кроме ID
Если указан только column_id
, система объединит все остальные колонки для поиска.
Пример: Каталог товаров
Поиск товаров по всем характеристикам одновременно.
curl -X POST https://chat.jarv.tech/api/v1/rerank \
-H "api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "игровой ноутбук с подсветкой клавиатуры",
"content": [
{
"sku": "NB-001",
"brand": "TechPro",
"model": "Gaming X15",
"description": "Мощный игровой ноутбук с RGB подсветкой клавиатуры",
"specs": "Intel i7, RTX 4070, 32GB RAM",
"price": 150000
},
{
"sku": "NB-002",
"brand": "WorkStation",
"model": "Pro 14",
"description": "Ультрабук для работы с долгим временем автономной работы",
"specs": "Intel i5, Iris Xe, 16GB RAM",
"price": 80000
},
{
"sku": "NB-003",
"brand": "GameMax",
"model": "Predator 17",
"description": "Топовый геймерский ноутбук с механической клавиатурой",
"specs": "Intel i9, RTX 4090, 64GB RAM",
"price": 250000
}
],
"column_id": "sku",
"similarity_threshold": 0.4
}'
3. Автоматическая обработка всей строки
Если не указаны ни column_to_embed
, ни column_id
, вся строка преобразуется в текст для поиска.
Пример: Логи событий
Поиск по всему содержимому строк лога.
curl -X POST https://chat.jarv.tech/api/v1/rerank \
-H "api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "ошибка авторизации пользователя",
"content": [
{
"timestamp": "2024-12-20 10:15:23",
"level": "ERROR",
"service": "auth-service",
"message": "Failed to authenticate user: invalid credentials",
"user_id": "usr_123"
},
{
"timestamp": "2024-12-20 10:16:45",
"level": "INFO",
"service": "payment-service",
"message": "Payment processed successfully",
"user_id": "usr_456"
},
{
"timestamp": "2024-12-20 10:17:12",
"level": "WARN",
"service": "auth-service",
"message": "Multiple failed login attempts detected",
"user_id": "usr_789"
}
],
"top_k": 2
}'
Структура ответа
{
"query": "поисковый запрос",
"results": [
{
"rank": 1,
"id": "идентификатор документа",
"data": "текст документа или чанка",
"metadata": {
// дополнительные данные документа
},
"similarity_score": 0.8567,
"similarity_percentage": "85.7%"
}
],
"total_documents": 10, // Всего документов обработано
"filtered_documents": 5, // Прошли порог схожести
"returned_documents": 3, // Возвращено (top_k)
"model_info": {
"model": "large",
"embedding_model": "text-embedding-3-large",
"dimensions": 3072
},
"cache_info": {
"from_cache": true, // Использован кеш
"cache_hit": true,
"tokens_used": 0, // 0 при использовании кеша
"cached_tokens": 1500 // Сохранено токенов
},
"usage": {
"query_tokens": 15,
"document_tokens": 1500,
"total_tokens": 1515,
"cost_rub": 1.18 // Стоимость запроса
},
"parameters": {
"similarity_threshold": 0.3,
"top_k": 10,
"model": "large",
"column_to_embed": null,
"column_id": null
},
"processing_time_seconds": 0.234
}
Как работает кеширование
Кеширование — это ключевая функция для оптимизации затрат при работе с Reranker. Система автоматически сохраняет векторные представления (эмбеддинги) документов и переиспользует их при повторных запросах.
⚠️ Важно: Автоматический сброс кеша
Кеш автоматически сбрасывается в двух случаях:
- Через 12 часа — все записи старше суток удаляются автоматически
- При изменении документа — даже минимальное изменение в тексте, порядке документов или структуре приводит к созданию нового кеша
Принцип работы кеша
Ключевые особенности:
- Уникальный ключ кеша — формируется на основе API-ключа, модели и "отпечатка" контента
- Время жизни — 12 часа (автоматическая очистка устаревших записей)
- Привязка к API-ключу — каждый пользователь имеет изолированный кеш
- Экономия — при попадании в кеш оплачиваются только токены запроса
Как формируется "отпечаток" контента
Система создает уникальную подпись для каждого набора документов, чтобы определить, изменились ли данные:
Тип контента | Метод создания подписи | Пример |
---|---|---|
Текст | Первые 200 и последние 200 символов | Для текста "Искусственный интеллект... [много текста]... революционная технология" подпись будет включать начало и конец |
Массив документов | Первые 2 и последние 2 документа (id + первые 100 символов data) | Учитываются структура и содержимое крайних элементов массива |
Таблица (DataFrame) | Размерность таблицы + первые 2 и последние 2 строки | Для таблицы 100x5 создается подпись вида "df_100x5_[данные строк]" |
📌 Что приводит к сбросу кеша:
- Изменение текста — добавление/удаление даже одного символа
- Изменение порядка — перестановка документов в массиве
- Изменение структуры — добавление/удаление полей в документах
- Изменение id или data — любые правки в ключевых полях
- Истечение 12 часов — автоматическая очистка по времени
Совет: Если документы обновляются редко, старайтесь сохранять их структуру и порядок неизменными для максимальной эффективности кеша.
Когда кеш эффективен
✅ Идеальные сценарии для кеширования:
- FAQ системы — база вопросов и ответов обновляется редко
- Каталоги товаров — изменения происходят не чаще раза в день
- Документация — статичный контент с редкими обновлениями
- Исторические данные — логи, архивы, отчеты за прошлые периоды
❌ Когда отключить кеширование:
- Реалтайм данные — биржевые котировки, новостные ленты
- Часто меняющийся контент — чаты, комментарии, активные форумы
- Персонализированные данные — уникальный контент для каждого пользователя
Пример экономии с кешированием
Рассмотрим реальный пример использования кеша для FAQ-системы:
# День 1, 10:00 - Первый запрос (создание кеша)
{
"query": "как оформить отпуск",
"content": [...100 документов FAQ...],
"model": "large",
"caching": true
}
# Результат: cost_rub: 39.00 (полная стоимость)
# День 1, 15:00 - Запрос с тем же контентом (используется кеш)
{
"query": "правила больничного",
"content": [...те же 100 документов...],
"model": "large",
"caching": true
}
# Результат: cost_rub: 0.004 (только токены запроса)
# День 2, 11:00 - Прошло больше 12 часов (кеш истек)
{
"query": "отпуск по уходу за ребенком",
"content": [...те же 100 документов...],
"model": "large",
"caching": true
}
# Результат: cost_rub: 39.00 (кеш пересоздается)
# Изменение даже одного символа сбрасывает кеш
{
"query": "как оформить отпуск",
"content": [...99 старых документов + 1 обновленный...],
"model": "large",
"caching": true
}
# Результат: cost_rub: 39.00 (новый кеш из-за изменения)
Как проверить использование кеша
В ответе API всегда присутствует объект cache_info
с детальной информацией:
Поле | Значение | Описание |
---|---|---|
from_cache |
true/false |
Были ли эмбеддинги документов взяты из кеша |
cache_hit |
true/false |
Найден ли подходящий кеш для запроса |
tokens_used |
число | Количество токенов, обработанных в этом запросе (0 при кеше) |
cached_tokens |
число | Количество токенов, сохраненных в кеше |
cache_enabled |
true/false |
Включено ли кеширование для запроса |
Стратегии оптимизации кеша
1. Группировка документов
Объединяйте связанные документы в один запрос вместо множества мелких:
# ❌ Неэффективно - отдельный кеш для каждой категории
for category in ["HR", "IT", "Finance"]:
rerank(query, documents.filter(cat=category))
# ✅ Эффективно - один кеш для всех документов
all_docs = documents.all()
results = rerank(query, all_docs)
# Фильтрация по категории после получения результатов
2. Версионирование контента
При обновлении документов добавляйте версию в metadata, а не изменяйте основной текст:
# ✅ Правильно - кеш сохраняется
{
"id": "doc_1",
"data": "Оригинальный текст политики отпусков",
"metadata": {
"version": "2.0",
"updated": "2024-12-20",
"changes": "Добавлен пункт о удаленной работе"
}
}
3. Планирование обновлений
Обновляйте документы пакетно раз в сутки, чтобы максимально использовать 24-часовой кеш:
# Скрипт ежедневного обновления
async def daily_update():
# 1. Очистить старый кеш
await clear_rerank_cache()
# 2. Загрузить обновленные документы
documents = await load_fresh_documents()
# 3. Прогреть кеш популярными запросами
for query in POPULAR_QUERIES:
await rerank(query, documents, caching=True)
💡 Практический совет по экономии:
При работе с большими объемами данных (например, 100 000 токенов) и модели large
, один запрос без кеша стоит около 78₽. С кешированием последующие запросы будут стоить менее 1 копейки. За 12 часа при 100 запросах экономия составит более 7 700₽!
Управление кешем
Кеш позволяет значительно сократить расходы при работе с одними и теми же документами.
Получение статистики кеша
GET https://chat.jarv.tech/api/v1/rerank/cache-stats
Authorization: api-key YOUR_API_KEY
Очистка кеша
DELETE https://chat.jarv.tech/api/v1/rerank/cache
Authorization: api-key YOUR_API_KEY
Стоимость
Стоимость рассчитывается по количеству обработанных токенов. При использовании кеша оплачиваются только токены запроса.
Модель | Размерность | Стоимость за 1 млн токенов | Особенности |
---|---|---|---|
small |
1536 | 200 ₽ | Быстрая обработка, оптимальна для большинства задач |
large |
3072 | 780 ₽ | Максимальная точность для сложных запросов |
caching: true
) для документов, которые не меняются часто. Это может сократить расходы до 90% при повторных запросах.