コンテンツにスキップ

月案のOllama連携と実機検証

2026-09-27。ユーザーの「では、それも含めて実機検証しよう」に基づく追加実装。 当初の「AI未接続」から、設定した園のみ実機Ollamaを利用できる構成へ変更した。 その後、2026-09-27 11:08 JSTに本番反映を完了した。現在の稼働状態は 配備記録 を参照。以下の隔離検証の記録と区別する。

操作と送信内容

  • AIタブの「候補を生成」で2件を生成。セル選択・タブ切り替え・キーワード入力では生成しない。
  • 年齢クラス・月・区分・領域・欄の名称だけを送信する。園児名、クラス名、入力本文、検索語、 過去の個人記録、文例DBの原文は送らない。生成結果は参考原文なしのAI提案と明示する。
  • 計画欄は計画文体。実施情報を送らないため、評価・反省は実績を創作せず振り返りの観点を提案する。 提案内容の確認と採否は職員が行う。
  • 生成中も入力できる。年齢・月・園児・セルを切り替えても、応答は生成を依頼した欄だけに保持する。
  • 候補は手入力を残して追記。AI候補の検索は生成済み文章を画面内で絞り込む。
  • 再生成失敗時は直前の候補と入力本文を保持する。生成失敗を保存成功と表示しない。
  • サーバー内は同時生成1件。別リクエストには429、通信失敗には503、時間切れには504、 読み取れない生成結果には502を返す。初回のモデル読み込みを考慮し、通信待ちは最大150秒。

設定と保存

HOIKU_MONTHLY_OLLAMA_SOURCES は園参照をキーとするJSON。 下記は架空の検証園用であり、通常の本番設定へ追加していない。

{"test-nursery":{"url":"http://127.0.0.1:11434","model":"qwen3:8b"}}

設定なしの園は引き続き「未接続」。URL・モデルをブラウザーから指定するAPIは作らない。 ローカルのGGUFモデルであることをOllamaの /api/show で確認し、クラウドモデルは拒否する。 認証・クラス権限・編集可能状態・CSRFを検証してから生成する。

monthly_sheet.fields[*].origins に kind=ai、生成ID・候補ID、生成日時、モデル、 生成文、プロンプト版、reference_mode=conditions_only、対象の年齢・月・欄を保持する。 原文候補の文例IDと混ぜない。AIの出典はサーバーの秘密鍵で署名し、園・クラス・年月・年齢・欄へ束縛。 クライアントで改ざんした候補や他の欄の生成結果を保存できない。 本文を編集した後も生成時の文章を残す。本文を全消去した場合に出典も消す。 保存済みの出典はAI停止・秘密鍵変更後もサーバーの既存スナップショットから保持できる。

検証環境

最新本番基準は 51ddae0ad1ff641310fdd4edb22f369385d0f45b。 保護者のお知らせ順、出欠画面、バックアップ等を保持したソースに月案関連23ファイルだけを反映。 本番のバックアップ実装が開発版と異なるため、開発版のバックアップ置換は取り込んでいない。 本番基準のWindows側77テストが成功。対象は月案・AI・架空文例の網羅、既存計画、 保護者お知らせ、出欠、既存バックアップ、DB起動・移行。

AIの単体テスト10件は、送信フィールド限定、出典改ざん・別欄への流用拒否、権限・CSRF、 未設定・同時生成・クラウドモデル拒否、通信失敗・不正応答、保存本文の保持を含む。

実機の検証場所:/home/truenas_admin/monthly-library-verify-20260927。 ユーザーが約38MBのソース・依存パッケージの転送を明示承認した。 ホームと /tmp がnoexecのため、ホストのPython拡張を使う方式は中止。 実機にある本番と同じイメージを用い、別の検証コンテナで実行する。 本番DBや秘密設定をマウントせず、架空データのみ。ループバックの18995番で待ち受ける。 Ollamaへは実機内の127.0.0.1:11434で接続する。確認画面の認証は架空職員への差し替え。 本番ログイン運用の確認や本番配備の完了を意味しない。

起動スクリプトは start_container.py。管理者認証後にネットワークなしの使い捨てコンテナで 77テストを実行し、成功した場合だけ hoikuict-monthly-verify-20260927 を起動する。 既存の検証コンテナがあれば置き換えない。検証用データはメモリー内に保存し、コンテナ終了で消える。 結果とハッシュ一覧はローカルの .local-dev/truenas-monthly-20260927/ および実機の同専用フォルダー。

実機での完了結果

ユーザーによる管理者コマンド実行後、検証コンテナが起動した。 実機内も77テストが成功(失敗・エラー・スキップ0件)。 コンテナID:cf28188918b8294c5fd2ce4d0a44769a02063423c54b09b4d3bcad4b86b97019。 ローカルPCのSSHトンネルを介し、http://127.0.0.1:8896/plans/monthly-library で操作できる。 以前の8895番のモックは停止・初期化していない。

実機の qwen3:8b に対してブラウザーから実際に生成し、以下を確認した。

  • 3歳児10月の「生命・情緒/環境設定」で日本語2候補を生成。
  • 生成待ちの追加入力を残して候補を追記し、下書きを保存。
  • 文書4を開き直し、本文・生成文・モデル・日時・参考原文なしの表示が保持されることを確認。
  • 1歳児10月の「生活・健康」で、過去3か月を表示しながら日本語2候補を生成・追記・保存(文書5)。
  • 園児2に切り替えると本文・候補は空欄。園児1に戻すと園児1の入力と候補を再表示。
  • ローカルの固定応答テストでは、生成中の欄切り替え後の応答分離と、再生成が503になった際の 以前の候補・保存本文の保持を確認。これを実機Ollamaの障害試験と混同しない。

実機の本番commit・イメージ・deployment.json・Composeのハッシュが、最新配備完了時から 変わっていないことを独立して照合した。検証結果は container-status.json、 container-tests.log、production-after.json に保存。 確認画像は monthly-ollama-real-device.png。 今回の結果は架空データを用いた実機検証であり、本番配備や実記録を用いた運用試験ではない。 モデルの文章の年齢適合性・具体性は職員が確認して採用する。