From f66518a860e63a90ab737992afbf1bf78ef8ceca Mon Sep 17 00:00:00 2001 From: heaven Date: Mon, 3 Aug 2026 02:02:26 +0300 Subject: [PATCH] Pin the polygon environment: one commented requirements file with the heavy embedding extra split out, interpreter version declared, README rule five corrected --- eval/.python-version | 1 + eval/README.md | 2 +- eval/requirements-embed.txt | 29 +++++++++++++++++ eval/requirements.txt | 65 +++++++++++++++++++++++++++++++++++++ 4 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 eval/.python-version create mode 100644 eval/requirements-embed.txt create mode 100644 eval/requirements.txt diff --git a/eval/.python-version b/eval/.python-version new file mode 100644 index 00000000..0104088a --- /dev/null +++ b/eval/.python-version @@ -0,0 +1 @@ +3.14.4 diff --git a/eval/README.md b/eval/README.md index 2459b13c..a4bc94cc 100644 --- a/eval/README.md +++ b/eval/README.md @@ -57,7 +57,7 @@ 2. **Претрейн-контаминация:** вся классика (Лу Синь/Акутагава/Уэллс) в претрейне моделей — C0 частично выдаёт канон, эхо систематично (deepseek 13/24 zh-чанков). Выводы на классике = предварительные; решающие замеры — на вебновелл-корпусе владельца. 3. **Тест ставится, только если его исход может перевернуть решение** и не установлен литературой (урок снятого exp05). 4. **LLM-судьи:** ≤2–3 семейства, 11+ повторов со свапом позиций, Bradley-Terry/медиана, судья не судит выходы своего семейства (D13.3); κ против человеческого IAA, не «средняя корреляция». -5. Env: `eval/.venv` (torch-cpu, sentence-transformers, openai, dotenv, pymorphy3); ключи скрипты читают из `eval/.env` сами. Стенд: GTX 1070 8GB — модель полигона `qwen3-abliterated:30b-a3b` в ollama не выселять без нужды; **localhost из-под прокси даёт 403** — для локальных вызовов no-proxy. +5. **Env — источник истины `eval/requirements.txt`** (у каждой строки комментарий «зачем и где»; интерпретатор — `.python-version`). Установка: `python3 -m venv .venv && .venv/bin/pip install -r requirements.txt`. Эмбеддинг-бенч (`retrieval_bench.py`) тянет ~2.5 ГБ ОТДЕЛЬНО — `requirements-embed.txt` (версии там намеренно не проставлены). ⚠ Замок снят 03.08.2026 с живого стенда Ubuntu 26.04 / CPython 3.14.4 и **не является стендом закрытых exp12–16/promptlang** (те шли на Ubuntu 24 / ~3.12, версии не сохранились) — перепрогон на нём это НОВЫЙ замер, не репродукция. Ключи скрипты читают из `eval/.env` сами. Не офлайн: `tokenizers` ждёт файлы в `eval/tokenizers/` (gitignore, на чистой машине их нет), `tiktoken.get_encoding` качает ~4 МБ BPE при первом вызове. Стенд: GTX 1070 8GB — модель полигона `qwen3-abliterated:30b-a3b` в ollama не выселять без нужды; **localhost из-под прокси даёт 403** — для локальных вызовов no-proxy. 6. `data/` в .gitignore (коммитится только код) — критичные результаты дублируй цифрами в `docs/experiments/`. 7. **Экстракция прод-выходов — ТОЛЬКО через `tmctl export` (D39.5, инвариант №8 backend/README):** сырое чтение чекпоинтов store (records.json-стиль) отдаёт НЕнормализованные байты (без export-contract слоя) и молча-неполную книгу (без manifest-join/drift-гарда). `--plaintext` для глаз, дефолтный JSON для скриптов. Прежний путь `final_hash→response_text` — только для форензики сырья, не для оценки качества. 8. **Аномалия провайдера ≠ повод гадать:** странный отказ (интермиттентный 404/5xx, новый `finish_reason`, молча игнорируемые параметры) → сначала официальная дока вендора (deprecations/changelog/status) + свежий /models живьём, потом диагноз; в отчёт оба слоя — наблюдение И вендор-факт с датой/URL. Урок: 404-флейки gemini-2.5-flash оказались предвестником EOL всей 2.5-серии 16.10.2026 (research/15 → фактчек 10.07; правило — шапка `00-provider-quirks.md`). diff --git a/eval/requirements-embed.txt b/eval/requirements-embed.txt new file mode 100644 index 00000000..ed9d0d34 --- /dev/null +++ b/eval/requirements-embed.txt @@ -0,0 +1,29 @@ +# eval/ — тяжёлый экстра: эмбеддинг-бенч памяти. Ставится ПОВЕРХ requirements.txt: +# .venv/bin/pip install -r requirements-embed.txt +# +# Вынесено отдельно по одной причине — это ~2.5 ГБ ради ОДНОГО скрипта. Единственный +# потребитель — retrieval_bench.py, и все три импорта у него ФУНКЦИОНАЛЬНЫЕ, а не +# модульные, поэтому без этого файла падает ровно он и ровно на входе в эти функции: +# retrieval_bench.py:93 from sklearn.metrics import roc_auc_score (в threshold_analysis) +# retrieval_bench.py:153 from sentence_transformers import ... (в run_embed_model) +# retrieval_bench.py:223 from rank_bm25 import BM25Okapi (в run_bm25) +# Модульный там только `import numpy` (:34) — он уже в базовом наборе. +# +# torch НИГДЕ не импортируется напрямую (проверено обходом AST по всем 158 файлам) — +# приходит транзитивно через sentence-transformers, поэтому в базовом файле ему не место. +# +# ⚠ ВЕРСИИ НЕ ПРОСТАВЛЕНЫ НАМЕРЕННО: этих пакетов в стенде нет +# (import sklearn / sentence_transformers / rank_bm25 / torch → ModuleNotFoundError), +# а версия из памяти — выдумка. Пины проставить с ПЕРВОЙ реальной установки. +# +# ⚠ CPU-сборка torch ставится с --extra-index-url https://download.pytorch.org/whl/cpu +# — решать при первом реальном прогоне, не заранее. +# +# Под CPython 3.14 колёса есть у всех (сверено на PyPI 02.08.2026: torch +# cp314-manylinux_2_28_x86_64, scikit-learn cp314, sentence-transformers и rank_bm25 — +# чистый Python), так что 3.14 сам по себе не блокер. + +sentence-transformers +torch +scikit-learn +rank_bm25 diff --git a/eval/requirements.txt b/eval/requirements.txt new file mode 100644 index 00000000..17ea8b99 --- /dev/null +++ b/eval/requirements.txt @@ -0,0 +1,65 @@ +# eval/ — зависимости полигона. +# +# Установка: python3 -m venv .venv && .venv/bin/pip install -r requirements.txt +# Интерпретатор: см. .python-version (3.14.4). +# Эмбеддинг-бенч (retrieval_bench.py) тянет ~2.5 ГБ отдельно — requirements-embed.txt. +# +# СТЕНД 03.08.2026: Ubuntu 26.04 / CPython 3.14.4. Каждая версия сверена ИСПОЛНЕНИЕМ +# против реальных call-site'ов (compat-прогон 03.08), а не взята из памяти. +# +# ⚠ ЭТО НЕ СТЕНД ЗАКРЫТЫХ exp12–16 / promptlang / rerun2. Те шли 12.07–01.08 на +# Ubuntu 24 / CPython ~3.12 с НЕИЗВЕСТНЫМИ версиями: манифеста тогда не было, .venv и +# data/ в .gitignore. Единственный уцелевший след — `openai 2.44.0` (комментарий +# rerun2_judge/judge.py:33, 24.07). Следствие: перепрогон на этих пинах — НОВЫЙ замер, +# а не репродукция ратифицированных вердиктов (D30/D32/D37/D38/D39.22/D39.61). +# Цифры живут в docs/experiments/, не здесь. +# +# Здесь только то, что импортируется КОДОМ напрямую. Часть строк пришла бы и +# транзитивно (PyYAML через huggingface-hub, regex/requests через tiktoken, numpy через +# scipy) — объявлены ЯВНО намеренно: код импортирует их сам, и смена чужого дерева +# зависимостей не должна их унести. + +# --- вызовы моделей ------------------------------------------------------------- +# 12 файлов, все через `from openai import OpenAI` (rerun2_judge/judge.py:33, +# exp15/exp15_llm.py:22). Проверено: extra_body кладёт квирк-ключи ПЛОСКО в тело +# (00-provider-quirks.md на этом стоит), max_tokens и max_completion_tokens оба живы +# и SDK их не переписывает, DeepSeek-овый `prefix: true` в сообщении не срезается. +openai==2.52.0 + +# 14 файлов читают eval/.env сами. +python-dotenv==1.2.2 + +# --- данные и разбор ------------------------------------------------------------ +# 21 файл. Везде safe_load (`yaml.load(` — 0 вхождений), поэтому слом PyYAML 6.x не кусает. +# Байт-стабильность дампа сида держится на dump(allow_unicode, sort_keys, width) — +# exp15/gender_transport.py:37, exp14b/exp14b_reseed_promote.py:25. +PyYAML==6.0.3 + +# 8 файлов. НЕСУЩЕЕ: классы письменностей \p{Han}/\p{Cyrillic}, которые stdlib re +# не компилирует вовсе — это паритет с Go unicode.Han/Hiragana (exp15/mem_select.py:32). +regex==2026.7.19 + +# 6 файлов: русская морфология (pilot/declmetric.py:35, pkg7/rubric_probe.py:83). +# Тянет pymorphy3-dicts-ru (словарь) и setuptools (требование самого pymorphy3 на py>=3.12). +pymorphy3==2.0.6 + +# --- счёт и статистика ---------------------------------------------------------- +# 6 файлов (retrieval_bench.py:34, exp15/fertility_calib.py:15). Все 18 используемых +# атрибутов живы в 2.x; ни одного удалённого имени (np.float_/np.NaN/np.trapz/…) в коде нет. +numpy==2.5.1 + +# 3 файла — только пере-анализы exp15 (stats.t, ttest_1samp). +scipy==1.18.0 + +# --- токенизация ---------------------------------------------------------------- +# token_calc.py:35, exp14/exp14_common.py:141 — ТОЛЬКО Tokenizer.from_file +# (from_pretrained: 0 вхождений, сети не будет). Тянет huggingface-hub/hf-xet/fsspec. +# ⚠ сами файлы токенизаторов в eval/tokenizers/ (gitignore) — на чистой машине их нет. +tokenizers==0.23.1 + +# token_calc.py:29. ⚠ get_encoding при первом вызове КАЧАЕТ ~4 МБ BPE-таблицы +# с openaipublic.blob.core.windows.net — $0 и не провайдер, но офлайн не отработает. +tiktoken==0.13.0 + +# exp15/preflight_models.py:54 — единственный call-site, живой фактчек /models. +requests==2.34.2