diff --git a/CHANGELOG.md b/CHANGELOG.md index d41e71f..1672a3d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,16 @@ ## Не выпущено +- Backend `0.13.4` / Frontend `0.3.4`, алгоритм поиска `search-8`: для явно + заданного multi-index поиска включена глобальная статистика DFS; signed review + snapshots сохраняют полный index scope, а пустую выдачу можно сохранить с + обязательным общим комментарием и точной проверкой рангов. Узкое расширение + термина аренды сохранено без глобальных весов. На executable SHA + `1c7ddf2` выполнен полный isolated прогон 7 500 запросов: изменились 537 + порядков относительно исходного baseline, 6 выдач остались пустыми; это + наблюдения ранжирования, не экспертная оценка права. Три актуальных акта + проверялись только в отдельном локальном supplement; production и исходный + индекс не менялись. - Успешный CI на `push` в `main` запускает release workflow: при настроенных registry secrets он собирает образы rootless Kaniko, публикует digest references и сохраняет schema-v4 descriptor с SHA-256 в Gitea artifact; diff --git a/docs/product/search-relevance-findings-2026-11-03.md b/docs/product/search-relevance-findings-2026-11-03.md index da84cb4..41ff8b9 100644 --- a/docs/product/search-relevance-findings-2026-11-03.md +++ b/docs/product/search-relevance-findings-2026-11-03.md @@ -12,6 +12,8 @@ `0.3.3` → `0.3.4`, версия алгоритма `search-6` → `search-8`. `search-7` относится к предшествующему составу ranking semantics; новые подписанные снимки этого PR помечаются `search-8`. Сохранённые отзывы не переписываются. +Финальный runtime/batch прогон кода выполнен на `1c7ddf2`; последующий коммит +этого отчёта и changelog меняет только документацию. ## Исходный benchmark @@ -89,10 +91,10 @@ Backend теперь сохраняет исходную строку и доб фразы, исходный phrase boost 3; он не описывает multi-index DFS. После подключения трёх актов в отдельном supplement на `e653f3b` изменились 184 выдачи против code-only варианта и 38 top-1; все шесть пустых выдач -сохранились. Разные наборы индексов нельзя считать одним benchmark. Для -итогового conditional-DFS SHA нужен отдельный прогон; контроль запросов об -аренде жилья/земли, поднайме, трудовых отношениях, международном праве и KY -формулировках остаётся обязательным. Rank-метрики не являются юридической +сохранились. Разные наборы индексов нельзя считать одним benchmark. Итоговый +conditional-DFS прогон на `1c7ddf2` приведён ниже. Контроль запросов об аренде +жилья/земли, поднайме, трудовых отношениях, международном праве и KY +формулировках выполнялся отдельно; rank-метрики не являются юридической оценкой. ## Условный scoring для явного multi-index scope @@ -117,11 +119,14 @@ multi-index конфигурации и не меняет behavior одиноч одном неизменном наборе данных: 300 заранее выбранных запросов, максимум 300. Порядок менялся в 93 случаях, top-1 — в 29; из 9 именованных риск-кейсов изменились 3, все 5 выбранных positive controls сохранили top-1. Контроль с -индивидуальным актом 135066 сохранил этот акт первым. Результат по пяти -педагогическим/научным запросам с медицинским актом на первом месте и по -запросу о болезнях животных не исправлен; это межтематические lexical overlaps, -а не основание вводить глобальные веса или специальные document ID. -Сравнение ограничено выборкой и не является разметкой юридической правильности. +индивидуальным актом 135066 сохранил этот акт первым. В пяти запросах о +педагогических/научных работниках и одном запросе о болезнях животных top-1 не +изменился. Эти шесть случаев требуют предметной оценки и не объявляются +автоматически нерелевантными: статья 150(8) закона об охране здоровья связывает +аттестацию педагогических/научных работников с медицинской деятельностью, а +случай с болезнями животных остаётся без экспертной оценки. Новые оценки пар не +выставлялись; специальные веса или document IDs не добавлялись. Сравнение +ограничено выборкой и не является разметкой юридической правильности. Медианы 22,955 мс для default и 16,115 мс для DFS не используются как оценка скорости: default всегда исполнялся первым, возможен cache/order bias. @@ -145,12 +150,11 @@ PYTHONPATH=backend python3 -m unittest \ backend.test_search_api_opensearch.SearchMultiIndexDfsOpenSearchTest.test_global_statistics_mode_accepts_read_only_multi_index_search -v ``` -Тест выполняет только поиск и проверяет подписанный scope; он не создаёт и не -удаляет индексы. Root запускает его только при подтверждении, что указанный -supplement ещё существует и доступен на read-only runtime. Полный benchmark на -7 500 запросах нужен для итогового pinned SHA с тем же frozen baseline. -300-query эксперимент и предыдущие benchmarks не следует выдавать за -результат нового SHA. +Root выполнил этот read-only gate на 8081 для `1c7ddf2`: фактический multi-index +URI использовал DFS и подписанный token сохранял полный scope. Gate выполняет +только поиск и не создаёт/удаляет индексы. Полный benchmark на том же code SHA +и frozen baseline приведён ниже; 300-query experiment и более ранние прогоны +остаются отдельными сравнительными срезами. Откат к предшествующему приложению возвращает `query_then_fetch` для multi-index поиска. Индекс, документы, saved reviews и старые подписанные токены при этом @@ -159,6 +163,61 @@ supplement ещё существует и доступен на read-only runtim контракт ниже: отключение его подключения скрывает только добавленные редакции, не удаляя подготовленные файлы и базовый индекс. +## Итоговый pinned прогон search-8 + +Полный isolated прогон для executable SHA `1c7ddf2fcbd7c55920470e7ac52339fdab0366db` +собрал 7 500 уникальных запросов с версией `search-8`. SHA-256 выдачи: +`fc02e22e5b3d612813ffc0bdaf9892bb16ee4c29af3e1b77f79e58a0a45c8ec1`. Итог +сопоставлен с frozen baseline и двумя явно указанными промежуточными режимами: + +| Сравнение | Изменён порядок | Изменён top-1 | +|---|---:|---:| +| Исходный baseline `search-6` | 537 | 103 | +| Code-only `726b1ee`, `search-7` | 521 | 93 | +| Code + три акта, `e653f3b`, без DFS | 425 | 63 | + +Это число изменений порядка, а не улучшений. Все шесть пустых выдач сохранились +во всех четырёх прогонах. Среди ранее проверенных Codex (ИИ) пар с нулевой +оценкой top-1 стало 26 вместо 28 в baseline; остальные 26 не объявлены +исправленными, и новые выдачи автоматически не оценивались. + +| Добавленный акт | Наблюдался в top-1 / top-3 / top-10 | +|---|---:| +| Трудовой кодекс КР `230021083` | 24 / 58 / 105 | +| Земельный кодекс КР `230029465` | 4 / 11 / 26 | +| Закон об охране здоровья `230000918` | 34 / 51 / 92 | + +Все шесть точных названий новых актов на RU/KY дали ожидаемый текущий акт первым. +Все 284 запроса, общие с целевым DFS экспериментом, совпали с ним по полному +порядку кодов и редакций. Проверки dataset guard подтвердили неизменность +исходного индекса, manifest, mappings и UUID/count, а также 115 подключённых +файлов. 7 503 записи локальной лаборатории совпали с backup; обе SQLite +integrity checks прошли. Записи оценок, комментарии и пользователи не менялись. + +Шесть межтематических контекстов нельзя автоматически считать нерелевантными: +медицинский закон остался первым в пяти запросах о педагогических/научных +работниках и в одном запросе о болезнях животных. Для педагогических случаев +проверенная статья 150(8) связывает аттестацию этих работников с медицинской +деятельностью; новые оценки пар не выставлялись. Вопрос о животных также +остался без экспертной оценки. ИИ-аннотации не доказывают полноту правового +ответа или юридическую правильность ранжирования. + +Режим и scope дополнительно проверены на runtime `8081`: для multi-index `/search` +уходит DFS, для одиночного индекса и filters — прежний default; тело DSL +одинаково. Alias проверен transport mock без создания alias. Runtime mode/API +smoke включал HMAC/TTL, signed scope, сохранение пустого результата и +отрицательные rank/code сценарии. Browser UI fixture прошёл на `726b1ee`; UI +побайтно не менялся в следующих SHA, но отдельный browser прогон на `1c7ddf2` +не выполнялся. Медиана backend `23.685 мс` описательна и не является SLO или +доказательством ускорения. + +Эксперимент подключал только три акта в отдельном supplement и не доказывает +полноту всего корпуса, актуальность всех редакций, наличие вложений или +production-готовность. Отключение overlay/supplement скроет эти новые редакции +из локального поиска/API, но сохранит подготовленные файлы, review-записи и +исходный индекс. Production не менялся. Подробный технический отчёт и raw +benchmark остаются во внешнем рабочем наборе и в PR не включены. + ## Пустые выдачи в лаборатории Исходный контракт блокировал сохранение шести подписанных пустых снимков: @@ -185,12 +244,14 @@ SQLite-схема, исторические записи и формат под сессии, 79 AI-оценок и 55 516 диагностических комментариев; 74 715 оценок результатов остались пустыми намеренно. Integrity check прошёл, порядок кодов и редакций baseline не менялся. Эти сохранённые оценки не -переписывались; шесть пустых сессий должны быть размечены отдельно после -выпуска интерфейса. +переписывались. В последующем изолированном trial шесть реальных подписанных +пустых отзывов с общими комментариями были сохранены как записи 7498–7503; +итоговые 7 503 строки лаборатории совпали с backup, integrity check прошёл. +Пустые query-level отзывы не являются оценками отдельных документов. ## Пробел актуального корпуса и безопасный контракт закрытия -Отдельно от ранжирования, в проверенном тестовом индексе не было трёх +Отдельно от ранжирования, в исходном base index не было трёх подтверждённых действующих актов (все три canonical ID имели `_count = 0`): | Акт | Canonical ID | Последняя проверенная редакция | @@ -205,13 +266,16 @@ canonical-каталоги всех трёх документов, manifest со обработанных документов. Однако трудовой акт там отстаёт от официальной редакции 57548 от 28.07.2026 (последняя подготовленная — № 60 от 23.06.2026); земельный акт нормализован до редакции № 10 от 18.07.2025; для акта о здоровье -последняя подготовленная — № 60 от 23.01.2026. В индекс эти три canonical ID не -попали. Прежние отменённые трудовой и земельный кодексы нельзя переименовать +последняя подготовленная — № 60 от 23.01.2026. В base index эти три canonical +ID не попали. Прежние отменённые трудовой и земельный кодексы нельзя переименовать или поднять как замену актуальным нормам. -Для отдельной проверки подготовлены точные официальные RU/KY редакции: 3 -документа и 8 934 фрагмента. Это добавление пока не подключено к индексу или -API. Вложения и полная история новых canonical ID отдельно не подтверждены. +Для локальной изолированной проверки подготовлены точные официальные RU/KY +редакции: 3 документа и 8 934 фрагмента. На runtime 8081 они были временно +подключены отдельным supplement-index и доступны API через read-only overlay +catalogues. Это не изменение base index или production и не доказательство +полноты корпуса. Вложения и полная история новых canonical ID отдельно не +подтверждены. Закрытие пробела требует отдельного контролируемого обновления данных: @@ -222,39 +286,31 @@ API. Вложения и полная история новых canonical ID о 3. Нормализовать документы отдельно и проверить exact-count/hash. Для ограниченного дополнения собрать отдельный версионный индекс только из этих актов; не пересобирать и не перезаписывать индекс из 42,6 млн фрагментов. -4. На изолированном стенде подключить read-only представление трёх новых - каталогов к API `data_root` и искать через выражение - `текущий-индекс,supplement-index`. URL-кодирование запятой для такого - выражения проверено read-only на API. Проверить наличие canonical ID, - открытие новой редакции RU/KY, статус и даты, collapse по документу, а также - контрольную выдачу по старым индексам. Не создавать записи в основном - индексе и не менять alias до принятия результата. +4. Изолированный read-only trial уже проверил отдельный supplement-index, + подключённые каталоги `data_root`, RU/KY выдачу, current-edition routes, + collapse и контрольные запросы. Перед новым подключением нужно повторно + сверить official source и dataset guards; trial не записывал новые документы + в base index и не менял alias. 5. Публикация требует отдельного владельческого разрешения и проверенного - rollback. Если отдельный supplement-index будет включён, rollback отключит - поиск и просмотр новых редакций из него; подготовленные файлы и уже - сохранённые отзывы при этом сохраняются, базовый индекс не удаляется. Эта PR - не загружает документы, не подключает offline editions к API и не меняет - индекс или production. + rollback. При отключении локального supplement-index поиск и просмотр новых + редакций из него прекращаются; подготовленные файлы и уже сохранённые отзывы + сохраняются, базовый индекс не удаляется. PR + фиксирует код и результаты локального испытания; production, base index и + исходные данные не менялись. ## Что остаётся проверить -- Root-owned изолированный прогон на 8081 должен проверить реальный top-k новой - терминологической ветки и baseline-сравнение контрольных примеров. -- Целевой read-only integration gate, который не создаёт и не удаляет индекс; - прогон выполняет root на выделенном стенде: - - ```bash - AKYLDASH_OPENSEARCH_URL=http://127.0.0.1:8081 \ - AKYLDASH_OPENSEARCH_INDEX=akyldash-fragments-v2 \ - PYTHONPATH=backend python3 -m unittest \ - backend.test_search_api_opensearch.SearchRankingOpenSearchTest.test_generic_lease_query_ranks_general_civil_code_first -v - ``` -- Полный benchmark после изменения нужен для нового snapshot и сравнения; он - выполняется отдельно от исходной сбора 7 500 выдач. -- Актуальные три акта требуют отдельной проверки полноты/лицензии/истории и - контролируемой полной пересборки корпуса. Их отсутствие не решается - ранжированием. -- Независимое ревью и CI этой PR не заменяют экспертную оценку правового ответа. +- Финальный code/data эксперимент и full 7 500 run относятся к executable SHA + `1c7ddf2`; текущий follow-up commit меняет только этот report и changelog. + CI и полное независимое ревью должны повторно пройти на новом PR head. +- Browser fixture пустой выдачи прошёл на `726b1ee`; UI побайтно неизменён в + следующих commit. Для `1c7ddf2` выполнены реальные API/runtime smokes, но новый + полный browser run не заявляется. +- Три supplement-акта не подтверждают полноту всего корпуса, полную историю, + вложения, лицензирование или production readiness. Для новой публикации нужен + свежий source/edition check и отдельное разрешение владельца. +- Измерения top-k, AI-разметка и технические smoke checks не заменяют независимую + экспертную оценку юридической релевантности. Исходные измерения и хеши хранятся вне репозитория в рабочем наборе `search-benchmark-2026-11-02`. В этот репозиторий не включаются сырые ответы