RAG AI-чата читает page_embeddings без фильтра по fingerprint/префиксу — тихая деградация косинуса при cross-provider transition #571

Open
opened 2026-07-12 19:21:01 +03:00 by agent_reviewer · 0 comments
Collaborator

Контекст

Замечено при ревью #567 (семантический слой поиска). Реальная проблема в неизменённом коде RAG AI-чата — не блокирует #567, отдельная задача.

Проблема

apps/server/src/core/ai-chat/tools/ai-chat-tools.service.ts:530-560 (RAG hybrid) читает page_embeddings без фильтра по fingerprint и эмбедит запрос без префикса (passage:/query:).

Сегодня безопасно: passage-префикс индексатор применяет только в ветке global-TEI fallback — а это ровно тот случай, где RAG-овский embedTextsgetEmbeddingModel(workspace) кидает AiEmbeddingNotConfiguredException и RAG уходит в REST-fallback. То есть рассинхрона query/doc-префиксов на практике нет.

Риск (узкий transition)

Воркспейс, который: (1) работал на global-TEI (строки эмбеддингов с passage-префиксом, 384-dim), затем (2) добавил СВОЙ провайдер той же размерности 384 без реиндекса — получит RAG-запросы без префикса против stale passage-префиксных строк той же размерности. Косинус-качество RAG деградирует тихо (не ошибка, просто хуже релевантность). Предусловия контривд, кросс-подсистемные.

Возможный фикс

RAG мог бы фильтровать page_embeddings по активному fingerprint — ровно так, как теперь делает поисковое векторное плечо после #567 (page-embedding.repo.ts vectorCandidateArm фильтрует fingerprint=$fp AND model_dimensions=$dim). Это выровняло бы обе подсистемы на одном инварианте «читаем только строки текущего поколения эмбеддингов».

Заведено ревью-агентом при ревью #567; приоритет низкий (contrived preconditions).

### Контекст Замечено при ревью #567 (семантический слой поиска). Реальная проблема в **неизменённом** коде RAG AI-чата — не блокирует #567, отдельная задача. ### Проблема `apps/server/src/core/ai-chat/tools/ai-chat-tools.service.ts:530-560` (RAG hybrid) читает `page_embeddings` **без** фильтра по `fingerprint` и эмбедит запрос **без** префикса (`passage:`/`query:`). Сегодня безопасно: `passage`-префикс индексатор применяет только в ветке global-TEI fallback — а это ровно тот случай, где RAG-овский `embedTexts` → `getEmbeddingModel(workspace)` кидает `AiEmbeddingNotConfiguredException` и RAG уходит в REST-fallback. То есть рассинхрона query/doc-префиксов на практике нет. ### Риск (узкий transition) Воркспейс, который: (1) работал на global-TEI (строки эмбеддингов с `passage`-префиксом, 384-dim), затем (2) добавил СВОЙ провайдер той же размерности 384 **без реиндекса** — получит RAG-запросы без префикса против stale passage-префиксных строк той же размерности. Косинус-качество RAG деградирует тихо (не ошибка, просто хуже релевантность). Предусловия контривд, кросс-подсистемные. ### Возможный фикс RAG мог бы фильтровать `page_embeddings` по активному fingerprint — ровно так, как теперь делает поисковое векторное плечо после #567 (`page-embedding.repo.ts` `vectorCandidateArm` фильтрует `fingerprint=$fp AND model_dimensions=$dim`). Это выровняло бы обе подсистемы на одном инварианте «читаем только строки текущего поколения эмбеддингов». _Заведено ревью-агентом при ревью #567; приоритет низкий (contrived preconditions)._
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: vvzvlad/gitmost#571