irinaqqq commited on
Commit
6a02b16
·
verified ·
1 Parent(s): 7de00e5

Upload folder using huggingface_hub

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .dockerignore +9 -0
  2. .gitattributes +7 -0
  3. .gitignore +2 -0
  4. README.md +219 -3
  5. artifacts/indexes/built_indexes.json +17 -0
  6. artifacts/indexes/finetuned/index_info.json +9 -0
  7. artifacts/indexes/finetuned/kz.faiss +3 -0
  8. artifacts/indexes/finetuned/kz_meta.jsonl +0 -0
  9. artifacts/indexes/finetuned/ru.faiss +3 -0
  10. artifacts/indexes/finetuned/ru_meta.jsonl +0 -0
  11. artifacts/indexes/labse/index_info.json +9 -0
  12. artifacts/indexes/labse/kz.faiss +3 -0
  13. artifacts/indexes/labse/kz_meta.jsonl +0 -0
  14. artifacts/indexes/labse/ru.faiss +3 -0
  15. artifacts/indexes/labse/ru_meta.jsonl +0 -0
  16. artifacts/indexes/mpnet_base/index_info.json +9 -0
  17. artifacts/indexes/mpnet_base/kz.faiss +3 -0
  18. artifacts/indexes/mpnet_base/kz_meta.jsonl +0 -0
  19. artifacts/indexes/mpnet_base/ru.faiss +3 -0
  20. artifacts/indexes/mpnet_base/ru_meta.jsonl +0 -0
  21. artifacts/models/finetuned_mpnet/1_Pooling/config.json +10 -0
  22. artifacts/models/finetuned_mpnet/README.md +491 -0
  23. artifacts/models/finetuned_mpnet/config.json +28 -0
  24. artifacts/models/finetuned_mpnet/config_sentence_transformers.json +14 -0
  25. artifacts/models/finetuned_mpnet/eval/Information-Retrieval_evaluation_overall_results.csv +3 -0
  26. artifacts/models/finetuned_mpnet/model.safetensors +3 -0
  27. artifacts/models/finetuned_mpnet/modules.json +14 -0
  28. artifacts/models/finetuned_mpnet/sentence_bert_config.json +4 -0
  29. artifacts/models/finetuned_mpnet/special_tokens_map.json +51 -0
  30. artifacts/models/finetuned_mpnet/tokenizer.json +3 -0
  31. artifacts/models/finetuned_mpnet/tokenizer_config.json +62 -0
  32. artifacts/reports/data_validation.json +12 -0
  33. artifacts/reports/eval_finetuned.json +35 -0
  34. artifacts/reports/eval_labse.json +35 -0
  35. artifacts/reports/eval_mpnet_base.json +35 -0
  36. artifacts/reports/figures/rank_metrics_kz.png +0 -0
  37. artifacts/reports/figures/rank_metrics_overall.png +0 -0
  38. artifacts/reports/figures/rank_metrics_ru.png +0 -0
  39. artifacts/reports/figures/recall_curve_kz.png +0 -0
  40. artifacts/reports/figures/recall_curve_overall.png +0 -0
  41. artifacts/reports/figures/recall_curve_ru.png +0 -0
  42. artifacts/reports/figures/recall_kz.png +0 -0
  43. artifacts/reports/figures/recall_overall.png +0 -0
  44. artifacts/reports/figures/recall_ru.png +0 -0
  45. artifacts/reports/figures/relative_improvement_kz.png +0 -0
  46. artifacts/reports/figures/relative_improvement_overall.png +0 -0
  47. artifacts/reports/figures/relative_improvement_ru.png +0 -0
  48. artifacts/reports/figures_summary.json +21 -0
  49. check_base_model.py +6 -0
  50. check_device.py +25 -0
