# Ollaya 0.7.2：日本語の部署分類を20件で観察する

ふくふく「OllayaがMacのGPUに対応。日本語の問い合わせ20件で速度と分類を確かめる」の教材です。
架空データだけを含みます。モデルの出力を部署へ転送したり、社内システムを変更したりしません。

## ファイル

- `cases.jsonl`：20件。試用前に用意した教材から、本文・正解・説明を無変更で再利用。
- `evaluate_ollaya.py`：Python 3.10以上、標準ライブラリのみ。既定は通信なしの形式検査。
- `prepare_macos.py`：Apple silicon / macOS 14以上向け。公式0.7.2の本体・MLX packを約57 MB取得し、固定したSHA-256を検査して指定先へ展開。既存フォルダーへの上書き、システムインストール、モデル取得・起動はしない。
- `measured-cpu.*` / `measured-metal.*`：編集部のCSV、生応答、集計。架空入力のみ。
- `measurement-environment.json` / `device-evidence.json`：測定条件、APIが報告した実行デバイス。
- `server-log-excerpts.txt`：実行時の前景サーバー出力から、モデル読込みの2行を抜粋。時刻はUTC。CPUのONNX、Apple GPUのMLXとfp32を確認できる。
- `registry-manifest.json`：今回取得したモデルの版と各ファイルの識別子。重みそのものは配布しない。

## 1. 先にデータだけ確認

同じフォルダーに教材を保存して実行します。

```sh
python3 evaluate_ollaya.py
```

4部署の定義は `CRITERIA`、質問文は `INSTRUCTIONS` に固定しています。各部署4件の計16件と、人が確認すべき4件です。
後者の `human_review` は採点用で、モデルに渡す4択には入っていません。**この実験は棄権や自動エスカレーションを実装していません。**
`gold_label` と `note` はAPIに送りません。ケースと質問文は結果を見た後に変更していません。

## 2. Macで準備し、前景で起動

空き容量2 GB以上を確保してください。教材を置いたディレクトリで実行します。

```sh
python3 prepare_macos.py --directory ./ollaya-trial
```

失敗したら先へ進まず、エラーを確認してください。同名のフォルダーがある場合は別の新規フォルダー名を使い、以降のパスも合わせます。無条件の削除や再ダウンロードは行いません。

ターミナルAでCPUサーバーを起動し、開いたままにします。

```sh
OLLAYA_MODELS="$PWD/ollaya-trial/models" \
OLLAYA_HOST=127.0.0.1:11439 OLLAYA_DEVICE=cpu \
OLLAYA_MAX_LOADED_MODELS=1 \
./ollaya-trial/runtime/bin/ollaya serve
```

`11439` は今回の教材用ポートです。使用中なら他のサーバーを停止せず、環境を確認してください。このスクリプトの接続先は固定です。
これは常駐登録ではありません。ただし公式の `serve` は起動時に `~/.ollaya/server.11439.pid` を作り、通常終了時に削除する仕様です。モデルは指定した `ollaya-trial/models` に保存されます。

ターミナルBを同じ教材ディレクトリで開き、サーバーが起動していることを確認してから、多言語モデル一種類だけを取得します。`laya` だけを指定すると複数モデルを取得するため、ここでは必ずタグを付けます。

```sh
curl --noproxy '*' --fail-with-body http://127.0.0.1:11439/api/version
curl --noproxy '*' --fail-with-body http://127.0.0.1:11439/api/pull \
  -H 'Content-Type: application/json' \
  -d '{"model":"laya:multilingual","stream":false}'
```

モデル取得はインターネットを使用します。測定時の重み・関連ファイルは合計684,162,752 bytesでした。可変タグのため将来同じファイルになる保証はありません。`api/tags` のdigestを、同梱の `measurement-environment.json` にある `manifest_digest` と照合してください。`registry-manifest.json` 内のconfig・layerのdigestとは別の値です。

## 3. CPUで測る

```sh
python3 evaluate_ollaya.py --run --output my-cpu.csv
curl --noproxy '*' --fail-with-body http://127.0.0.1:11439/api/ps
curl --noproxy '*' --fail-with-body http://127.0.0.1:11439/api/tags
```

