erabi 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. erabi-0.1.0/LICENSE +21 -0
  2. erabi-0.1.0/PKG-INFO +103 -0
  3. erabi-0.1.0/README.md +76 -0
  4. erabi-0.1.0/pyproject.toml +47 -0
  5. erabi-0.1.0/setup.cfg +4 -0
  6. erabi-0.1.0/src/erabi/__init__.py +3 -0
  7. erabi-0.1.0/src/erabi/__main__.py +440 -0
  8. erabi-0.1.0/src/erabi/api.py +178 -0
  9. erabi-0.1.0/src/erabi/cache.py +246 -0
  10. erabi-0.1.0/src/erabi/calibrate.py +309 -0
  11. erabi-0.1.0/src/erabi/data/calibration/builder.py +122 -0
  12. erabi-0.1.0/src/erabi/data/calibration/generator.py +243 -0
  13. erabi-0.1.0/src/erabi/data/general_choice/__init__.py +1 -0
  14. erabi-0.1.0/src/erabi/data/general_choice/builder.py +180 -0
  15. erabi-0.1.0/src/erabi/data/general_choice/generator.py +332 -0
  16. erabi-0.1.0/src/erabi/data/general_choice/validator.py +121 -0
  17. erabi-0.1.0/src/erabi/data/operators/__init__.py +1 -0
  18. erabi-0.1.0/src/erabi/data/operators/builder.py +146 -0
  19. erabi-0.1.0/src/erabi/data/operators/generator.py +824 -0
  20. erabi-0.1.0/src/erabi/data/operators/validator.py +255 -0
  21. erabi-0.1.0/src/erabi/data/robustness/__init__.py +1 -0
  22. erabi-0.1.0/src/erabi/data/robustness/builder.py +140 -0
  23. erabi-0.1.0/src/erabi/data/robustness/generator.py +280 -0
  24. erabi-0.1.0/src/erabi/data/robustness/validator.py +136 -0
  25. erabi-0.1.0/src/erabi/data/sealed_acceptance/builder.py +296 -0
  26. erabi-0.1.0/src/erabi/evaluate.py +238 -0
  27. erabi-0.1.0/src/erabi/inference.py +149 -0
  28. erabi-0.1.0/src/erabi/onnx_engine.py +203 -0
  29. erabi-0.1.0/src/erabi/schema.py +209 -0
  30. erabi-0.1.0/src/erabi/semantic_validator.py +418 -0
  31. erabi-0.1.0/src/erabi/serve.py +57 -0
  32. erabi-0.1.0/src/erabi/train.py +571 -0
  33. erabi-0.1.0/src/erabi.egg-info/PKG-INFO +103 -0
  34. erabi-0.1.0/src/erabi.egg-info/SOURCES.txt +55 -0
  35. erabi-0.1.0/src/erabi.egg-info/dependency_links.txt +1 -0
  36. erabi-0.1.0/src/erabi.egg-info/entry_points.txt +2 -0
  37. erabi-0.1.0/src/erabi.egg-info/requires.txt +18 -0
  38. erabi-0.1.0/src/erabi.egg-info/top_level.txt +1 -0
  39. erabi-0.1.0/tests/test_api.py +125 -0
  40. erabi-0.1.0/tests/test_calibration.py +113 -0
  41. erabi-0.1.0/tests/test_contracts.py +186 -0
  42. erabi-0.1.0/tests/test_m3_3.py +136 -0
  43. erabi-0.1.0/tests/test_m3_7_handoff.py +295 -0
  44. erabi-0.1.0/tests/test_m4_3_1_semantic_repair.py +171 -0
  45. erabi-0.1.0/tests/test_m4_4_1_retention.py +92 -0
  46. erabi-0.1.0/tests/test_m4_4_retention.py +106 -0
  47. erabi-0.1.0/tests/test_m6_operator.py +60 -0
  48. erabi-0.1.0/tests/test_m7_robustness.py +101 -0
  49. erabi-0.1.0/tests/test_m8_general_choice.py +59 -0
  50. erabi-0.1.0/tests/test_onnx_engine.py +109 -0
  51. erabi-0.1.0/tests/test_practical_v1.py +32 -0
  52. erabi-0.1.0/tests/test_rc1_api.py +97 -0
  53. erabi-0.1.0/tests/test_rc3_1_logic_data.py +112 -0
  54. erabi-0.1.0/tests/test_repair.py +132 -0
  55. erabi-0.1.0/tests/test_scores.py +92 -0
  56. erabi-0.1.0/tests/test_train.py +145 -0
  57. erabi-0.1.0/tests/test_train_rc3_1.py +186 -0