.dockerignore ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ __pycache__
2
+ *.pyc
3
+ *.pyo
4
+ *.pyd
5
+ .venv
6
+ venv-LexIR.v2
7
+ checkpoints
8
+ data
9
+ artifacts
.gitattributes CHANGED
@@ -33,3 +33,10 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ artifacts/indexes/finetuned/kz.faiss filter=lfs diff=lfs merge=lfs -text
37
+ artifacts/indexes/finetuned/ru.faiss filter=lfs diff=lfs merge=lfs -text
38
+ artifacts/indexes/labse/kz.faiss filter=lfs diff=lfs merge=lfs -text
39
+ artifacts/indexes/labse/ru.faiss filter=lfs diff=lfs merge=lfs -text
40
+ artifacts/indexes/mpnet_base/kz.faiss filter=lfs diff=lfs merge=lfs -text
41
+ artifacts/indexes/mpnet_base/ru.faiss filter=lfs diff=lfs merge=lfs -text
42
+ artifacts/models/finetuned_mpnet/tokenizer.json filter=lfs diff=lfs merge=lfs -text
.gitignore ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ .vscode
2
+ venv*
README.md CHANGED
@@ -1,3 +1,219 @@
1
- ---
2
- license: unknown
3
- ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: other
3
+ language:
4
+ - ru
5
+ - kk
6
+ tags:
7
+ - legal
8
+ - semantic-search
9
+ - retrieval
10
+ - faiss
11
+ - sentence-transformers
12
+ - fastapi
13
+ - openai
14
+ pipeline_tag: sentence-similarity
15
+ ---
16
+
17
+ # LexIR
18
+
19
+ LexIR — исследовательский прототип интеллектуального юридического ассистента с гибкой архитектурой под **любой правовой корпус**. Система сочетает семантический поиск (fine‑tuned MPNet + FAISS) и «grounded»‑ответы ассистента, которые строятся **только** на найденных нормах из подключенного корпуса.
20
+
21
+ ## Кратко о том, как все работает
22
+
23
+ 1. **Источник норм**: парсер/ETL вытягивает тексты правовых норм и приводит их к унифицированному формату.
24
+ 2. **Корпус**: RU/KZ JSONL‑набор норм (в демо — Конституция РК как пример).
25
+ 3. **Обучение bi‑encoder**: `src/train_biencoder.py` дообучает MPNet на парах «запрос → релевантная норма».
26
+ 4. **Индексы**: `src/build_index.py` строит FAISS‑индексы по RU/KZ для базовой/LaBSE/финетюн‑модели.
27
+ 5. **Retrieval API**: `site/backend/app.py` поднимает FastAPI и локально выполняет поиск по FAISS.
28
+ 6. **LLM‑оркестрация**: Azure OpenAI Assistant получает запрос, **обязан** вызвать инструмент `lexir_retrieve_constitution`, и формирует ответ только на основе возвращенных норм.
29
+ 7. **UI**: фронтенд отправляет запросы на `/api/chat`, хранит `thread_id` в sessionStorage и отображает ответы.
30
+
31
+ ## Архитектура (модули)
32
+
33
+ - **Data ingestion**: `data_parser/adilet_zan_parser.py` → `data/clauses_constitution_ru_kz.jsonl` (в демо).
34
+ - **Training**: `src/train_biencoder.py` → `artifacts/models/finetuned_mpnet/`.
35
+ - **Indexing**: `src/build_index.py` → `artifacts/indexes/<alias>/{ru,kz}.faiss` + `*_meta.jsonl`.
36
+ - **Evaluation**: `src/evaluate.py`, `src/plot_eval.py`, `src/validate.py` → `artifacts/reports/`.
37
+ - **Backend**: `site/backend/app.py` (FastAPI + Azure OpenAI Assistants).
38
+ - **Assistant tooling**: `site/backend/assistant/*.py`.
39
+ - **Frontend**: `site/frontend/` (статический SPA‑интерфейс).
40
+
41
+ ## Структура репозитория (ключевое)
42
+
43
+ ```
44
+ artifacts/
45
+ models/finetuned_mpnet/ # fine‑tuned MPNet
46
+ indexes/<alias>/ # FAISS индексы + meta JSONL
47
+ reports/ # eval отчеты и графики
48
+ data/
49
+ clauses_constitution_ru_kz.jsonl
50
+ legal_assistant_train.jsonl
51
+ legal_assistant_test.jsonl
52
+ data_parser/
53
+ adilet_zan_parser.py
54
+ site/
55
+ backend/
56
+ app.py
57
+ assistant/
58
+ assistant_create.py
59
+ assistant_edit.py
60
+ assistant_info.py
61
+ demo_assistant.py
62
+ frontend/
63
+ index.html
64
+ app.js
65
+ styles.css
66
+ src/
67
+ build_index.py
68
+ train_biencoder.py
69
+ evaluate.py
70
+ plot_eval.py
71
+ validate.py
72
+ demo_cli.py
73
+ api.py
74
+ ```
75
+
76
+ ## Данные и формат
77
+
78
+ `data/clauses_constitution_ru_kz.jsonl` — параллельный RU/KZ корпус (в демо — Конституция РК как пример). Каждая строка:
79
+
80
+ ```json
81
+ {
82
+ "id": "KZ.CONST.1995:ART18:PAR2:cl1",
83
+ "text": "русский абзац ...",
84
+ "text_kz": "қазақша абзац ...",
85
+ "meta": {
86
+ "doc_id": "KZ.CONST.1995",
87
+ "article_number": "18",
88
+ "paragraph_number": 2,
89
+ "article_title_ru": "...",
90
+ "article_title_kz": "...",
91
+ "source_ru": "...",
92
+ "source_kz": "..."
93
+ }
94
+ }
95
+ ```
96
+
97
+ ## Retrieval и ранжирование
98
+
99
+ - Модель: `SentenceTransformer` (по умолчанию fine‑tuned MPNet).
100
+ - Эмбеддинги нормализуются и индексируются в **FAISS IndexFlatIP** (cosine similarity).
101
+ - Поиск возвращает `top_k`, затем применяется порог `min_score` (в ассистенте по умолчанию 0.25).
102
+ - Результат — список норм с `id`, `text`, `meta`, `score`.
103
+
104
+ ## Ассистент (LLM)
105
+
106
+ Файл `site/backend/assistant/assistant_create.py` создает ассистента Azure OpenAI с:
107
+
108
+ - обязательным вызовом инструмента `lexir_retrieve_constitution`,
109
+ - запретом на «галлюцинации» и просьбой отвечать на языке пользователя,
110
+ - политикой «grounded only» — ответы строятся исключительно на найденных нормах корпуса.
111
+
112
+ Созданный `assistant_id` сохраняется в `site/backend/assistant/assistant_id.txt`.
113
+
114
+ ## Запуск (локально)
115
+
116
+ ### 1) Подготовка окружения
117
+
118
+ ```bash
119
+ python -m venv .venv
120
+ source .venv/bin/activate
121
+ pip install -r site/backend/requirements.txt
122
+ ```
123
+
124
+ ### 2) Переменные окружения
125
+
126
+ Минимальный набор (см. `site/backend/app.py`):
127
+
128
+ ```
129
+ AZURE_OPENAI_API_KEY=...
130
+ AZURE_OPENAI_VERSION=...
131
+ AZURE_OPENAI_ENDPOINT=...
132
+ ```
133
+
134
+ Опционально:
135
+
136
+ ```
137
+ ASSISTANT_ID=... # если уже создан ассистент
138
+ AZURE_OPENAI_ASSISTANT_MODEL=...# требуется для assistant_edit.py
139
+ ```
140
+
141
+ ### 3) Индексы и модель
142
+
143
+ Backend ожидает:
144
+
145
+ ```
146
+ artifacts/models/finetuned_mpnet/
147
+ artifacts/indexes/finetuned/{ru,kz}.faiss
148
+ artifacts/indexes/finetuned/{ru,kz}_meta.jsonl
149
+ ```
150
+
151
+ Если их нет:
152
+
153
+ ```bash
154
+ python data_parser/adilet_zan_parser.py
155
+ python src/train_biencoder.py
156
+ python src/build_index.py
157
+ ```
158
+
159
+ ### 4) Создание ассистента
160
+
161
+ ```bash
162
+ python site/backend/assistant/assistant_create.py
163
+ ```
164
+
165
+ ### 5) Запуск веб‑приложения
166
+
167
+ ```bash
168
+ uvicorn app:app --app-dir site/backend --host 0.0.0.0 --port 8000
169
+ ```
170
+
171
+ Открыть в браузере: `http://localhost:8000`.
172
+
173
+ ## Запуск через Docker
174
+
175
+ ```bash
176
+ docker compose up --build
177
+ ```
178
+
179
+ `docker-compose.yml` берет переменные из `site/backend/.env` и прокидывает порт `8000`.
180
+
181
+ ## CLI‑демо (без веб‑UI)
182
+
183
+ - Локальный retrieval без ассистента:
184
+ ```bash
185
+ python src/demo_cli.py
186
+ ```
187
+ - Чат через ассистента (CLI):
188
+ ```bash
189
+ python site/backend/assistant/demo_assistant.py
190
+ ```
191
+
192
+ ## Оценка качества
193
+
194
+ ```bash
195
+ python src/validate.py
196
+ python src/evaluate.py
197
+ python src/plot_eval.py
198
+ ```
199
+
200
+ Результаты: `artifacts/reports/` и `artifacts/reports/figures/`.
201
+
202
+ ## Типичные ошибки
203
+
204
+ - **Assistant id not found** → запустить `assistant_create.py` или задать `ASSISTANT_ID`.
205
+ - **Index file not found** → собрать индексы через `src/build_index.py`.
206
+ - **Fine‑tuned model directory not found** → обучить `src/train_biencoder.py` либо собрать индексы на базовой модели.
207
+ - **Azure credentials missing** → проверить `.env` или переменные окружения.
208
+
209
+ ## Ограничения
210
+
211
+ - Ассистент не заменяет юридическую консультацию; ответы ограничены **подключенным корпусом**.
212
+ - Качество ответа зависит от релевантности retrieval‑результатов и качества корпуса.
213
+
214
+ ## Как заменить корпус на другой
215
+
216
+ 1. Подготовить новый JSONL корпус в формате, совместимом с `src/data_io.py` (id/text/метаданные).
217
+ 2. Обновить парсер/ETL (или загрузчик) для новых источников.
218
+ 3. Переобучить bi‑encoder (`src/train_biencoder.py`) на новых парах «запрос → норма».
219
+ 4. Пересобрать индексы (`src/build_index.py`) и перезапустить backend.
artifacts/indexes/built_indexes.json ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "alias": "mpnet_base",
4
+ "dir": "artifacts\\indexes\\mpnet_base",
5
+ "model": "paraphrase-multilingual-mpnet-base-v2"
6
+ },
7
+ {
8
+ "alias": "labse",
9
+ "dir": "artifacts\\indexes\\labse",
10
+ "model": "sentence-transformers/LaBSE"
11
+ },
12
+ {
13
+ "alias": "finetuned",
14
+ "dir": "artifacts\\indexes\\finetuned",
15
+ "model": "artifacts\\models\\finetuned_mpnet"
16
+ }
17
+ ]
artifacts/indexes/finetuned/index_info.json ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "artifacts\\models\\finetuned_mpnet",
3
+ "ru_count": 477,
4
+ "kz_count": 477,
5
+ "ru_index": "artifacts\\indexes\\finetuned\\ru.faiss",
6
+ "kz_index": "artifacts\\indexes\\finetuned\\kz.faiss",
7
+ "ru_meta": "artifacts\\indexes\\finetuned\\ru_meta.jsonl",
8
+ "kz_meta": "artifacts\\indexes\\finetuned\\kz_meta.jsonl"
9
+ }
artifacts/indexes/finetuned/kz.faiss ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:07595bb4b692868ff05892a3bfdafff84177e8eb5a67294f839e04a6113ad7a1
3
+ size 1465389
artifacts/indexes/finetuned/kz_meta.jsonl ADDED
The diff for this file is too large to render. See raw diff
 
