Main dependencies: RagRepository, RagQueryRepository, RetrievalStatementBuilder, PostgreSQL/pgvector.
Side effects: отсутствуют, retrieval только читает БД.
Source of truth: src/app/modules/rag/persistence/query_repository.py, src/app/modules/rag/persistence/retrieval_statement_builder.py.
Назначение
Блок retrieval выбирает из индекса наиболее полезные документы по конкретному rag_session_id. Он объединяет в одном SQL векторную близость, lexical match, слой документа и структурные сигналы из metadata.
Контекст
Публичный HTTP endpoint retrieval внутри rag помечен как deprecated, поэтому рабочий доступ к retrieval идёт через repository/runtime adapters. Это означает, что контракт фактически определяется SQL-builder и форматом rows, возвращаемых RagQueryRepository.
Технический use case
Основной сценарий
Клиент runtime вызывает RagRepository.retrieve(...).
RagQueryRepository строит SQL через RetrievalStatementBuilder.build_retrieve.
SQL ограничивает поиск текущей rag_session_id, при необходимости слоями и path-фильтрами.
База сортирует документы по prefer_bonus, test_penalty, layer_rank, lexical_rank, structural_rank, distance.
Репозиторий возвращает rows с распарсенным metadata_json.
Альтернативные ветки
Для lexical fallback по коду используется retrieve_lexical_code, который работает только по слою C0_SOURCE_CHUNKS.
Для точного добора файлов используется retrieve_exact_files, который читает заданные path без векторного ранжирования.
Если query_text не даёт terms, lexical retrieval возвращает пустой результат без выполнения SQL.
Функциональные требования
Preconditions
Вrag_chunks уже должны существовать документы нужной rag_session_id.
Для vector retrieval embedding документа должен быть ненулевым и совпадать по размерности с query embedding.
Processing rules
Базовый фильтр retrieval всегда включает rag_session_id = :sid.
При наличии layers запрос ограничивается указанными слоями.
path_prefixes задают include-фильтр по LIKE prefix%.
exclude_path_prefixes и exclude_like_patterns исключают части дерева путей до сортировки.
prefer_path_prefixes и prefer_like_patterns формируют prefer_bonus, поднимая приоритет совпавших путей.
prefer_non_tests создаёт test_penalty, если путь попадает под test-паттерны.
Validation rules
Path filters экранируются для корректной работы LIKE.
retrieve_exact_files нормализует и отбрасывает пустые пути до построения SQL.
retrieve_lexical_code не выполняет SQL, если query terms отсутствуют.
Output / result rules
Каждый row содержит контент документа и технические поля ранжирования.
metadata_json всегда декодируется в словарь metadata.
Limit применяется на уровне SQL и ограничивает итоговый набор строк.
Side effects
Побочных эффектов нет, кроме чтения из БД.
Ограничения и условия вызова
Retrieval работает только внутри одной rag_session_id и не агрегирует несколько сессий.
Layer ranking зашит в код SQL-builder и требует явного обновления при появлении новых слоёв.