erabi-0.1.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 sugarkwork
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
erabi-0.1.0/PKG-INFO ADDED
@@ -0,0 +1,103 @@
1
+ Metadata-Version: 2.4
2
+ Name: erabi
3
+ Version: 0.1.0
4
+ Summary: ERABI - Local probability distribution engine for choices
5
+ Author: ERABI Project
6
+ License-Expression: MIT
7
+ Project-URL: Repository, https://github.com/sugarkwork/erabi
8
+ Project-URL: Model, https://huggingface.co/sugarknight/erabi-practical-v1-experimental
9
+ Requires-Python: >=3.11
10
+ Description-Content-Type: text/markdown
11
+ License-File: LICENSE
12
+ Requires-Dist: torch
13
+ Requires-Dist: transformers>=4.40.0
14
+ Requires-Dist: gliclass>=0.1.20
15
+ Requires-Dist: pydantic>=2.0.0
16
+ Provides-Extra: api
17
+ Requires-Dist: fastapi>=0.110.0; extra == "api"
18
+ Requires-Dist: uvicorn>=0.28.0; extra == "api"
19
+ Provides-Extra: calibrate
20
+ Requires-Dist: scipy>=1.12.0; extra == "calibrate"
21
+ Provides-Extra: data-gen
22
+ Requires-Dist: openai<3,>=2.54.0; extra == "data-gen"
23
+ Provides-Extra: dev
24
+ Requires-Dist: pytest>=7.0.0; extra == "dev"
25
+ Requires-Dist: httpx>=0.27.0; extra == "dev"
26
+ Dynamic: license-file
27
+
28
+ # ERABI(えらび)
29
+
30
+ ERABIは、`context`(状況)、`question`(判断基準)、2~16個の`choices`(候補)から、全候補の確率分布を返すローカル判断エンジンです。Jevの公式版や再現版ではありません。回答は常に確認対象(`review`)であり、最大確率は正解の保証ではありません。
31
+
32
+ ## インストールと最初の推論
33
+
34
+ Python 3.11以上が必要です。PyTorchのGPU版を使う場合は、先に利用環境に合うPyTorchをインストールしてください。
35
+
36
+ ```bash
37
+ python -m pip install erabi
38
+ erabi predict --request '{"schema_version":"1","context":"7冊のノートと2個の消しゴムを買った。","question":"全部で何個?","choices":[{"id":"nine","text":"9個"},{"id":"ten","text":"10個"}]}'
39
+ ```
40
+
41
+ PowerShellではJSONの引用規則が異なるため、リポジトリを取得して `erabi predict --request examples/request.json` とするのが簡単です。初回は約1.75GBのモデルダウンロードが必要で、以降はHugging Faceのローカルキャッシュを再利用します。ネットワークが使えない場合は、事前取得したモデルのローカルディレクトリを`--model-id`で指定してください。
42
+
43
+ 無指定の既定値は公開済みの[ERABI Practical V1実験モデル](https://huggingface.co/sugarknight/erabi-practical-v1-experimental)です。正式合格モデルではなく、未レビュー合成データで追加学習した未校正weightsです。別のモデルを使う場合はローカルパスまたはHugging FaceのモデルIDを指定できます。
44
+
45
+ ```bash
46
+ erabi predict --request examples/request.json --model-id path/to/checkpoint
47
+ # または、利用するモデルIDを既定値として設定
48
+ export ERABI_MODEL_ID=owner/model-name
49
+ erabi predict --request examples/request.json
50
+ ```
51
+
52
+ `erabi doctor` はCPU/CUDAと空き容量を表示します。`erabi evaluate --input examples/smoke_cases.jsonl --output-dir runs/smoke` は評価ファイルを処理します。ローカルHTTP APIはオプション依存を入れて `python -m erabi.serve --model-id path/to/checkpoint` で起動します(localhost限定)。
53
+
54
+ ## 入出力とデータセット形式
55
+
56
+ 推論入力はUTF-8 JSONです。候補の`id`と順序を保ち、全候補のlogitsに対して1回だけSoftmaxを適用します。入力全体が512トークンを超える場合は無言で切り詰めずにエラーにします。
57
+
58
+ ```json
59
+ {
60
+ "schema_version": "1",
61
+ "context": "文房具店でノートを7冊、消しゴムを2個買った。",
62
+ "question": "全部で何個買った?",
63
+ "choices": [
64
+ {"id": "a", "text": "9個"},
65
+ {"id": "b", "text": "10個"}
66
+ ]
67
+ }
68
+ ```
69
+
70
+ 出力の`choices`は各候補の`id`と`probability`を入力順で返し、`best_candidate_id`は最大logitの候補を示します。`decision.status`は既定で`review`、未校正の`calibration.status`は`none`です。例は[examples/request.json](examples/request.json)を参照してください。
71
+
72
+ 学習・評価データは1行1問のJSONLです。上の入力に加えて、最低限`id`、`group_id`、`target`を付けます。`group_id`は同じ原題の言い換えや候補順序違いをまとめ、train/dev/calibration/final_test間で重複させません。
73
+
74
+ ```json
75
+ {"schema_version":"1","id":"sample-001","group_id":"story-001","context":"ノート7冊と消しゴム2個を買った。","question":"全部で何個?","choices":[{"id":"a","text":"9個"},{"id":"b","text":"10個"}],"target":{"kind":"hard","choice_id":"a"},"language":"ja","family":"everyday_arithmetic","review_status":"unreviewed"}
76
+ ```
77
+
78
+ `target.choice_id`は選択肢のIDを参照し、選択肢を並べ替えても正しいIDを保ちます。`language`、`family`、`review_status`などは出所・品質の追跡用メタデータです。合成教師ラベルを人手確認済みgoldと呼ばないことが重要です。[Practical V1のデータ説明](data/practical_v1/README.md)に生成・監査の詳細があります。
79
+
80
+ ## 学習と評価で得られた知見
81
+
82
+ 2026-09-22時点の追加学習実験では、凍結RC3(約438Mパラメータ)からPractical V1のtrain 2,414問のみで1 epoch、151 optimizer steps、peak LR 2.5e-6、microbatch 2・勾配蓄積8、fp16 AMPを実施しました。dev 399問と旧RC3 Bridge 480問で選定し、eval 386問は選定後に一度だけ評価しました。release weightsは上書きしていません。
83
+
84
+ | セット | 学習前 | 学習後 |
85
+ |---|---:|---:|
86
+ | Practical V1 dev | 59.90% (239/399) | 77.19% (308/399) |
87
+ | Practical V1 eval | 61.66% (238/386) | 76.17% (294/386) |
88
+ | 旧RC3 Bridge | 88.75% (426/480) | 88.54% (425/480) |
89
+
90
+ 新データでは日常算数23/68→48/68、ツール選択50/70→62/70、JSONログ判断51/69→65/69と改善しましたが、読解は54/71→50/71に低下しました。候補順序の入替一致率は旧Bridgeで97.29%→97.50%でした。**同一教師モデルが作成・再判定した未レビュー合成データ上の結果**であり、独立した人手goldでの汎化性能、実在入試問題の成績、Jevとの同等性は示しません。現時点では校正・正式リリースも未実施です。
91
+
92
+ Practical V1は日本語・英語・簡体字中国語の6分野(日常算数、ツール選択、会話の次行動、JSON会話ログ、読解、創作入試風)で構成されます。実在の入試問題や私的会話ログは利用していません。生成・再判定に使ったDeepSeek経由の料金推計は$1.0612で、追加予算枠は使いませんでした。より信頼できる次の評価には、人手ラベル監査と独立した実問題の調達が必要です。
93
+
94
+ 再現用コードは[scripts/train_practical_v1.py](scripts/train_practical_v1.py)、監査結果は[data/practical_v1/audit.json](data/practical_v1/audit.json)にあります。この学習スクリプトの再実行には別途RC3チェックポイントが`release/rc3/model`に必要です。GPU学習と大容量weightsはpipパッケージに含まれません。
95
+
96
+ ## 開発とライセンス
97
+
98
+ ```bash
99
+ python -m pip install -e ".[dev]"
100
+ python -m pytest tests -q
101
+ ```
102
+
103
+ コードは[MIT License](LICENSE)です。ベースモデルと学習済みweightsには別のライセンスが適用されます。[THIRD_PARTY_LICENSES.md](THIRD_PARTY_LICENSES.md)を参照してください。
erabi-0.1.0/README.md ADDED
@@ -0,0 +1,76 @@
1
+ # ERABI(えらび)
2
+
3
+ ERABIは、`context`(状況)、`question`(判断基準)、2~16個の`choices`(候補)から、全候補の確率分布を返すローカル判断エンジンです。Jevの公式版や再現版ではありません。回答は常に確認対象(`review`)であり、最大確率は正解の保証ではありません。
4
+
5
+ ## インストールと最初の推論
6
+
7
+ Python 3.11以上が必要です。PyTorchのGPU版を使う場合は、先に利用環境に合うPyTorchをインストールしてください。
8
+
9
+ ```bash
10
+ python -m pip install erabi
11
+ erabi predict --request '{"schema_version":"1","context":"7冊のノートと2個の消しゴムを買った。","question":"全部で何個?","choices":[{"id":"nine","text":"9個"},{"id":"ten","text":"10個"}]}'
12
+ ```
13
+
14
+ PowerShellではJSONの引用規則が異なるため、リポジトリを取得して `erabi predict --request examples/request.json` とするのが簡単です。初回は約1.75GBのモデルダウンロードが必要で、以降はHugging Faceのローカルキャッシュを再利用します。ネットワークが使えない場合は、事前取得したモデルのローカルディレクトリを`--model-id`で指定してください。
15
+
16
+ 無指定の既定値は公開済みの[ERABI Practical V1実験モデル](https://huggingface.co/sugarknight/erabi-practical-v1-experimental)です。正式合格モデルではなく、未レビュー合成データで追加学習した未校正weightsです。別のモデルを使う場合はローカルパスまたはHugging FaceのモデルIDを指定できます。
17
+
18
+ ```bash
19
+ erabi predict --request examples/request.json --model-id path/to/checkpoint
20
+ # または、利用するモデルIDを既定値として設定
21
+ export ERABI_MODEL_ID=owner/model-name
22
+ erabi predict --request examples/request.json
23
+ ```
24
+
25
+ `erabi doctor` はCPU/CUDAと空き容量を表示します。`erabi evaluate --input examples/smoke_cases.jsonl --output-dir runs/smoke` は評価ファイルを処理します。ローカルHTTP APIはオプション依存を入れて `python -m erabi.serve --model-id path/to/checkpoint` で起動します(localhost限定)。
26
+
27
+ ## 入出力とデータセット形式
28
+
29
+ 推論入力はUTF-8 JSONです。候補の`id`と順序を保ち、全候補のlogitsに対して1回だけSoftmaxを適用します。入力全体が512トークンを超える場合は無言で切り詰めずにエラーにします。
30
+
31
+ ```json
32
+ {
33
+ "schema_version": "1",
34
+ "context": "文房具店でノートを7冊、消しゴムを2個買った。",
35
+ "question": "全部で何個買った?",
36
+ "choices": [
37
+ {"id": "a", "text": "9個"},
38
+ {"id": "b", "text": "10個"}
39
+ ]
40
+ }
41
+ ```
42
+
43
+ 出力の`choices`は各候補の`id`と`probability`を入力順で返し、`best_candidate_id`は最大logitの候補を示します。`decision.status`は既定で`review`、未校正の`calibration.status`は`none`です。例は[examples/request.json](examples/request.json)を参照してください。
44
+
45
+ 学習・評価データは1行1問のJSONLです。上の入力に加えて、最低限`id`、`group_id`、`target`を付けます。`group_id`は同じ原題の言い換えや候補順序違いをまとめ、train/dev/calibration/final_test間で重複させません。
46
+
47
+ ```json
48
+ {"schema_version":"1","id":"sample-001","group_id":"story-001","context":"ノート7冊と消しゴム2個を買った。","question":"全部で何個?","choices":[{"id":"a","text":"9個"},{"id":"b","text":"10個"}],"target":{"kind":"hard","choice_id":"a"},"language":"ja","family":"everyday_arithmetic","review_status":"unreviewed"}
49
+ ```
50
+
51
+ `target.choice_id`は選択肢のIDを参照し、選択肢を並べ替えても正しいIDを保ちます。`language`、`family`、`review_status`などは出所・品質の追跡用メタデータです。合成教師ラベルを人手確認済みgoldと呼ばないことが重要です。[Practical V1のデータ説明](data/practical_v1/README.md)に生成・監査の詳細があります。
52
+
53
+ ## 学習と評価で得られた知見
54
+
55
+ 2026-09-22時点の追加学習実験では、凍結RC3(約438Mパラメータ)からPractical V1のtrain 2,414問のみで1 epoch、151 optimizer steps、peak LR 2.5e-6、microbatch 2・勾配蓄積8、fp16 AMPを実施しました。dev 399問と旧RC3 Bridge 480問で選定し、eval 386問は選定後に一度だけ評価しました。release weightsは上書きしていません。
56
+
57
+ | セット | 学習前 | 学習後 |
58
+ |---|---:|---:|
59
+ | Practical V1 dev | 59.90% (239/399) | 77.19% (308/399) |
60
+ | Practical V1 eval | 61.66% (238/386) | 76.17% (294/386) |
61
+ | 旧RC3 Bridge | 88.75% (426/480) | 88.54% (425/480) |
62
+
63
+ 新データでは日常算数23/68→48/68、ツール選択50/70→62/70、JSONログ判断51/69→65/69と改善しましたが、読解は54/71→50/71に低下しました。候補順序の入替一致率は旧Bridgeで97.29%→97.50%でした。**同一教師モデルが作成・再判定した未レビュー合成データ上の結果**であり、独立した人手goldでの汎化性能、実在入試問題の成績、Jevとの同等性は示しません。現時点では校正・正式リリースも未実施です。
64
+
65
+ Practical V1は日本語・英語・簡体字中国語の6分野(日常算数、ツール選択、会話の次行動、JSON会話ログ、読解、創作入試風)で構成されます。実在の入試問題や私的会話ログは利用していません。生成・再判定に使ったDeepSeek経由の料金推計は$1.0612で、追加予算枠は使いませんでした。より信頼できる次の評価には、人手ラベル監査と独立した実問題の調達が必要です。
66
+
67
+ 再現用コードは[scripts/train_practical_v1.py](scripts/train_practical_v1.py)、監査結果は[data/practical_v1/audit.json](data/practical_v1/audit.json)にあります。この学習スクリプトの再実行には別途RC3チェックポイントが`release/rc3/model`に必要です。GPU学習と大容量weightsはpipパッケージに含まれません。
68
+
69
+ ## 開発とライセンス
70
+
71
+ ```bash
72
+ python -m pip install -e ".[dev]"
73
+ python -m pytest tests -q
74
+ ```
75
+
76
+ コードは[MIT License](LICENSE)です。ベースモデルと学習済みweightsには別のライセンスが適用されます。[THIRD_PARTY_LICENSES.md](THIRD_PARTY_LICENSES.md)を参照してください。
@@ -0,0 +1,47 @@
1
+ [build-system]
2
+ requires = ["setuptools>=77.0.0"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "erabi"
7
+ version = "0.1.0"
8
+ description = "ERABI - Local probability distribution engine for choices"
9
+ authors = [
10
+ { name = "ERABI Project" }
11
+ ]
12
+ readme = "README.md"
13
+ license = "MIT"
14
+ license-files = ["LICENSE"]
15
+ requires-python = ">=3.11"
16
+ dependencies = [
17
+ "torch",
18
+ "transformers>=4.40.0",
19
+ "gliclass>=0.1.20",
20
+ "pydantic>=2.0.0",
21
+ ]
22
+
23
+ [project.scripts]
24
+ erabi = "erabi.__main__:main"
25
+
26
+ [project.optional-dependencies]
27
+ api = [
28
+ "fastapi>=0.110.0",
29
+ "uvicorn>=0.28.0",
30
+ ]
31
+ calibrate = [
32
+ "scipy>=1.12.0",
33
+ ]
34
+ data-gen = [
35
+ "openai>=2.54.0,<3",
36
+ ]
37
+ dev = [
38
+ "pytest>=7.0.0",
39
+ "httpx>=0.27.0",
40
+ ]
41
+
42
+ [project.urls]
43
+ Repository = "https://github.com/sugarkwork/erabi"
44
+ Model = "https://huggingface.co/sugarknight/erabi-practical-v1-experimental"
45
+
46
+ [tool.setuptools.packages.find]
47
+ where = ["src"]
erabi-0.1.0/setup.cfg ADDED
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,3 @@
1
+ """ERABI - Local probability distribution engine for variable choices."""
2
+
3
+ __version__ = "0.1.0"