artifacts/indexes/finetuned/ru.faiss ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:40298ee1871f677c03db354f646e211bba793381931ddaf649e4a9ddcecf29d9
3
+ size 1465389
artifacts/indexes/finetuned/ru_meta.jsonl ADDED
The diff for this file is too large to render. See raw diff
 
artifacts/indexes/labse/index_info.json ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "sentence-transformers/LaBSE",
3
+ "ru_count": 477,
4
+ "kz_count": 477,
5
+ "ru_index": "artifacts\\indexes\\labse\\ru.faiss",
6
+ "kz_index": "artifacts\\indexes\\labse\\kz.faiss",
7
+ "ru_meta": "artifacts\\indexes\\labse\\ru_meta.jsonl",
8
+ "kz_meta": "artifacts\\indexes\\labse\\kz_meta.jsonl"
9
+ }
artifacts/indexes/labse/kz.faiss ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:9b0a43d2348b26967d3c5e94305e3cd8ea84e6c9aefdaa30c28260c5c92b7358
3
+ size 1465389
artifacts/indexes/labse/kz_meta.jsonl ADDED
The diff for this file is too large to render. See raw diff
 
artifacts/indexes/labse/ru.faiss ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:994a58d5d39704134a728ebd671355924af27abf94e79ce8052000afc5b45185
3
+ size 1465389
artifacts/indexes/labse/ru_meta.jsonl ADDED
The diff for this file is too large to render. See raw diff
 
artifacts/indexes/mpnet_base/index_info.json ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "paraphrase-multilingual-mpnet-base-v2",
3
+ "ru_count": 477,
4
+ "kz_count": 477,
5
+ "ru_index": "artifacts\\indexes\\mpnet_base\\ru.faiss",
6
+ "kz_index": "artifacts\\indexes\\mpnet_base\\kz.faiss",
7
+ "ru_meta": "artifacts\\indexes\\mpnet_base\\ru_meta.jsonl",
8
+ "kz_meta": "artifacts\\indexes\\mpnet_base\\kz_meta.jsonl"
9
+ }
artifacts/indexes/mpnet_base/kz.faiss ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6366f23f678651e6efb9c3d8a0f17af7af4909426d53992bc21602d6f6e4149b
3
+ size 1465389
artifacts/indexes/mpnet_base/kz_meta.jsonl ADDED
The diff for this file is too large to render. See raw diff
 
artifacts/indexes/mpnet_base/ru.faiss ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a4cb2d5749aa8a45a82a769b1bc583330d62cb63127d9aa51ded579d8cd7913e
3
+ size 1465389
artifacts/indexes/mpnet_base/ru_meta.jsonl ADDED
The diff for this file is too large to render. See raw diff
 
