63 lines
3.7 KiB
Python
63 lines
3.7 KiB
Python
#!/usr/bin/env python3
|
||
"""exp14 Ступень II — слепой пакет владельцу: 3 ФИНАЛИСТА на 3 главах (гл.19/17/18), под
|
||
нейтральными метками, ключ ОТДЕЛЬНО. Копирайт: книжный текст ВНЕ git (exp14/monitor/).
|
||
|
||
Финалисты: Fin-A=P0 (текущий прод baseline) · Fin-B=A-2pass (лучший near-term, дешёвый) ·
|
||
Fin-C=F-disc (фронтир gpt-5.4, дискурс). Per-глава seeded-shuffle меток (V1..V3 — РАЗНАЯ
|
||
модель в каждой главе; ключ владелец не открывает до ранжирования).
|
||
"""
|
||
from __future__ import annotations
|
||
import json, random
|
||
from pathlib import Path
|
||
import exp14_common as C
|
||
|
||
ARMS = C.DIAG / "arms"
|
||
MAT = json.load(open(C.DIAG / "material.json"))
|
||
OUT = C.DIAG / "monitor"; OUT.mkdir(exist_ok=True)
|
||
FINALISTS = {"Fin-A": "P0", "Fin-B": "A-2pass", "Fin-C": "F-disc"}
|
||
CHAPTERS = [19, 17, 18]
|
||
SALT = "exp14-monitor-blind-v1"
|
||
|
||
|
||
def chapter_text(arm: str, ch: int) -> str:
|
||
chunks = sorted(u["chunk_idx"] for u in MAT["stage2"][str(ch)])
|
||
parts = []
|
||
for ck in chunks:
|
||
p = ARMS / arm / f"{ch}.{ck}.txt"
|
||
parts.append(p.read_text(encoding="utf-8") if p.exists() else f"[[MISSING {arm} {ch}.{ck}]]")
|
||
return "\n\n".join(parts)
|
||
|
||
|
||
def main():
|
||
missing = [(f, a, ch) for f, a in FINALISTS.items() for ch in CHAPTERS
|
||
for ck in sorted(u["chunk_idx"] for u in MAT["stage2"][str(ch)])
|
||
if not (ARMS / a / f"{ch}.{ck}.txt").exists()]
|
||
if missing:
|
||
print("⚠ отсутствуют выходы (арм ещё не готов):", missing[:10]); return
|
||
|
||
key = {}
|
||
md = ["# Слепое чтение — exp14 Ступень II (3 варианта × 3 главы)\n",
|
||
"Прочти каждую главу в ТРЁХ вариантах (V1/V2/V3 — порядок в каждой главе РАЗНЫЙ). "
|
||
"Для каждой главы: (1) какой вариант читается лучше как русская проза «лучше фана» — ранжируй V1>V2>V3; "
|
||
"(2) закрыты ли обе претензии (абзацы/конвенции; понимание связей/смысла); (3) любые смысловые ляпы. "
|
||
"Ключ (какая модель под какой меткой) — в отдельном файле `_КЛЮЧ.json`, открой ПОСЛЕ.\n",
|
||
"D-плотность диалога: гл.19=0.061 (нарратив), гл.17=0.246 (смешанная), гл.18=0.440 (диалог).\n"]
|
||
for ch in CHAPTERS:
|
||
order = list(FINALISTS); random.Random(f"{SALT}-{ch}").shuffle(order)
|
||
labels = {f"V{i+1}": order[i] for i in range(len(order))}
|
||
key[str(ch)] = {lab: {"finalist": fin, "arm": FINALISTS[fin]} for lab, fin in labels.items()}
|
||
md.append(f"\n\n---\n\n## Глава {ch}\n")
|
||
for i in range(len(order)):
|
||
lab = f"V{i+1}"; fin = labels[lab]
|
||
md.append(f"\n### {lab}\n\n{chapter_text(FINALISTS[fin], ch)}\n")
|
||
(OUT / "monitor14.md").write_text("\n".join(md), encoding="utf-8")
|
||
(OUT / "_КЛЮЧ.json").write_text(json.dumps(
|
||
{"salt": SALT, "finalists": FINALISTS, "per_chapter": key}, ensure_ascii=False, indent=1), encoding="utf-8")
|
||
print(f"→ {OUT/'monitor14.md'} (3 главы × 3 слепых варианта)")
|
||
print(f"→ {OUT/'_КЛЮЧ.json'} (НЕ открывать до ранжирования)")
|
||
for ch in CHAPTERS:
|
||
print(f" гл.{ch}: " + ", ".join(f"{lab}={key[str(ch)][lab]['finalist']}" for lab in ("V1","V2","V3")))
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main()
|