ちらりんブログ会員特典に TrainingCheck を追加します
本番稼働中の研修理解度チェック SaaS『TrainingCheck』をスタンダードプラン会員特典として追加料金 0 円で開放しました。講師が自分の AI API キーで問題を生成する BYOK による課金分離を中心に、設計判断と制限事項を率直にまとめます。
はじめに
ちらりんブログの月額 980 円スタンダードプラン会員向けに、自作の SaaS TrainingCheck を会員特典として追加します。追加料金は発生しません。既存会員はそのまま申請できます。
TrainingCheck は、研修資料をアップロードすると AI が試験問題を自動生成し、採点とレポートの可視化までを一貫して行う Web サービスです。すでに本番環境で稼働しているものを、会員が触れる特典として開放する形になります。
会員特典として「触れる」プロダクトを出すのは、自宅サーバーにブラウザから SSH / RDP できる Simple ZTA に続いて 2 つ目です。Simple ZTA がインフラ寄りの体験だったのに対し、こちらは研修テストの自動生成という、まったく毛色の違うものになります。
この記事で一番伝えたいのは、講師が自分の AI API キーを使う「BYOK」という課金の分け方です。個人運営の会員特典として、AI を使う SaaS をどうやって破綻させずに出すか。その設計判断を中心に書きます。
TrainingCheck とは何か
TrainingCheck は、研修・講習が終わったあとの理解度測定を自動化する Web アプリです。研修担当者が手作業でやっていた「理解度テストの作問・採点・集計」を、資料のアップロードと AI 生成に置き換えることを目的にしています。
できること
おおまかな流れは「資料を入れる → AI が問題を作る → 試験を公開する → 生徒が受ける → 自動採点とレポート」です。
- 研修資料 (PDF / PPTX / DOCX / XLSX / TXT) をアップロードし、テキストを自動抽出
- 抽出したテキストから AI が 4 タイプの問題を自動生成
- 単一選択 / 複数選択 / ○×問題 / 並べ替え
- 生成後に問題を確認・編集・追加・削除(良問は問題プールにストック)
- 試験の公開・非公開、制限時間、出題順のドラッグ&ドロップ並べ替え
- 生徒の受験(ランダムシャッフル出題、途中保存・再開、提出後すぐ採点と解説)
- コース横断の 総合問題(復習モード)
- レポート可視化(スコア分布グラフ、カテゴリ別ヒートマップ、PDF / CSV 出力)
運用を助ける細かい機能もいくつか入れています。
- 生徒視点プレビュー: 講師が生徒と同じ画面で受験を試せる。
exam_attemptsには一切書き込まないので、本番の集計を汚しません - CSV 一括アカウント登録: 講師・生徒をまとめて登録し、本人にユーザー名・初期パスワード・ログイン URL をメール通知
- コース共有: 1 つのコースに複数の講師を担当として割り当て可能
ロール
権限は 3 段階です。
| ロール | 役割 |
|---|---|
| super_admin | 運営者(私)。アカウント発行やコース横断の管理 |
| instructor | 講師。資料アップロード・問題生成・試験運用・レポート閲覧 |
| student | 生徒。試験の受験とスコア確認 |
会員特典で発行されるのは instructor(講師)アカウントです。会員は自分のコースを作り、自分の生徒を登録して、研修テストを運用する立場になります。
機能の詳細は TrainingCheck のプロダクト紹介ページ に表でまとめています。この記事では「なぜこういう出し方にしたのか」のほうを書きます。
なぜ会員特典を「BYOK」で出したのか
ここがこの記事の山場です。AI を使う SaaS を個人運営の会員特典として出すとき、避けて通れない問題があります。
問題:運営者のトークンで動かすと課金が青天井になる
TrainingCheck の問題生成は、裏で LLM の API を叩いています。研修資料のテキストを渡して、選択肢付きの問題を作らせる。当然ながら、これには API の利用料がかかります。
仮にこれを 運営者(私)のトークンで動かして会員特典にすると、どうなるか。会員が問題を生成すればするほど、私の API 課金が積み上がっていきます。研修資料が大きければトークン消費も増えるし、何度も作り直せばそのたびに費用が乗ります。
980 円の会員特典にぶら下げる仕組みとしては、これは成立しません。「会員特典として大きすぎる SaaS」を運営者持ちの API で動かすと、使われるほど運営が赤字になる構造になってしまいます。かといって生成回数に上限をかけると、今度は特典としての魅力が削がれます。
解決:講師が自分のキーで生成する(BYOK)
そこで採ったのが BYOK(Bring Your Own Key) です。講師が自分の AI API キーを登録して、問題生成は 自分のキー = 自分の課金で動かす、という方式です。
これなら、AI の利用料は使った講師に直接かかります。運営者が会員の生成コストを肩代わりすることがなくなり、「会員特典として大きすぎる SaaS」を、運営コストを会員に転嫁する形にせずに成立させられます。会員から見れば、自分が使った分だけ自分の AI プロバイダから請求される、という素直な構造です。
正直に書いておくと、これは「無料で AI を使い放題」という話ではありません。問題生成には会員自身の API キーが要ります。ただ、研修テストの作問にかかる AI コストは、手作業で問題を作る手間と比べれば十分に小さい範囲に収まる想定です。
設計の肝:AI を消費するのは 2 か所だけ
BYOK をきれいに成立させられたのは、AI を消費する場所が 2 か所しかないと特定できたからです。
TrainingCheck で LLM を呼ぶのは、次の 2 つの操作だけです。
- 問題生成(アップロードした資料から問題を作る)
- 単元分析(資料のテキストをカテゴリに分類する)
逆に言うと、生徒の受験には AI を一切使いません。出題・採点・レポート生成は、生成済みのデータと自前のロジックだけで完結します。だから、生徒が何人受験しても AI のコストは増えません。課金がかかるのは「講師が問題を仕込むとき」だけで、そこに綺麗な境界を引けました。
この「どこで AI を使い、どこで使わないか」がはっきりしていたことが、BYOK の前提になっています。もし受験のたびに LLM を叩く設計だったら、課金境界は曖昧になり、BYOK では捌けなかったはずです。
厳密さ:講師のキーは運営者の env に絶対フォールバックしない
BYOK で一番気を付けたのは、運営者のトークンが講師に使われないことです。
講師(instructor)が問題を生成するときは、自分のキーが必須です。キーが未登録のまま生成しようとすると、サーバーがエラーを返し、画面に「AI APIキー設定を開く」導線が出ます。ここで 運営者のサーバーに設定された env のキーには絶対にフォールバックしません。「講師のキーが無ければ、運営者のキーで代わりに動いてしまう」という抜け道を、設計の時点で塞いでいます。
一方、運営本人である super_admin は従来どおりサーバーの env のキーを使います。つまりキーの解決ロジックは「instructor は自分のキー必須・env 禁止」「super_admin は env」という形で役割ごとに分岐させています。
セキュリティ:登録キーは AES-256-GCM で暗号化保存
預かる以上、API キーを平文で持つわけにはいきません。登録されたキーは AES-256-GCM で暗号化して DB に保存しています。実装段階で、暗号化と復号の往復一致・IV のランダム性・改ざん検知(GCM の authTag)・マスク表示でキーが漏れないこと、までをテストで確認しました。
教材を売るのではなく、稼働中の SaaS を開放する
最後に位置づけを一つ。ちらりんブログの有料コンテンツには、設定ファイルや手順書を配布する「教材」系のシリーズがありますが、TrainingCheck はそれとは違います。コードを配るのではなく、すでに本番で動いている SaaS の利用権を会員特典として開放する、という設計です。
これは Simple ZTA と同じ「触れる特典」の路線です。読んで終わりではなく、会員が自分の手元で実際に動かして確かめられる。その体験を、運営コストを抑えながら成立させる手段が BYOK だった、というわけです。
技術構成
作りは Next.js の標準的なフルスタック構成です。
| 層 | 技術 |
|---|---|
| フレームワーク | Next.js 14 (App Router, standalone build) + TypeScript |
| ORM / DB | Prisma + PostgreSQL 16 |
| 認証 | NextAuth.js(ロール: super_admin / instructor / student) |
| UI | shadcn/ui + next-intl(日本語 / 英語の 2 言語) |
| 実行環境 | Docker 3 コンテナ(nginx / app / db) |
| 公開経路 | Cloudflare Tunnel |
| AI 連携 | OpenAI / Anthropic / Google を統一インターフェースで呼び出し |
公開は Cloudflare Tunnel 経由なので、自宅側にインバウンドの穴を開けていません。この「ポート開放なしで自宅から公開する」構成は、ちらりんブログ本体や Simple ZTA と同じ考え方です。
AI 連携の部分が BYOK の肝になります。3 つのプロバイダを getAIProvider(provider, model?, apiKey?) という統一インターフェースで扱い、ここに講師の BYOK キーを渡せるようにしました。各プロバイダのクライアントは apiKey ?? process.env.XXX という形で初期化しますが、講師の経路では前述のとおり env に落とさず、キーが無ければ生成エラーを返して設定導線を出します。「キーがあれば自分のキー、無ければエラー」という挙動を、この 1 行の解決順序で担保しています。
申請の導線は、Simple ZTA の申請フローをそのまま複製しました。会員ポータル(members.chillarin39.com)から申請 → 利用特約への同意ログを保存 → 運営者に申請メールが飛ぶ → 運営者が手動で講師アカウントを発行する、という流れです。クロスサービスでアカウントを自動発行する仕組みは「静かに壊れる」リスクが高いので、まずは人間が承認する HITL(Human-in-the-Loop)で運用実績を積みます。
会員から見た使い方
実際に会員が TrainingCheck を使い始めるまでの流れです。
- スタンダードプラン会員になる(月額 980 円、TrainingCheck の追加料金は 0 円)
- 会員ポータルの TrainingCheck 申請ページで、利用特約に同意して申請する
- 講師アカウント発行のメールを受け取る(手動承認なので、発行まで数日いただくことがあります)
- ログイン後、
/instructor/settings(「AI APIキー設定」)で 自分の AI API キーを登録する(BYOK) - コースと単元を作って研修資料をアップロード → AI で問題生成 → 試験を公開 → 生徒が受験 → レポートを確認
4 番目が TrainingCheck ならではのステップです。問題生成には自分のキーが要るので、ここを飛ばすと AI 生成が使えません。逆に言えば、キーさえ登録すれば、あとは資料を入れるだけで問題が出来上がります。
制限事項 — 誠実に明示しておきます
会員特典として出す以上、できることよりも できないこと・現状の制約を先に書いておきます。
SLA なし・ベストエフォート
個人運営なので、稼働率・応答時間・復旧時間の保証はありません。メンテナンスやセキュリティ対応で停止することがあります。重要な研修の本番運用に使う場合は、停止する可能性がある前提で、控えやスケジュールに余裕を持たせてください。
AI 問題生成には講師自身の API キーが必須
繰り返しになりますが、これは仕様です。AI による問題生成を使うには、講師が自分の AI API キー(OpenAI / Anthropic / Google のいずれか)を登録する必要があります。キーの利用料は各 AI プロバイダから講師へ直接課金され、運営者は負担しません。「会員になれば AI で問題を作り放題」ではない、という点は正直に書いておきます。
突然サービスを終了する可能性
セキュリティ上の重大な問題、法令の変更、運営継続が困難な事情がある場合は、サービスを終了することがあります。その際はできる限り事前にアナウンスするよう努めます。
発行までに時間差がある
申請から講師アカウントの発行までは手動承認(HITL)です。自動ではないので、返信までに数日かかることがあります。
利用特約・プライバシーポリシーへの同意が前提
利用できるのは、利用特約とプライバシーポリシーに同意いただける方のみです。生徒の個人情報を扱う性質上、ここは曖昧にできません。
どう運用していくか
私の側で想定している運用方針は次のとおりです。
- 招待は手動承認で、少人数ずつ。一度に大量に受け入れず、状況を見ながら増やします
- 障害・停止は会員ポータルで告知し、必要に応じてブログにも事後レポートを書きます
- フィードバックを記事化します。運用の中で出た議論や改善は、ブログの材料にさせてもらいます(機微情報は当然マスキングします)
会員の皆さんにお願いしたいことが一つあります。TrainingCheck は、自分が管理する研修・教材の範囲で使ってください。生徒の個人情報を登録する以上、その取扱いには会員自身の責任が伴います。アップロードする資料や登録する受講者の情報が適法な範囲にあることを、利用者側でご確認ください。
申請方法
会員ポータルの「会員特典」ページとダッシュボードに、TrainingCheck のカードを追加済みです。利用を希望する方は、そこから申請してください。手動承認のため、返信まで数日いただくことがあります。
まだ会員でない方は、会員プラン のスタンダードプラン以上をご検討ください。TrainingCheck は追加料金 0 円なので、スタンダードプラン月額 980 円だけで利用対象になります。
おわりに
ちらりんブログは、「読む」ブログから、本物のインフラ監視を「見る」会員 Grafana、そして自分の手で「触る」Simple ZTA へと、会員体験を段階的に積み上げてきました。TrainingCheck はその「触る」体験に、研修テストの自動生成という新しい種類を一つ足すものです。
個人運営の会員特典で、AI を使う SaaS をどう成立させるか。その答えとして BYOK を選びました。AI を消費する場所を 2 か所に絞り込み、講師が自分のキーで自分の課金を持つ。この設計のおかげで、運営コストを抑えながら、会員特典としては大きめのプロダクトを開放できました。
実際に使ってみて気づいたこと、引っかかったこと、こうしてほしいという要望があれば、ぜひフィードバックをください。ブログのお問い合わせか、会員ポータル経由でお待ちしています。
コメント