20件を順番に送信し、CSVと `.responses.jsonl`、`.summary.json` を新規作成します。既存ファイルを上書きしません。HTTP失敗・不正応答があればその行は `error`、終了コードは2です。失敗を正解や「通信していない」と解釈しません。

PythonのHTTP呼出開始からJSON解釈・応答検査までを計時します。サーバー内だけの推論時間ではありません。最初の1件と残り19件の中央値を分けます。初回を含む全体平均でCPU/GPUを比較しないでください。

## 4. Apple GPUへ切り替える

ターミナルAで `Ctrl+C` を押し、サーバー終了を待ちます。その後、同じモデル保存先で起動し直します。

```sh
OLLAYA_MODELS="$PWD/ollaya-trial/models" \
OLLAYA_HOST=127.0.0.1:11439 OLLAYA_DEVICE=metal \
OLLAYA_MAX_LOADED_MODELS=1 \
./ollaya-trial/runtime/bin/ollaya serve
```

ターミナルBで実行します。モデルの取り直しは不要です。

```sh
python3 evaluate_ollaya.py --run --output my-metal.csv
curl --noproxy '*' --fail-with-body http://127.0.0.1:11439/api/ps
```

`api/ps` の `device: "metal"`、サーバーログの `engine=mlx` を確認します。指定しただけでGPU利用済みとは扱いません。終わったらAで `Ctrl+C` を押します。

## 編集部の結果と制約

2026-09-27 11:19–11:20 JST、M2 Ultra / 192 GiB / macOS 27.0 / Ollaya 0.7.2 / `laya:multilingual` / fp32。
CPUを先に1回、サーバーを終了してGPUを1回。事前のウォームアップなし、各ケース1回、リトライなしです。

| 条件 | 明確16件の一致 | 初回 | 残り19件中央値 |
|---|---:|---:|---:|
| CPU / ONNX | 9/16 | 1,408.288 ms | 95.157 ms |
| Apple GPU / MLX | 9/16 | 2,359.245 ms | 12.602 ms |

20件の選択結果はCPU/GPU間で一致し、応答形式エラーは0件でした。4部署外への棄権機能はないので、要確認4件にも部署が付きます。固定した少数の教材の結果であり、日本語全般の精度や常時の速度を表しません。実行順やシステム負荷を統制した厳密な性能ベンチマークでもありません。

編集部は公式ファイルを `/tmp` の専用領域へ取得し、追加のmacOS sandboxでその外への書込みを拒否しました。ホームのPID保存は拒否されるため警告が出ますが、前景サーバーは動作しました。終了は保持したプロセスへSIGTERMを送りました。上記の読者向け通常起動はこの追加sandboxを含みません。

### 確率を正解率と取り違えない

OllayaのChoiceの `confidence` は `(K * max_probability - 1) / (K - 1)`、この教材ではK=4です。Micaの `confidence=max_probability` とは同じ名前でも異なります。互換APIでも同じ値とは限りません。
多言語Layaの未調整の確率を、そのまま本番の自動処理閾値に使わないでください。この教材に合わせて閾値を決めてから、同じ教材で「安全」と採点することも避けます。

## 別モデルと比較するとき

`--model` で明示的なタグを指定できますが、モデルを取得する機能はありません。別モデルの容量・利用条件を確認し、利用者が用意したサーバーで試してください。モデル名と応答契約が一致しなければエラーにします。
同じ20件・候補の順序・質問文を保ち、別の出力名に記録します。別モデルのconfidenceの定義も確認してください。今回、Mica本体・Jev API・ほかのLaya版は測定していません。

## 一次資料

- https://github.com/ollaya-dev/ollaya/releases/tag/v0.7.1
- https://github.com/ollaya-dev/ollaya/releases/tag/v0.7.2
- https://ollaya.dev/library/laya
- https://ollaya.dev/docs/typesafe-compatibility
- https://github.com/ollaya-dev/ollaya/blob/v0.7.2/site/docs/cli.md
- https://github.com/ollaya-dev/ollaya/blob/v0.7.2/crates/ollaya/src/daemon.rs

OllayaとLayaはApache-2.0。配布物に公式バイナリやモデル重みは含めていません。
