docs: результаты приёмки RAG-справки и фикс реранкера

Спек дополнен фактами прогона: 2465 документов / 13 755 точек, проверка
grep/search/фильтров, живой прогон CI с инкрементальной переиндексацией.
Отдельно зафиксирована находка — реранк падал 400 на длинных чанках
(слот 1024 токена против обрезки в 2000 символов); починено в rag-node.
This commit is contained in:
2026-07-31 03:27:15 +03:00
parent 297015f4af
commit e72aa46cc1
@@ -388,3 +388,38 @@ mcp__kompas-sdk__knowledge_status`. Модель остаётся Haiku.
Проверено: MCP отвечает `initialize` (protocol 2025-06-18), без токена — 401,
личный и рабочий токены на 8092 — 401, sdk-токен на 8090/8091 — 401.
### Побочная находка: реранк падал на длинных чанках
`search_knowledge` с `type=enum` возвращал `400 Bad Request` от реранкера вместо
результатов. Причина не в фильтре: слот реранкера — **1024 токена**
(`n_slots=4`, `n_ctx_slot=1024`; больше и не имеет смысла — jina-reranker-v2
обучен на `n_ctx_train=1024`), а `RERANK_DOC_CHARS` резал документы по **2000
символов**, что на кириллице и таблицах enum даёт до 1018 токенов. Один такой
документ ломал весь запрос. Личную и рабочую базы это не задевало только потому,
что их чанки короче.
Починено в репозитории `rag-node` (коммит `322b717`): обрезка снижена до 1400
символов (худшее наблюдаемое отношение — 0.45 токена на символ, то есть ~630
токенов), а сам реранк переведён в **fail-soft** — при отказе отдаётся порядок
векторного поиска, как и при недоступном Redis, а не ошибка инструмента.
### Приёмка
- `knowledge_status`: 2465 документов, 13 755 точек, коммит совпадает с `main`.
- `grep_knowledge`: попадания по `SetSideParam`, `CalcMassInertiaProperties`,
`ksHoleTypeEnum`, `GetGabarit`, `FindObjectsByPoint`.
- `search_knowledge`: 7 из 8 контрольных вопросов дают точный топ-1
(`ksShellDefinition`, `ksRibDefinition`, `ksRDimSourceParam`,
`ksLinearPatternBuildingTypeEnum`, «Переменные», «Операции», «Компоненты»).
Слабое место — «сопряжения компонентов сборки»: топ-1 уходит в
`ksUnionComponentsDefinition` (булево объединение), а не в `IMateConstraints3D`;
для таких запросов агенту надёжнее `grep_knowledge` по имени интерфейса.
- Фильтры `type`, `tags`, `path_prefix` возвращают только свои разделы.
- CI (`run 2`) прошёл целиком: дождался общего лока, отработал инкрементально
(`unchanged 2465, chunks 0`) и переключил alias — инкрементальность и триггеры
проверены живьём, без искусственного прогона.
- Регламент обновления прогнан вхолостую: повторная генерация v24 даёт пустой diff.
Набор приёмочных запросов лежит в репозитории доков —
`tools/rag/acceptance-queries.md`.