diff --git a/README.md b/README.md index 07e273d..5edadb6 100644 --- a/README.md +++ b/README.md @@ -10,15 +10,15 @@ Telegram-бот — только часть рабочего окружения ## Текущее состояние Сейчас реализованы Telegram-бот-секретарь версии `0.2.2` и backend версии -`0.5.3`: подготовка поискового индекса и оценка Recall@K/MRR@K на вручную +`0.6.0`: подготовка поискового индекса и оценка Recall@K/MRR@K на вручную размеченном наборе запросов. | Компонент | Версия | Состояние | |---|---:|---| | Telegram-бот | `0.2.2` | на Synology работает `0.2.1`; обновление после слияния | -| Backend | `0.5.3` | добавлено атомарное переключение alias поискового индекса | +| Backend | `0.6.0` | добавлено атомарное переключение alias поискового индекса | | Frontend | — | ещё не создан | -| Сбор и обработка правовых данных | `0.5.3` | добавлены relevance set и baseline-метрики | +| Сбор и обработка правовых данных | `0.6.0` | добавлены relevance set и baseline-метрики | | RAG и база знаний | — | ещё не созданы | ## Структура репозитория @@ -59,4 +59,4 @@ python3 -m unittest discover -s tools/telegram-bot -v --- -Акылдаш · Telegram-бот v0.2.2 · Backend v0.5.3 · Frontend — не создан +Акылдаш · Telegram-бот v0.2.2 · Backend v0.6.0 · Frontend — не создан diff --git a/backend/README.md b/backend/README.md index faf2d13..fb45519 100644 --- a/backend/README.md +++ b/backend/README.md @@ -1,6 +1,6 @@ # Backend Акылдаш -Версия: `0.5.3` +Версия: `0.6.0` Первая backend-область проекта — загрузка правовых документов из официального Open Data API ЦБД Минюста Кыргызской Республики. Код расположен в @@ -152,8 +152,10 @@ python3 backend/search/minjust_opensearch.py \ По умолчанию checkpoint хранится в `data/opensearch/.checkpoint.json`; путь можно изменить через -`--checkpoint`. Checkpoint привязан к URL, cluster UUID, index UUID, `--limit` -и SHA-256 нормализованного manifest. Resume отклоняется при любом несовпадении: +`--checkpoint`. Checkpoint привязан к URL, cluster UUID, index UUID, `--limit`, +`--alias` и SHA-256 нормализованного manifest. При `--resume` передавайте то же +значение `--alias`; старый checkpoint без alias можно продолжить только без +него. Resume отклоняется при любом несовпадении: для обновлённого корпуса или пересозданного индекса нужно создать новый версионный индекс, проверить его и переключить alias. Это не оставляет удалённые trailing-фрагменты старых документов. @@ -208,4 +210,4 @@ PYTHONPATH=backend python3 -m search.query "ЖЧК ачуу тартиби" --la --- -Акылдаш · Backend v0.5.3 · Frontend — не создан +Акылдаш · Backend v0.6.0 · Frontend — не создан diff --git a/backend/ingestion/minjust_cbd.py b/backend/ingestion/minjust_cbd.py index ba897f1..1cf8d26 100644 --- a/backend/ingestion/minjust_cbd.py +++ b/backend/ingestion/minjust_cbd.py @@ -21,7 +21,7 @@ from datetime import datetime, timezone from pathlib import Path from typing import Callable, Iterable -APP_VERSION = "0.5.3" +APP_VERSION = "0.6.0" API_BASE_URL = "https://cbd.minjust.gov.kg/api/v1/OpenData/" LANGUAGES = {"Rus": "ru", "Kyr": "ky"} IMAGE_LANGUAGES = {"Russian": "ru", "Kyrgyz": "ky"} diff --git a/backend/normalization/minjust_cbd.py b/backend/normalization/minjust_cbd.py index 2ea23f5..8ebd579 100644 --- a/backend/normalization/minjust_cbd.py +++ b/backend/normalization/minjust_cbd.py @@ -23,7 +23,7 @@ from pathlib import Path from typing import Callable from urllib.parse import urlsplit -APP_VERSION = "0.5.3" +APP_VERSION = "0.6.0" SCHEMA_VERSION = "1" NORMALIZER_VERSION = "1.0.0" LANGUAGES = ("ru", "ky") diff --git a/backend/search/minjust_opensearch.py b/backend/search/minjust_opensearch.py index 51ebe78..466f97a 100644 --- a/backend/search/minjust_opensearch.py +++ b/backend/search/minjust_opensearch.py @@ -15,7 +15,7 @@ import urllib.request from pathlib import Path from typing import Iterator -APP_VERSION = "0.5.3" +APP_VERSION = "0.6.0" LANGUAGES = {"ru", "ky"} DEFAULT_MAPPING = Path(__file__).with_name("minjust-fragments-index.json") @@ -282,7 +282,15 @@ def checkpoint_state( "last_document_code", "complete", } - if not isinstance(state, dict) or set(state) != expected: + legacy_expected = expected - {"alias"} + if not isinstance(state, dict): + raise ValueError(f"Invalid checkpoint: {checkpoint}") + if set(state) == legacy_expected: + if state["schema_version"] != 1 or alias is not None: + raise ValueError(f"Legacy checkpoint does not support --alias: {checkpoint}") + state["schema_version"] = 2 + state["alias"] = None + elif set(state) != expected: raise ValueError(f"Invalid checkpoint: {checkpoint}") if ( state["schema_version"] != 2 @@ -319,7 +327,7 @@ def load_bulk( alias: str | None = None, ) -> tuple[int, int]: base = url.rstrip("/") - if alias is not None and alias == index: + if alias is not None and (not alias or alias == index): raise ValueError("--alias must differ from --index") index_url = f"{base}/{urllib.parse.quote(index, safe='')}" if resume: @@ -419,7 +427,9 @@ def main() -> int: raise SystemExit("--resume requires --url") if arguments.checkpoint and not arguments.url: raise SystemExit("--checkpoint requires --url") - if arguments.alias and not arguments.url: + if arguments.alias == "": + raise SystemExit("--alias must not be empty") + if arguments.alias is not None and not arguments.url: raise SystemExit("--alias requires --url") if arguments.url: checkpoint = arguments.checkpoint or Path("data/opensearch") / f"{arguments.index}.checkpoint.json" diff --git a/backend/test_minjust_opensearch.py b/backend/test_minjust_opensearch.py index ed3f7ce..cf02ac8 100644 --- a/backend/test_minjust_opensearch.py +++ b/backend/test_minjust_opensearch.py @@ -24,6 +24,8 @@ class MinjustOpenSearchTest(unittest.TestCase): with self.assertRaisesRegex(ValueError, "differ"): switch_alias("http://127.0.0.1:9200", "same", "same") + with self.assertRaisesRegex(ValueError, "differ"): + switch_alias("http://127.0.0.1:9200", "index", "") with patch("search.minjust_opensearch.request_json", return_value={"acknowledged": False}): with self.assertRaisesRegex(RuntimeError, "did not acknowledge"): switch_alias("http://127.0.0.1:9200", "index", "alias") @@ -125,6 +127,30 @@ class MinjustOpenSearchTest(unittest.TestCase): self.assertEqual(state["last_document_code"], "7") self.assertTrue(state["complete"]) + legacy = state.copy() + legacy.pop("alias") + legacy["schema_version"] = 1 + legacy["last_document_code"] = "8" + legacy["complete"] = False + checkpoint.write_text(json.dumps(legacy), encoding="utf-8") + with patch("search.minjust_opensearch.request_json") as request: + request.side_effect = [ + {"cluster_uuid": "cluster-1"}, + {"test-index": {"settings": {"index": {"uuid": "index-1"}}}}, + ] + self.assertEqual( + load_bulk( + root / "normalized", + "http://127.0.0.1:9200", + "test-index", + maximum_bytes=4096, + resume=True, + checkpoint=checkpoint, + ), + (1, 0), + ) + self.assertEqual(json.loads(checkpoint.read_text(encoding="utf-8"))["schema_version"], 2) + state["last_document_code"] = "8" state["complete"] = False checkpoint.write_text(json.dumps(state), encoding="utf-8") diff --git a/docs/README.md b/docs/README.md index ddf7a89..b3fbba1 100644 --- a/docs/README.md +++ b/docs/README.md @@ -35,4 +35,4 @@ --- -Акылдаш · Telegram-бот v0.2.2 · Backend v0.5.3 · Frontend — не создан +Акылдаш · Telegram-бот v0.2.2 · Backend v0.6.0 · Frontend — не создан diff --git a/docs/decisions/001-telegram-workspace-mvp.md b/docs/decisions/001-telegram-workspace-mvp.md index 650d41a..2acba6d 100644 --- a/docs/decisions/001-telegram-workspace-mvp.md +++ b/docs/decisions/001-telegram-workspace-mvp.md @@ -78,4 +78,4 @@ Telegram позволяет запретить пользователям отп --- -Акылдаш · Telegram-бот v0.2.2 · Backend v0.5.3 · Frontend — не создан +Акылдаш · Telegram-бот v0.2.2 · Backend v0.6.0 · Frontend — не создан diff --git a/docs/operations/project-status.md b/docs/operations/project-status.md index 072a02f..df80cd2 100644 --- a/docs/operations/project-status.md +++ b/docs/operations/project-status.md @@ -5,7 +5,7 @@ - Telegram-бот: `0.2.2` - Telegram-бот на Synology: `0.2.1` -- Backend: `0.5.3` +- Backend: `0.6.0` - Frontend: не создан ## Краткий итог @@ -234,4 +234,4 @@ --- -Акылдаш · Telegram-бот v0.2.2 · Backend v0.5.3 · Frontend — не создан +Акылдаш · Telegram-бот v0.2.2 · Backend v0.6.0 · Frontend — не создан diff --git a/docs/operations/telegram-workspace-plan.md b/docs/operations/telegram-workspace-plan.md index f8bc682..3852ddd 100644 --- a/docs/operations/telegram-workspace-plan.md +++ b/docs/operations/telegram-workspace-plan.md @@ -398,4 +398,4 @@ Git сохраняет актуальную версию --- -Акылдаш · Telegram-бот v0.2.2 · Backend v0.5.3 · Frontend — не создан +Акылдаш · Telegram-бот v0.2.2 · Backend v0.6.0 · Frontend — не создан diff --git a/docs/product/frontend-search-sps-plan.md b/docs/product/frontend-search-sps-plan.md index 28e3c05..beeece2 100644 --- a/docs/product/frontend-search-sps-plan.md +++ b/docs/product/frontend-search-sps-plan.md @@ -258,4 +258,4 @@ runtime-зависимостями frontend. Регистрация в стор --- -Акылдаш · Telegram-бот v0.2.2 · Backend v0.5.3 · Frontend — не создан +Акылдаш · Telegram-бот v0.2.2 · Backend v0.6.0 · Frontend — не создан diff --git a/docs/product/minjust-document-normalization-agent-task.md b/docs/product/minjust-document-normalization-agent-task.md index a204a69..dfc0246 100644 --- a/docs/product/minjust-document-normalization-agent-task.md +++ b/docs/product/minjust-document-normalization-agent-task.md @@ -214,4 +214,4 @@ python3 backend/normalization/minjust_cbd.py --- -Акылдаш · Telegram-бот v0.2.2 · Backend v0.5.3 · Frontend — не создан +Акылдаш · Telegram-бот v0.2.2 · Backend v0.6.0 · Frontend — не создан diff --git a/docs/product/project-overview.md b/docs/product/project-overview.md index f9be4da..10c7fa8 100644 --- a/docs/product/project-overview.md +++ b/docs/product/project-overview.md @@ -44,4 +44,4 @@ --- -Акылдаш · Telegram-бот v0.2.2 · Backend v0.5.3 · Frontend — не создан +Акылдаш · Telegram-бот v0.2.2 · Backend v0.6.0 · Frontend — не создан diff --git a/docs/team/ai-skills-for-beginners.md b/docs/team/ai-skills-for-beginners.md index 4c674cf..6770db1 100644 --- a/docs/team/ai-skills-for-beginners.md +++ b/docs/team/ai-skills-for-beginners.md @@ -180,4 +180,4 @@ --- -Акылдаш · Telegram-бот v0.2.2 · Backend v0.5.3 · Frontend — не создан +Акылдаш · Telegram-бот v0.2.2 · Backend v0.6.0 · Frontend — не создан diff --git a/tools/telegram-bot/README.md b/tools/telegram-bot/README.md index 2ea9743..2d65772 100644 --- a/tools/telegram-bot/README.md +++ b/tools/telegram-bot/README.md @@ -48,4 +48,4 @@ python3 -m unittest -v --- -Акылдаш · Telegram-бот v0.2.2 · Backend v0.5.3 · Frontend — не создан +Акылдаш · Telegram-бот v0.2.2 · Backend v0.6.0 · Frontend — не создан