artifacts/models/finetuned_mpnet/1_Pooling/config.json ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "word_embedding_dimension": 768,
3
+ "pooling_mode_cls_token": false,
4
+ "pooling_mode_mean_tokens": true,
5
+ "pooling_mode_max_tokens": false,
6
+ "pooling_mode_mean_sqrt_len_tokens": false,
7
+ "pooling_mode_weightedmean_tokens": false,
8
+ "pooling_mode_lasttoken": false,
9
+ "include_prompt": true
10
+ }
artifacts/models/finetuned_mpnet/README.md ADDED
@@ -0,0 +1,491 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ tags:
3
+ - sentence-transformers
4
+ - sentence-similarity
5
+ - feature-extraction
6
+ - dense
7
+ - generated_from_trainer
8
+ - dataset_size:3786
9
+ - loss:MultipleNegativesRankingLoss
10
+ base_model: sentence-transformers/paraphrase-multilingual-mpnet-base-v2
11
+ widget:
12
+ - source_sentence: 'Статья 23: о чём 2 пункт?'
13
+ sentences:
14
+ - 2. Заңда көзделген реттерде ғана және тек қана соттың санкциясымен тұтқындауға
15
+ және қамауда ұстауға болады, тұтқындалған адамға шағымдану құқығы беріледі. Соттың
16
+ санкциясынсыз адамды жетпіс екі сағаттан аспайтын мерзімге ұстауға болады.
17
+ - 2. Председатели и судьи Конституционного Суда, Верховного Суда и иных судов, председатели
18
+ и члены Центральной избирательной комиссии, Высшей аудиторской палаты Республики,
19
+ военнослужащие, работники органов национальной безопасности, правоохранительных
20
+ органов не должны состоять в политических партиях, профессиональных союзах, выступать
21
+ в поддержку какой-либо политической партии.
22
+ - 4. Должность судьи Конституционного Суда несовместима с депутатским мандатом,
23
+ занятием иных оплачиваемых должностей, кроме преподавательской, научной или иной
24
+ творческой деятельности, осуществлением предпринимательской деятельности, вхождением
25
+ в состав руководящего органа или наблюдательного совета коммерческой организации.
26
+ - source_sentence: Можно ли лишать гражданства по Конституции РК?
27
+ sentences:
28
+ - '2. К ведению местных исполнительных органов относится:'
29
+ - 6) сот құрылысы мен сотта іс жүргізу мәселелеріне;
30
+ - 2. Собственность обязывает, пользование ею должно одновременно служить общественному
31
+ благу. Субъекты и объекты собственности, объем и пределы осуществления собственниками
32
+ своих прав, гарантии их защиты определяются законом.
33
+ - source_sentence: конституцияда туралы қысқаша түсіндір.
34
+ sentences:
35
+ - 4. Организация и деятельность Парламента, правовое положение его депутатов определяются
36
+ конституционным законом.
37
+ - 3. На период осуществления своих полномочий Президент Республики Казахстан не
38
+ должен состоять в политической партии.
39
+ - 4. Конституциялық заңдар Конституцияда көзделген мәселелер бойынша әр Палата депутаттарының
40
+ жалпы санының кемінде үштен екісінің көпшілік даусымен қабылданады.
41
+ - source_sentence: Конституциядан субъектілері туралы тармақты тауып берші.
42
+ sentences:
43
+ - 2. Меншік міндет жүктейді, оны пайдалану сонымен қатар қоғам игілігіне де қызмет
44
+ етуге тиіс. Меншік субъектілері мен объектілері, меншік иелерінің өз құқықтарын
45
+ жүзеге асыру көлемі мен шектері, оларды қорғау кепілдіктері заңмен белгіленеді.
46
+ - '2. Основополагающими принципами деятельности Республики являются: общественное
47
+ согласие и политическая стабильность, экономическое развитие на благо всего народа,
48
+ казахстанский патриотизм, решение наиболее важных вопросов государственной жизни
49
+ демократическими методами, включая голосование на республиканском референдуме
50
+ или в Парламенте.'
51
+ - 2) Үкімет пен Жоғары аудиторлық палатаның республикалық бюджеттің атқарылуы туралы
52
+ есептерін бекітеді. Үкіметтің республикалық бюджеттің атқарылуы туралы есебін
53
+ Парламенттің бекітпеуі Парламенттің Үкіметке сенімсіздік білдіргенін көрсетеді;
54
+ - source_sentence: Разрешается ли получать информацию по Конституции?
55
+ sentences:
56
+ - 2. Ешкімді азаптауға, оған зорлық-зомбылық жасауға, басқадай қатыгездік немесе
57
+ адамдық қадір-қасиетін қорлайтындай жәбір көрсетуге не жазалауға болмайды.
58
+ - Граждане Республики Казахстан обязаны сохранять природу и бережно относиться к
59
+ природным богатствам.
60
+ - 3. Генеральный Прокурор Республики в течение срока своих полномочий не может быть
61
+ арестован, подвергнут приводу, мерам административного взыскания, налагаемым в
62
+ судебном порядке, привлечен к уголовной ответственности без согласия Сената, кроме
63
+ случаев задержания на месте преступления или совершения тяжких преступлений. Срок
64
+ полномочий Генерального Прокурора пять лет.
65
+ pipeline_tag: sentence-similarity
66
+ library_name: sentence-transformers
67
+ metrics:
68
+ - cosine_accuracy@1
69
+ - cosine_accuracy@3
70
+ - cosine_accuracy@5
71
+ - cosine_accuracy@10
72
+ - cosine_precision@1
73
+ - cosine_precision@3
74
+ - cosine_precision@5
75
+ - cosine_precision@10
76
+ - cosine_recall@1
77
+ - cosine_recall@3
78
+ - cosine_recall@5
79
+ - cosine_recall@10
80
+ - cosine_ndcg@10
81
+ - cosine_mrr@10
82
+ - cosine_map@100
83
+ model-index:
84
+ - name: SentenceTransformer based on sentence-transformers/paraphrase-multilingual-mpnet-base-v2
85
+ results:
86
+ - task:
87
+ type: information-retrieval
88
+ name: Information Retrieval
89
+ dataset:
90
+ name: overall
91
+ type: overall
92
+ metrics:
93
+ - type: cosine_accuracy@1
94
+ value: 0.08726752503576538
95
+ name: Cosine Accuracy@1
96
+ - type: cosine_accuracy@3
97
+ value: 0.1459227467811159
98
+ name: Cosine Accuracy@3
99
+ - type: cosine_accuracy@5
100
+ value: 0.20028612303290416
101
+ name: Cosine Accuracy@5
102
+ - type: cosine_accuracy@10
103
+ value: 0.2761087267525036
104
+ name: Cosine Accuracy@10
105
+ - type: cosine_precision@1
106
+ value: 0.08726752503576538
107
+ name: Cosine Precision@1
108
+ - type: cosine_precision@3
109
+ value: 0.04864091559370529
110
+ name: Cosine Precision@3
111
+ - type: cosine_precision@5
112
+ value: 0.04005722460658083
113
+ name: Cosine Precision@5
114
+ - type: cosine_precision@10
115
+ value: 0.027610872675250364
116
+ name: Cosine Precision@10
117
+ - type: cosine_recall@1
118
+ value: 0.08726752503576538
119
+ name: Cosine Recall@1
120
+ - type: cosine_recall@3
121
+ value: 0.1459227467811159
122
+ name: Cosine Recall@3
123
+ - type: cosine_recall@5
124
+ value: 0.20028612303290416
125
+ name: Cosine Recall@5
126
+ - type: cosine_recall@10
127
+ value: 0.2761087267525036
128
+ name: Cosine Recall@10
129
+ - type: cosine_ndcg@10
130
+ value: 0.16702919619498105
131
+ name: Cosine Ndcg@10
132
+ - type: cosine_mrr@10
133
+ value: 0.13391579807888812
134
+ name: Cosine Mrr@10
135
+ - type: cosine_map@100
136
+ value: 0.14754280906508177
137
+ name: Cosine Map@100
138
+ ---
139
+
140
+ # SentenceTransformer based on sentence-transformers/paraphrase-multilingual-mpnet-base-v2
141
+
142
+ This is a [sentence-transformers](https://www.SBERT.net) model finetuned from [sentence-transformers/paraphrase-multilingual-mpnet-base-v2](https://huggingface.co/sentence-transformers/paraphrase-multilingual-mpnet-base-v2). It maps sentences & paragraphs to a 768-dimensional dense vector space and can be used for semantic textual similarity, semantic search, paraphrase mining, text classification, clustering, and more.
143
+
144
+ ## Model Details
145
+
146
+ ### Model Description
147
+ - **Model Type:** Sentence Transformer
148
+ - **Base model:** [sentence-transformers/paraphrase-multilingual-mpnet-base-v2](https://huggingface.co/sentence-transformers/paraphrase-multilingual-mpnet-base-v2) <!-- at revision 4328cf26390c98c5e3c738b4460a05b95f4911f5 -->
149
+ - **Maximum Sequence Length:** 128 tokens
150
+ - **Output Dimensionality:** 768 dimensions
151
+ - **Similarity Function:** Cosine Similarity
152
+ <!-- - **Training Dataset:** Unknown -->
153
+ <!-- - **Language:** Unknown -->
154
+ <!-- - **License:** Unknown -->
155
+
156
+ ### Model Sources
157
+
158
+ - **Documentation:** [Sentence Transformers Documentation](https://sbert.net)
159
+ - **Repository:** [Sentence Transformers on GitHub](https://github.com/huggingface/sentence-transformers)
160
+ - **Hugging Face:** [Sentence Transformers on Hugging Face](https://huggingface.co/models?library=sentence-transformers)
161
+
162
+ ### Full Model Architecture
163
+
164
+ ```
165
+ SentenceTransformer(
166
+ (0): Transformer({'max_seq_length': 128, 'do_lower_case': False, 'architecture': 'XLMRobertaModel'})
167
+ (1): Pooling({'word_embedding_dimension': 768, 'pooling_mode_cls_token': False, 'pooling_mode_mean_tokens': True, 'pooling_mode_max_tokens': False, 'pooling_mode_mean_sqrt_len_tokens': False, 'pooling_mode_weightedmean_tokens': False, 'pooling_mode_lasttoken': False, 'include_prompt': True})
168
+ )
169
+ ```
170
+
171
+ ## Usage
172
+
173
+ ### Direct Usage (Sentence Transformers)
174
+
175
+ First install the Sentence Transformers library:
176
+
177
+ ```bash
178
+ pip install -U sentence-transformers
179
+ ```
180
+
181
+ Then you can load this model and run inference.
182
+ ```python
183
+ from sentence_transformers import SentenceTransformer
184
+
185
+ # Download from the 🤗 Hub
186
+ model = SentenceTransformer("sentence_transformers_model_id")
187
+ # Run inference
188
+ sentences = [
189
+ 'Разрешается ли получать информацию по Конституции?',
190
+ 'Граждане Республики Казахстан обязаны сохранять природу и бережно относиться к природным богатствам.',
191
+ '2. Ешкімді азаптауға, оған зорлық-зомбылық жасауға, басқадай қатыгездік немесе адамдық қадір-қасиетін қорлайтындай жәбір көрсетуге не жазалауға болмайды.',
192
+ ]
193
+ embeddings = model.encode(sentences)
194
+ print(embeddings.shape)
195
+ # [3, 768]
196
+
197
+ # Get the similarity scores for the embeddings
198
+ similarities = model.similarity(embeddings, embeddings)
199
+ print(similarities)
200
+ # tensor([[1.0000, 0.3876, 0.0974],
201
+ # [0.3876, 1.0000, 0.2255],
202
+ # [0.0974, 0.2255, 1.0000]])
203
+ ```
204
+
205
+ <!--
206
+ ### Direct Usage (Transformers)
207
+
208
+ <details><summary>Click to see the direct usage in Transformers</summary>
209
+
210
+ </details>
211
+ -->
212
+
213
+ <!--
214
+ ### Downstream Usage (Sentence Transformers)
215
+
216
+ You can finetune this model on your own dataset.
217
+
218
+ <details><summary>Click to expand</summary>
219
+
220
+ </details>
221
+ -->
222
+
223
+ <!--
224
+ ### Out-of-Scope Use
225
+
226
+ *List how the model may foreseeably be misused and address what users ought not to do with the model.*
227
+ -->
228
+
229
+ ## Evaluation
230
+
231
+ ### Metrics
232
+
233
+ #### Information Retrieval
234
+
235
+ * Dataset: `overall`
236
+ * Evaluated with [<code>InformationRetrievalEvaluator</code>](https://sbert.net/docs/package_reference/sentence_transformer/evaluation.html#sentence_transformers.evaluation.InformationRetrievalEvaluator)
237
+
238
+ | Metric | Value |
239
+ |:--------------------|:----------|
240
+ | cosine_accuracy@1 | 0.0873 |
241
+ | cosine_accuracy@3 | 0.1459 |
242
+ | cosine_accuracy@5 | 0.2003 |
243
+ | cosine_accuracy@10 | 0.2761 |
244
+ | cosine_precision@1 | 0.0873 |
245
+ | cosine_precision@3 | 0.0486 |
246
+ | cosine_precision@5 | 0.0401 |
247
+ | cosine_precision@10 | 0.0276 |
248
+ | cosine_recall@1 | 0.0873 |
249
+ | cosine_recall@3 | 0.1459 |
250
+ | cosine_recall@5 | 0.2003 |
251
+ | cosine_recall@10 | 0.2761 |
252
+ | **cosine_ndcg@10** | **0.167** |
253
+ | cosine_mrr@10 | 0.1339 |
254
+ | cosine_map@100 | 0.1475 |
255
+
256
+ <!--
257
+ ## Bias, Risks and Limitations
258
+
259
+ *What are the known or foreseeable issues stemming from this model? You could also flag here known failure cases or weaknesses of the model.*
260
+ -->
261
+
262
+ <!--
263
+ ### Recommendations
264
+
265
+ *What are recommendations with respect to the foreseeable issues? For example, filtering explicit content.*
266
+ -->
267
+
268
+ ## Training Details
269
+
270
+ ### Training Dataset
271
+
272
+ #### Unnamed Dataset
273
+
274
+ * Size: 3,786 training samples
275
+ * Columns: <code>sentence_0</code> and <code>sentence_1</code>
276
+ * Approximate statistics based on the first 1000 samples:
277
+ | | sentence_0 | sentence_1 |
278
+ |:--------|:----------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------|
279
+ | type | string | string |
280
+ | details | <ul><li>min: 8 tokens</li><li>mean: 12.16 tokens</li><li>max: 22 tokens</li></ul> | <ul><li>min: 6 tokens</li><li>mean: 39.79 tokens</li><li>max: 128 tokens</li></ul> |
281
+ * Samples:
282
+ | sentence_0 | sentence_1 |
283
+ |:-----------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
284
+ | <code>10-баптың 3-тармағы нені білдіреді?</code> | <code>3. Республика азаматының басқа мемлекеттің азаматтығында болуы танылмайды.</code> |
285
+ | <code>мыналар бойынша құқықтар мен міндеттер қандай?</code> | <code>1. Мәжілістің ерекше қарауына мыналар жатады:</code> |
286
+ | <code>Разъясни, что значит исполнительными в Конституции.</code> | <code>Местное государственное управление осуществляется местными представительными и исполнительными органами, которые ответственны за состояние дел на соответствующей территории.</code> |
287
+ * Loss: [<code>MultipleNegativesRankingLoss</code>](https://sbert.net/docs/package_reference/sentence_transformer/losses.html#multiplenegativesrankingloss) with these parameters:
288
+ ```json
289
+ {
290
+ "scale": 20.0,
291
+ "similarity_fct": "cos_sim",
292
+ "gather_across_devices": false
293
+ }
294
+ ```
295
+
296
+ ### Training Hyperparameters
297
+ #### Non-Default Hyperparameters
298
+
299
+ - `eval_strategy`: steps
300
+ - `per_device_train_batch_size`: 32
301
+ - `per_device_eval_batch_size`: 32
302
+ - `num_train_epochs`: 2
303
+ - `multi_dataset_batch_sampler`: round_robin
304
+
305
+ #### All Hyperparameters
306
+ <details><summary>Click to expand</summary>
307
+
308
+ - `overwrite_output_dir`: False
309
+ - `do_predict`: False
310
+ - `eval_strategy`: steps
311
+ - `prediction_loss_only`: True
312
+ - `per_device_train_batch_size`: 32
313
+ - `per_device_eval_batch_size`: 32
314
+ - `per_gpu_train_batch_size`: None
315
+ - `per_gpu_eval_batch_size`: None
316
+ - `gradient_accumulation_steps`: 1
317
+ - `eval_accumulation_steps`: None
318
+ - `torch_empty_cache_steps`: None
319
+ - `learning_rate`: 5e-05
320
+ - `weight_decay`: 0.0
321
+ - `adam_beta1`: 0.9
322
+ - `adam_beta2`: 0.999
323
+ - `adam_epsilon`: 1e-08
324
+ - `max_grad_norm`: 1
325
+ - `num_train_epochs`: 2
326
+ - `max_steps`: -1
327
+ - `lr_scheduler_type`: linear
328
+ - `lr_scheduler_kwargs`: None
329
+ - `warmup_ratio`: 0.0
330
+ - `warmup_steps`: 0
331
+ - `log_level`: passive
332
+ - `log_level_replica`: warning
333
+ - `log_on_each_node`: True
334
+ - `logging_nan_inf_filter`: True
335
+ - `save_safetensors`: True
336
+ - `save_on_each_node`: False
337
+ - `save_only_model`: False
338
+ - `restore_callback_states_from_checkpoint`: False
339
+ - `no_cuda`: False
340
+ - `use_cpu`: False
341
+ - `use_mps_device`: False
342
+ - `seed`: 42
343
+ - `data_seed`: None
344
+ - `jit_mode_eval`: False
345
+ - `bf16`: False
346
+ - `fp16`: False
347
+ - `fp16_opt_level`: O1
348
+ - `half_precision_backend`: auto
349
+ - `bf16_full_eval`: False
350
+ - `fp16_full_eval`: False
351
+ - `tf32`: None
352
+ - `local_rank`: 0
353
+ - `ddp_backend`: None
354
+ - `tpu_num_cores`: None
355
+ - `tpu_metrics_debug`: False
356
+ - `debug`: []
357
+ - `dataloader_drop_last`: False
358
+ - `dataloader_num_workers`: 0
359
+ - `dataloader_prefetch_factor`: None
360
+ - `past_index`: -1
361
+ - `disable_tqdm`: False
362
+ - `remove_unused_columns`: True
363
+ - `label_names`: None
364
+ - `load_best_model_at_end`: False
365
+ - `ignore_data_skip`: False
366
+ - `fsdp`: []
367
+ - `fsdp_min_num_params`: 0
368
+ - `fsdp_config`: {'min_num_params': 0, 'xla': False, 'xla_fsdp_v2': False, 'xla_fsdp_grad_ckpt': False}
369
+ - `fsdp_transformer_layer_cls_to_wrap`: None
370
+ - `accelerator_config`: {'split_batches': False, 'dispatch_batches': None, 'even_batches': True, 'use_seedable_sampler': True, 'non_blocking': False, 'gradient_accumulation_kwargs': None}
371
+ - `parallelism_config`: None
372
+ - `deepspeed`: None
373
+ - `label_smoothing_factor`: 0.0
374
+ - `optim`: adamw_torch
375
+ - `optim_args`: None
376
+ - `adafactor`: False
377
+ - `group_by_length`: False
378
+ - `length_column_name`: length
379
+ - `project`: huggingface
380
+ - `trackio_space_id`: trackio
381
+ - `ddp_find_unused_parameters`: None
382
+ - `ddp_bucket_cap_mb`: None
383
+ - `ddp_broadcast_buffers`: False
384
+ - `dataloader_pin_memory`: True
385
+ - `dataloader_persistent_workers`: False
386
+ - `skip_memory_metrics`: True
387
+ - `use_legacy_prediction_loop`: False
388
+ - `push_to_hub`: False
389
+ - `resume_from_checkpoint`: None
390
+ - `hub_model_id`: None
391
+ - `hub_strategy`: every_save
392
+ - `hub_private_repo`: None
393
+ - `hub_always_push`: False
394
+ - `hub_revision`: None
395
+ - `gradient_checkpointing`: False
396
+ - `gradient_checkpointing_kwargs`: None
397
+ - `include_inputs_for_metrics`: False
398
+ - `include_for_metrics`: []
399
+ - `eval_do_concat_batches`: True
400
+ - `fp16_backend`: auto
401
+ - `push_to_hub_model_id`: None
402
+ - `push_to_hub_organization`: None
403
+ - `mp_parameters`:
404
+ - `auto_find_batch_size`: False
405
+ - `full_determinism`: False
406
+ - `torchdynamo`: None
407
+ - `ray_scope`: last
408
+ - `ddp_timeout`: 1800
409
+ - `torch_compile`: False
410
+ - `torch_compile_backend`: None
411
+ - `torch_compile_mode`: None
412
+ - `include_tokens_per_second`: False
413
+ - `include_num_input_tokens_seen`: no
414
+ - `neftune_noise_alpha`: None
415
+ - `optim_target_modules`: None
416
+ - `batch_eval_metrics`: False
417
+ - `eval_on_start`: False
418
+ - `use_liger_kernel`: False
419
+ - `liger_kernel_config`: None
420
+ - `eval_use_gather_object`: False
421
+ - `average_tokens_across_devices`: True
422
+ - `prompts`: None
423
+ - `batch_sampler`: batch_sampler
424
+ - `multi_dataset_batch_sampler`: round_robin
425
+ - `router_mapping`: {}
426
+ - `learning_rate_mapping`: {}
427
+
428
+ </details>
429
+
430
+ ### Training Logs
431
+ | Epoch | Step | overall_cosine_ndcg@10 |
432
+ |:-----:|:----:|:----------------------:|
433
+ | 1.0 | 119 | 0.1502 |
434
+ | 2.0 | 238 | 0.1670 |
435
+
436
+
437
+ ### Framework Versions
438
+ - Python: 3.11.0
439
+ - Sentence Transformers: 5.2.0
440
+ - Transformers: 4.57.5
441
+ - PyTorch: 2.5.1+cu121
442
+ - Accelerate: 1.12.0
443
+ - Datasets: 4.4.2
444
+ - Tokenizers: 0.22.2
445
+
446
+ ## Citation
447
+
448
+ ### BibTeX
449
+
450
+ #### Sentence Transformers
451
+ ```bibtex
452
+ @inproceedings{reimers-2019-sentence-bert,
453
+ title = "Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks",
454
+ author = "Reimers, Nils and Gurevych, Iryna",
455
+ booktitle = "Proceedings of the 2019 Conference on Empirical Methods in Natural Language Processing",
456
+ month = "11",
457
+ year = "2019",
458
+ publisher = "Association for Computational Linguistics",
459
+ url = "https://arxiv.org/abs/1908.10084",
460
+ }
461
+ ```
462
+
463
+ #### MultipleNegativesRankingLoss
464
+ ```bibtex
465
+ @misc{henderson2017efficient,
466
+ title={Efficient Natural Language Response Suggestion for Smart Reply},
467
+ author={Matthew Henderson and Rami Al-Rfou and Brian Strope and Yun-hsuan Sung and Laszlo Lukacs and Ruiqi Guo and Sanjiv Kumar and Balint Miklos and Ray Kurzweil},
468
+ year={2017},
469
+ eprint={1705.00652},
470
+ archivePrefix={arXiv},
471
+ primaryClass={cs.CL}
472
+ }
473
+ ```
474
+
475
+ <!--
476
+ ## Glossary
477
+
478
+ *Clearly define terms in order to be accessible across audiences.*
479
+ -->
480
+
481
+ <!--
482
+ ## Model Card Authors
483
+
484
+ *Lists the people who create the model card, providing recognition and accountability for the detailed work that goes into its construction.*
485
+ -->
486
+
487
+ <!--
488
+ ## Model Card Contact
489
+
490
+ *Provides a way for people who have updates to the Model Card, suggestions, or questions, to contact the Model Card authors.*
491
+ -->
artifacts/models/finetuned_mpnet/config.json ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "architectures": [
3
+ "XLMRobertaModel"
4
+ ],
5
+ "attention_probs_dropout_prob": 0.1,
6
+ "bos_token_id": 0,
7
+ "classifier_dropout": null,
8
+ "dtype": "float32",
9
+ "eos_token_id": 2,
10
+ "gradient_checkpointing": false,
11
+ "hidden_act": "gelu",
12
+ "hidden_dropout_prob": 0.1,
13
+ "hidden_size": 768,
14
+ "initializer_range": 0.02,
15
+ "intermediate_size": 3072,
16
+ "layer_norm_eps": 1e-05,
17
+ "max_position_embeddings": 514,
18
+ "model_type": "xlm-roberta",
19
+ "num_attention_heads": 12,
20
+ "num_hidden_layers": 12,
21
+ "output_past": true,
22
+ "pad_token_id": 1,
23
+ "position_embedding_type": "absolute",
24
+ "transformers_version": "4.57.5",
25
+ "type_vocab_size": 1,
26
+ "use_cache": true,
27
+ "vocab_size": 250002
28
+ }
artifacts/models/finetuned_mpnet/config_sentence_transformers.json ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "__version__": {
3
+ "sentence_transformers": "5.2.0",
4
+ "transformers": "4.57.5",
5
+ "pytorch": "2.5.1+cu121"
6
+ },
7
+ "model_type": "SentenceTransformer",
8
+ "prompts": {
9
+ "query": "",
10
+ "document": ""
11
+ },
12
+ "default_prompt_name": null,
13
+ "similarity_fn_name": "cosine"
14
+ }
artifacts/models/finetuned_mpnet/eval/Information-Retrieval_evaluation_overall_results.csv ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ epoch,steps,cosine-Accuracy@1,cosine-Accuracy@3,cosine-Accuracy@5,cosine-Accuracy@10,cosine-Precision@1,cosine-Recall@1,cosine-Precision@3,cosine-Recall@3,cosine-Precision@5,cosine-Recall@5,cosine-Precision@10,cosine-Recall@10,cosine-MRR@10,cosine-NDCG@10,cosine-MAP@100
2
+ 1.0,119,0.0815450643776824,0.13447782546494993,0.1688125894134478,0.2474964234620887,0.0815450643776824,0.0815450643776824,0.04482594182164997,0.13447782546494993,0.03376251788268956,0.1688125894134478,0.024749642346208876,0.2474964234620887,0.12093750709630546,0.1502270526236107,0.13292717270259066
3
+ 2.0,238,0.08726752503576538,0.1459227467811159,0.20028612303290416,0.2761087267525036,0.08726752503576538,0.08726752503576538,0.04864091559370529,0.1459227467811159,0.04005722460658083,0.20028612303290416,0.027610872675250364,0.2761087267525036,0.13391579807888812,0.16702919619498105,0.14754280906508177
artifacts/models/finetuned_mpnet/model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e532d918503434313ea6e134688501f890213461b59f2578b59bb0e78e6ef440
3
+ size 1112197096
artifacts/models/finetuned_mpnet/modules.json ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "idx": 0,
4
+ "name": "0",
5
+ "path": "",
6
+ "type": "sentence_transformers.models.Transformer"
7
+ },
8
+ {
9
+ "idx": 1,
10
+ "name": "1",
11
+ "path": "1_Pooling",
12
+ "type": "sentence_transformers.models.Pooling"
13
+ }
14
+ ]
artifacts/models/finetuned_mpnet/sentence_bert_config.json ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ {
2
+ "max_seq_length": 128,
3
+ "do_lower_case": false
4
+ }
artifacts/models/finetuned_mpnet/special_tokens_map.json ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "bos_token": {
3
+ "content": "<s>",
4
+ "lstrip": false,
5
+ "normalized": false,
6
+ "rstrip": false,
7
+ "single_word": false
8
+ },
9
+ "cls_token": {
10
+ "content": "<s>",
11
+ "lstrip": false,
12
+ "normalized": false,
13
+ "rstrip": false,
14
+ "single_word": false
15
+ },
16
+ "eos_token": {
17
+ "content": "</s>",
18
+ "lstrip": false,
19
+ "normalized": false,
20
+ "rstrip": false,
21
+ "single_word": false
22
+ },
23
+ "mask_token": {
24
+ "content": "<mask>",
25
+ "lstrip": true,
26
+ "normalized": false,
27
+ "rstrip": false,
28
+ "single_word": false
29
+ },
30
+ "pad_token": {
31
+ "content": "<pad>",
32
+ "lstrip": false,
33
+ "normalized": false,
34
+ "rstrip": false,
35
+ "single_word": false
36
+ },
37
+ "sep_token": {
38
+ "content": "</s>",
39
+ "lstrip": false,
40
+ "normalized": false,
41
+ "rstrip": false,
42
+ "single_word": false
43
+ },
44
+ "unk_token": {
45
+ "content": "<unk>",
46
+ "lstrip": false,
47
+ "normalized": false,
48
+ "rstrip": false,
49
+ "single_word": false
50
+ }
51
+ }
artifacts/models/finetuned_mpnet/tokenizer.json ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:cad551d5600a84242d0973327029452a1e3672ba6313c2a3c3d69c4310e12719
3
+ size 17082987
artifacts/models/finetuned_mpnet/tokenizer_config.json ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "added_tokens_decoder": {
3
+ "0": {
4
+ "content": "<s>",
5
+ "lstrip": false,
6
+ "normalized": false,
7
+ "rstrip": false,
8
+ "single_word": false,
9
+ "special": true
10
+ },
11
+ "1": {
12
+ "content": "<pad>",
13
+ "lstrip": false,
14
+ "normalized": false,
15
+ "rstrip": false,
16
+ "single_word": false,
17
+ "special": true
18
+ },
19
+ "2": {
20
+ "content": "</s>",
21
+ "lstrip": false,
22
+ "normalized": false,
23
+ "rstrip": false,
24
+ "single_word": false,
25
+ "special": true
26
+ },
27
+ "3": {
28
+ "content": "<unk>",
29
+ "lstrip": false,
30
+ "normalized": false,
31
+ "rstrip": false,
32
+ "single_word": false,
33
+ "special": true
34
+ },
35
+ "250001": {
36
+ "content": "<mask>",
37
+ "lstrip": true,
38
+ "normalized": false,
39
+ "rstrip": false,
40
+ "single_word": false,
41
+ "special": true
42
+ }
43
+ },
44
+ "bos_token": "<s>",
45
+ "clean_up_tokenization_spaces": false,
46
+ "cls_token": "<s>",
47
+ "eos_token": "</s>",
48
+ "extra_special_tokens": {},
49
+ "mask_token": "<mask>",
50
+ "max_length": 128,
51
+ "model_max_length": 128,
52
+ "pad_to_multiple_of": null,
53
+ "pad_token": "<pad>",
54
+ "pad_token_type_id": 0,
55
+ "padding_side": "right",
56
+ "sep_token": "</s>",
57
+ "stride": 0,
58
+ "tokenizer_class": "XLMRobertaTokenizer",
59
+ "truncation_side": "right",
60
+ "truncation_strategy": "longest_first",
61
+ "unk_token": "<unk>"
62
+ }
artifacts/reports/data_validation.json ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "clauses_ru": 477,
3
+ "clauses_kz": 477,
4
+ "train_pairs": 3786,
5
+ "test_pairs": 699,
6
+ "leakage_ids_count": 0,
7
+ "missing_train_positive_ids_count": 0,
8
+ "missing_test_positive_ids_count": 0,
9
+ "leakage_sample": [],
10
+ "missing_train_sample": [],
11
+ "missing_test_sample": []
12
+ }
artifacts/reports/eval_finetuned.json ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "artifacts\\models\\finetuned_mpnet",
3
+ "index_alias": "finetuned",
4
+ "test_path": "data/legal_assistant_test.jsonl",
5
+ "top_k": 10,
6
+ "by_lang": {
7
+ "ru": {
8
+ "count": 350,
9
+ "recall@1": 0.10571428571428572,
10
+ "recall@3": 0.22285714285714286,
11
+ "recall@5": 0.26285714285714284,
12
+ "recall@10": 0.37714285714285717,
13
+ "mrr@10": 0.18037074829931973,
14
+ "ndcg@10": 0.22650353102998314
15
+ },
16
+ "kz": {
17
+ "count": 349,
18
+ "recall@1": 0.09455587392550144,
19
+ "recall@3": 0.17478510028653296,
20
+ "recall@5": 0.24068767908309455,
21
+ "recall@10": 0.332378223495702,
22
+ "mrr@10": 0.15567380724973848,
23
+ "ndcg@10": 0.197008647971075
24
+ }
25
+ },
26
+ "overall": {
27
+ "count": 699,
28
+ "recall@1": 0.10014306151645208,
29
+ "recall@3": 0.1988555078683834,
30
+ "recall@5": 0.25178826895565093,
31
+ "recall@10": 0.3547925608011445,
32
+ "mrr@10": 0.16803994368372052,
33
+ "ndcg@10": 0.211777187414019
34
+ }
35
+ }
artifacts/reports/eval_labse.json ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "sentence-transformers/LaBSE",
3
+ "index_alias": "labse",
4
+ "test_path": "data/legal_assistant_test.jsonl",
5
+ "top_k": 10,
6
+ "by_lang": {
7
+ "ru": {
8
+ "count": 350,
9
+ "recall@1": 0.02,
10
+ "recall@3": 0.037142857142857144,
11
+ "recall@5": 0.04857142857142857,
12
+ "recall@10": 0.08,
13
+ "mrr@10": 0.03408956916099773,
14
+ "ndcg@10": 0.04460771269739186
15
+ },
16
+ "kz": {
17
+ "count": 349,
18
+ "recall@1": 0.02005730659025788,
19
+ "recall@3": 0.04011461318051576,
20
+ "recall@5": 0.07163323782234957,
21
+ "recall@10": 0.10888252148997135,
22
+ "mrr@10": 0.04037272024378041,
23
+ "ndcg@10": 0.056200182864673286
24
+ }
25
+ },
26
+ "overall": {
27
+ "count": 699,
28
+ "recall@1": 0.020028612303290415,
29
+ "recall@3": 0.03862660944206009,
30
+ "recall@5": 0.060085836909871244,
31
+ "recall@10": 0.0944206008583691,
32
+ "mrr@10": 0.037226650316779075,
33
+ "ndcg@10": 0.050395655599224785
34
+ }
35
+ }
artifacts/reports/eval_mpnet_base.json ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "paraphrase-multilingual-mpnet-base-v2",
3
+ "index_alias": "mpnet_base",
4
+ "test_path": "data/legal_assistant_test.jsonl",
5
+ "top_k": 10,
6
+ "by_lang": {
7
+ "ru": {
8
+ "count": 350,
9
+ "recall@1": 0.02,
10
+ "recall@3": 0.045714285714285714,
11
+ "recall@5": 0.06285714285714286,
12
+ "recall@10": 0.07428571428571429,
13
+ "mrr@10": 0.036646258503401356,
14
+ "ndcg@10": 0.04574054788125284
15
+ },
16
+ "kz": {
17
+ "count": 349,
18
+ "recall@1": 0.025787965616045846,
19
+ "recall@3": 0.034383954154727794,
20
+ "recall@5": 0.05730659025787966,
21
+ "recall@10": 0.09455587392550144,
22
+ "mrr@10": 0.03985309501068813,
23
+ "ndcg@10": 0.05243901062215754
24
+ }
25
+ },
26
+ "overall": {
27
+ "count": 699,
28
+ "recall@1": 0.022889842632331903,
29
+ "recall@3": 0.04005722460658083,
30
+ "recall@5": 0.060085836909871244,
31
+ "recall@10": 0.0844062947067239,
32
+ "mrr@10": 0.038247382882576016,
33
+ "ndcg@10": 0.049084987790517134
34
+ }
35
+ }
artifacts/reports/figures/rank_metrics_kz.png ADDED
artifacts/reports/figures/rank_metrics_overall.png ADDED
artifacts/reports/figures/rank_metrics_ru.png ADDED
artifacts/reports/figures/recall_curve_kz.png ADDED
artifacts/reports/figures/recall_curve_overall.png ADDED
artifacts/reports/figures/recall_curve_ru.png ADDED
artifacts/reports/figures/recall_kz.png ADDED
artifacts/reports/figures/recall_overall.png ADDED
artifacts/reports/figures/recall_ru.png ADDED
artifacts/reports/figures/relative_improvement_kz.png ADDED
artifacts/reports/figures/relative_improvement_overall.png ADDED
artifacts/reports/figures/relative_improvement_ru.png ADDED
artifacts/reports/figures_summary.json ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "loaded_reports": [
3
+ "eval_finetuned.json",
4
+ "eval_labse.json",
5
+ "eval_mpnet_base.json"
6
+ ],
7
+ "figures": [
8
+ "rank_metrics_kz.png",
9
+ "rank_metrics_overall.png",
10
+ "rank_metrics_ru.png",
11
+ "recall_curve_kz.png",
12
+ "recall_curve_overall.png",
13
+ "recall_curve_ru.png",
14
+ "recall_kz.png",
15
+ "recall_overall.png",
16
+ "recall_ru.png",
17
+ "relative_improvement_kz.png",
18
+ "relative_improvement_overall.png",
19
+ "relative_improvement_ru.png"
20
+ ]
21
+ }
check_base_model.py ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ from sentence_transformers import SentenceTransformer
2
+
3
+ m = SentenceTransformer("paraphrase-multilingual-mpnet-base-v2")
4
+ print("model_type:", m[0].auto_model.config.model_type)
5
+ print("class:", m[0].auto_model.__class__.__name__)
6
+ print("name_or_path:", m[0].auto_model.name_or_path)
check_device.py ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ from sentence_transformers import SentenceTransformer
3
+
4
+ def main():
5
+ cuda_available = torch.cuda.is_available()
6
+ print("torch.cuda.is_available:", cuda_available)
7
+
8
+ if cuda_available:
9
+ print("cuda device count:", torch.cuda.device_count())
10
+ for i in range(torch.cuda.device_count()):
11
+ print(f"cuda:{i} name:", torch.cuda.get_device_name(i))
12
+ print("torch version:", torch.__version__)
13
+ print("cuda version:", torch.version.cuda)
14
+ device = "cuda"
15
+ else:
16
+ device = "cpu"
17
+
18
+ model = SentenceTransformer("paraphrase-multilingual-mpnet-base-v2", device=device)
19
+ print("sentence-transformers device:", model.device)
20
+
21
+ x = model.encode(["тест"], convert_to_numpy=True)
22
+ print("encode ok, shape:", x.shape)
23
+
24
+ if __name__ == "__main__":
25
+ main()