Classi開発者ブログ

教育プラットフォーム「Classi」を開発・運営するClassi株式会社の開発者ブログです。

学習トレーニング機能の「メモ機能」のリリースと開発プロセスの振り返り

学習トレーニングチームのいもりです。

学習トレーニングは11月初旬に新機能として、画面上にメモを取ることができる「メモ機能」をリリースしました。

chienowa.classi.co.jp

リリース後の活用は徐々に伸びており、特に計算が必要な数学で活用いただいています。

この機能は他プロジェクトと並行して進めていたため、検討に割けるリソースは限られていました。今回は要件定義のフェーズでAIによるプロトタイピングを活用し、チームの認識合わせを効率化するアプローチを取りました。

「動くもの」をベースに議論することで、検討開始から仕様確定までを約1ヶ月で完遂し、顧客に必要な機能を素早く届けることができました。本記事では、その開発プロセスについて紹介します。

開発経緯

「学習トレーニングの画面内でメモを取りたい」という要望は、学習トレーニングリリース当初からいただいている改善要望でした。

とはいえ、私が現在のチームに所属してからの半年間は、より緊急度や要望数の高い別の課題への対応を優先して進めていました。しかし、それらのクリティカルな課題を一つひとつ解消していくにつれて、ユーザーの不満点が「より良い学習体験」へとシフトし、結果としてメモ機能への要望が以前よりも顕著に届くようになりました。

メモ機能がないことが学習体験における最大のボトルネックになった今こそ、この要望に向き合うべきタイミングだと判断し、本格的な開発に着手しました。

「動くもの」を共通言語に

まずは現状分析を行いました。データサイエンティストが主導してVoC分析を行い、顧客が直面している課題を浮き彫りにしていただきました。

印象的だったのが、「紙を用意するのが面倒なだけでなく、PCのメモ帳アプリを横に開いて計算している生徒もいる」という事実です。いかなるデバイスであっても学習を画面内で完結させたいニーズがあることがわかったため、すべてのデバイスで利用可能なWebの機能として実装する方針が固まりました。

ですが、いざ要件定義に入ると既存の解答画面への影響やどの機能が必要か?という懸念が生まれ、具体的な実装イメージが定まりませんでした。

そこで、社内で開催されている「フロントエンド互助会」に相談を持ち込み、先行事例や方向性のアドバイスをいただきました。いただいた知見をベースに、AIコーディングを活用してプロトタイピングを実施し、解答画面上に被せてメモが取れる機能を20分程度で作成しました。

画像内に登場する画面は開発環境になります

実際に動くものができたことでチーム内の議論の解像度が一気に高まり、具体的な機能要件へ踏み込むことができるようになりました。

「引き算」の意思決定

AIコーディングを活用すれば機能追加を行うこと自体は難しくありません。実際に何が必要な機能かを見極めるために、開発当初は既存ペイントツールにあるRedo/Undoなどの様々な機能を搭載したメモ機能をプロトタイプで作成し、社内ドッグフーディングを行いました。

社内ドッグフーディングを経て見えてきた課題は、スマートフォンでの限られた画面領域における操作性でした。多機能を搭載したメモはキャンバスエリアが狭くなり、ボタンの押し間違いも発生しやすく使い勝手を損なうことがわかりました。

そこで私たちは「ペイントツールではなく問題を解くための補助的なメモ機能である」という原点を思い出し、学習中のメモを取る際にストレスなく利用できるシンプルさを最優先事項としました。誤操作により体験を損なう可能性のあるRedo/Undoなどは搭載せず、必要な機能だけに絞り込む「引き算」の意思決定を行いました。

この決断で各機能の要件がシンプルになり、要件定義がスムーズに進行したことが短期間のリリースに繋がりました。

リリース後の反響と振り返り

リリースから1ヶ月以上が経過しました。グラフは1日ごとのメモの利用回数ですが、利用状況は順調に推移しています。また、リリース当初は解答UU数に対して1日あたり6%程度の利用数だったのに対し、現在は13%程度まで増加しています。

特に近い時期にリリースした数学Ⅲの問題での活用はトップクラスであり、当初の狙いであった「紙を用意する手間をなくし、学習に集中する環境を作る」という価値を必要としているユーザー層に届けられたと実感しています。

社内からの反応も励みになりました。ドッグフーディングでは早くリリースしたほうがいいと感想をいただいたり、窓口対応チームからは「特に良い改善だった」という声をいただいたことは素直に嬉しかったです。作り手として自信を持ってユーザーに案内できる機能を提供できたことはプロダクト開発における理想的な形を実現できたのではないかと考えています。

今回の開発を振り返って個人的に最大の収穫だったのは、AIなどの技術を活用することで、エンジニア個人の「要件定義の質とスピード」を劇的に向上させられると実感できたことです。 「どう実装するか(How)」をAIや互助会の知見でショートカットできた分、チームの議論が「何を作るべきか(What)」という本質に迫ることができ、機能の「引き算」といった意思決定に時間を割くことができました。

新しい技術を適切に活用することで、エンジニアは顧客の課題により深く向き合えるようになります。今後も技術の力を借りながら、ユーザーにとっての正解を最短距離で探り当てるプロダクトエンジニアリングを追求していきたいです。

ディップ×ココナラ×ギフティ×Classi 合同勉強会 開催記|若手エンジニアが「外」に出て見つけた、技術の先にあるもの

こんにちは、Classi エンジニアの yuu.kun です。

2025年12月2日、ディップ、ココナラ、ギフティ、Classiの4社合同勉強会「大規模Webサービスの技術負債、どう向き合う??を開催しました。

今回のイベント、Classiからは新卒メンバーとエンジニアリングマネージャーの鳥山が参加しました。私はその中で、企画・運営担当として携わりました。 本記事では、イベントの裏側である「開催に至るまでの経緯」や「運営サイドから見た気づき」を私から、そしてイベント本編のテーマである「技術負債に関する知見」を鳥山から、それぞれレポートします。

開催に至る経緯

今回の合同勉強会は、会社からのトップダウンで決まったものではなく、現場のエンジニア同士の繋がりから生まれました。まずは、開催までのプロセスを振り返ります。

1. きっかけは社外イベントへの参加

スタートは、私自身が「Kaigi on Rails 2025」や「TSUDOI by giftee Tech #1」といった社外のイベントへ継続的に参加していたことでした。

普段はフルリモートワークで開発していますが、積極的に外の場へ足を運ぶ中で、他社のエンジニアとの接点が増えていきました。その中で出会ったのが、ココナラの新卒エンジニアの方です。 同世代のエンジニアとして交流するうちに意気投合し、「自分たちの会社を巻き込んで、合同でイベントをやりましょう」という話が持ち上がりました。

2. 個人の繋がりを「公式イベント」へ

今回のイベントは、ディップ株式会社と株式会社ココナラの共同主催という枠組みの中で、私たちClassiも運営・登壇企業として参画させていただく形となりました。 「一緒にやろう」という合意の後は、この大きな枠組みの中にClassiとして正式に参加するための調整フェーズに入りました。

  • 企画内容のすり合わせ: ディップ・ココナラ両社ですでに策定されていたテーマ(技術負債)やターゲット設定について共有を受け、Classiとしてどのように参加するか、認識のすり合わせを実施。
  • 社内調整: 上長への企画提案、開催承認の取り付け。
  • 関係各所への確認: Classiのロゴを使用し、看板を背負って開催するため、PR室(広報)への確認やコンプライアンスチェックなどを実施。

単なる個人の勉強会ではなく、複数社が関わるオフィシャルなイベントとして、必要な手順を一つひとつクリアし、Classiとしての参画を実現しました。


当日のセッションと技術負債への向き合い方

このセクションは、社内で誘いを受けて実際に登壇した鳥山(to_lz1)の執筆です。 最初に、当日発表に使った資料をリンクしておきます。

speakerdeck.com

以下、資料の内容とも重複しますが、執筆にあたって考えたことをいくつか記したいと思います。

1. 技術的負債の原義と定義

発表前にまず気づいたのは、「自分は『技術的負債(Technical Debt)』の原義についてあまり知らない」ということでした。

t-wadaさんのブログで国内でも有名になった「負債のメタファー1というものがありますが、ここでも「負債」とだけ言われていて「技術的負債」とは必ずしも言われていません。調べてみると「技術的」という形容詞を付けて使い始めたのはまた別の方らしく、こうした経緯は発表に当たって調査をすることで初めて知ったので勉強になりました。

このように定義付けがハッキリしていないのにも関わらず、我々エンジニアは確かに「技術的負債」なるものがあると認識し、この概念について語ることをやめられません。執筆を通し、この言葉に宿るそんな不思議な魔力を感じました。また、発表に当たっては定義が曖昧になって聞き手の理解を損ねてはならないので「本発表における技術的負債の定義」を序盤に説明するように注意を払いました。

2. 借入のポジティブな側面

細かい内容は資料に譲りますが、私は個人のキャリアを通して「頑張りすぎず、かつ作りすぎなかった時にこそ最良の結果が得られた」という経験を複数持っています。

もちろん、困難な技術的課題を解決する腕力とでもいうべき技術力はエンジニアに必須です。しかし、その持てる力を全て注いだコードというのは得てして複雑になりがちです。また、そうしたコードが保守しきれずに腐っていくというシーンも目にしてきました。

それよりも、エンジニアとしての様々な経験から来る「この課題に対してなら、より実装工数の軽いこういう設計があるのでは?」といったアイデアやアーキテクチャの方が、成功を導くことが多かったりするのです。そうしたソリューションはリリースも早く出来ますから、結果としてビジネス的な成果にも繋がりやすくなります。この中で、「今はXXXを実装しない」という判断が効率的に下されていたならば、それは「事業価値を生み出す借り入れ」と呼んでも良いのではないでしょうか。

「技術的負債」にはネガティブな側面も多くあります。しかし、私は今回こうした「負債のポジティブな側面」について実感を伴って理解してもらえると良いな、と思って資料作成と発表に臨みました。

また、こうしたやり方で本当に価値を生み出すためには、いわゆる「要件定義」への食い込みや、社内外との交渉も必要になってきたりします。今回のイベントではいわゆる若手の方も多いと事前に聞いていました。そうした技術力を伸ばしたい盛りのエンジニアには嫌われがちな「要件定義」フェーズですが、逆に「技術力を活かすフィールド」として再解釈してみると面白いんじゃない?という私からの提案として、今回の発表資料をまとめさせて頂きました。


運営を通じての気づき・発見

ここからは再び、運営担当の yuu.kun が、イベントを通じて感じた「組織文化」や「技術広報」への気付きについてお話しします。 今回、運営サイドとして参加して強く印象に残ったのは、共催であるディップ株式会社の運営体制と文化 です。

1. 同世代からの刺激と「負けられない」という思い

会場(ディップ株式会社の四谷オフィス)では、私と同世代である20代前半のエンジニアの方々が主体となって、運営を回していました。

印象的だったのは、彼らが単に決められたタスクをこなすだけでなく、どうすれば社内の風土が良くなるか、どうすればイベントが盛り上がるか、彼ら自身も手探りで模索しながら動いている様子が伝わってきたことです。 同じ若手エンジニアとして、組織をより良くしようと奮闘する彼らの姿に、「自分も負けていられない」という強い活力を貰いました。

2. 「技術広報」が根付く文化

運営の方々と話をする中で、ブログの発信頻度の高さや、月に数回のペースでイベントを開催していることなど、組織として「技術情報を発信する」「技術ブランディングする」という文化が深く根付いていることを知りました。

素晴らしい技術を持っていることと、それを外部に認知してもらうことは別の筋肉が必要です。 技術力はもちろんですが、それを届けるための「発信力」や、エンジニアが集まる「場を作る力」。これらもまた、エンジニア組織にとって不可欠な要素であることを、ディップ株式会社の体制から学びました。

おわりに:今後の展望

個人の繋がりから始まった企画でしたが、実際に4社合同という規模で開催できたことは、私自身にとって大きな手応えとなりました。

今回のイベントを一過性のものにせず、得られた知見を社内に還元するとともに、今後も積極的に社外との接点を作り、Classiのエンジニア文化をより外に開かれたものにしていきたいと思います。

2025年のAIを活用した伴走型エンジニアリングを振り返る

はじめに

背景

普段はエンジニアとして、Classi で提供している学習トレーニング機能の問題を管理するCMSの機能強化などを行っています。それが2025年度からは開発だけでなく「コンテンツチーム」にも兼任という形で所属することになりました。 目的はシンプルで、「コンテンツ制作の現場と連携を強化し、その知見をCMS開発へダイレクトに反映していくこと」です。

趣旨

この記事で伝えたいことは以下の3点です。

  • CMSへの「入稿前段階(コンテンツデータ作成)」に関わることで、エンジニアの貢献ポイントが劇的に増えた。
  • Vibe Coding(Claude Code等)で「使い捨てスクリプト」を量産し、AI(Gemini等)で「中身」を補完することで、開発・制作双方の工数を圧縮した。
  • 「100点を目指さない(AI活用)」×「汎用化を目指さない(ワンショットスクリプト)」という割り切りが、最大の成果を生んだ。

※このエントリーで取り扱っている「コンテンツ」は、Classiの「学習トレーニング」上で生徒さんが取り組む「問題」のことを指しています。さまざまな科目、利用用途に合わせて問題群を充実させていくようにコンテンツチームが中心となって制作をおこなっています。

発見:「入稿」の前にエンジニアの仕事があった

続きを読む

プロダクト共有会のご紹介

プログラマ兼、プロダクト共有会司会の onigra です。本日は、私が所属するプロダクト本部で定期的に開催している「プロダクト共有会」をご紹介します。

プロダクト共有会の様子

プロダクト共有会とは?

プロダクト本部が行った、Classiサービスの機能追加・改善などのリリースについて広く共有する会です。主に、マーケティング本部(セールスマーケティング、カスタマーサポート&サクセス等を行う本部)に向けて開催しています。 1

リリース情報の共有は日々行なわれていますが、Classiとtetoruはサービス内に複数の機能が存在し、デプロイも1日に平均して7~10回行われているため、それらを全て、背景や目的を含めて把握することは困難です。

そこで、これらのリリースについて、実際に企画・開発に関わったメンバーから紹介・解説・デモを行い、フィードバックをもらったり、営業活動に活かせる情報を提供することを目的としています。

営業活動に活かす

Classiではマーケティング、セールス、カスタマーサクセスが連携して営業活動を行っています。この体制において、プロダクト本部とマーケティング本部の連携は生命線です。

そのためプロダクト共有会は、単なる機能紹介にとどまらず、プロダクトマーケティングの一環として機能の価値を正しく伝え、営業活動を支援する取り組み(セールスイネーブルメント)にしていきたいと考えています。

機能が解決する課題や開発の意図、活用事例を共有し、日々の提案活動に活かしてもらうことで、プロダクト本部のメンバーも間接的に営業活動に参加し、全社で顧客価値を届けるための場所にしていきたいという狙いがあります。

開発者の声を届けたい

スペックや操作方法だけならドキュメントを読めば分かります。しかし、プロダクト共有会で大切にしたいのは、「なぜこれを作ったのか」や「何に苦労し、どこにこだわったのか」という、生産者の顔が見える情報です。

ストーリーを開発者・企画者自身の言葉で語ってもらうことで、機能は単なる記号から、熱の通ったソリューションへと変わります。その熱量は、営業やCSメンバーを通じて、必ずお客様にも伝播すると信じています。

また、新しくClassiに入社したメンバーはチームでサポートしつつ発表の機会を設け、成果とともにメンバーの紹介を行うことで、成功体験を積むオンボーディングの場としても活用しています。

まとめ

プロダクト共有会は、情報の伝達場所というだけでなく、プロダクト本部とマーケティング本部をつなぎ、組織全体でプロダクトの価値を最大化するためのハブとして運営しています。

今後も、部門の垣根を超えてClassiをより良く、より多くの方に届けるために、楽しく運営していきたいと思います。

おまけ: プロダクト共有会の前身

プロダクト共有会は、Classiの 「申請・提出物/カスタム名簿」機能の開発チームが行っていた「共有会」を前身にしています。

良い取り組みであり、毎回盛り上がっていたため「もっと共有対象を広げよう」ということになり、現在のプロダクト共有会に発展しました。

「申請・提出物/カスタム名簿」開発チームのメンバーにはこの場を借りてお礼を申し上げます。


  1. 参加者に制限は設けていないので、さまざまな組織のメンバーが参加しています

「あえてSQLは書かせない」営業現場で“そのままでも使える“レポート生成AI Agentの紹介

この記事は ADK Advent Calendar 2025 の 22日目の記事です。

こんにちは、データプラットフォームチームの白瀧です。

突然ですが、皆さんの会社の営業チームから、こんな悲鳴を聞いたことはありませんか?

「明日の訪問準備、データを見る時間が全然足りない……!」

Classiでは、学校現場へ訪問して先生方を支援する営業活動が日々行われています。しかし、1日に何校も訪問するスケジュールの中で、学校ごとの詳細なデータ分析を行い、それを資料に落とし込むのはかなり困難です。

今回は、そんな営業の課題を解決するために、「学校訪問時にそのままでも出せる活用レポートを生成するAI Agent」 をAgent Development Kit(以下、ADK)をベースに構築した話をします。

データはあるのに活用できないジレンマ

これまで営業向けのダッシュボードを用意し、営業チームと議論し拡充もしてきました。

しかし、現場としては以下のような状況でした。

  • 訪問の合間の移動時間や、限られた準備時間の中で、ダッシュボードを深掘りしてインサイトを見つけ出し、営業資料にまとめる時間がなかなか作れない
  • 新たなダッシュボードを提供しても、結局は使い慣れた「いつものダッシュボード」だけを確認して終わってしまう

結果として、本来提供できるはずの深いデータインサイトや、多角的な視点が学校に届かず、情報の幅が属人化・固定化してしまいます。これはプロダクトとしても、顧客である学校にとっても大きな機会損失になります。

そこでデータを見て、解釈をして、資料に落とし込むところまでAIを使って自動化してしまえば、営業の効率化と同時にデータを活用した営業による品質向上に貢献できるんじゃないかということから本プロジェクトが始まりました。

開発までの流れ

1. 良い営業資料を集め、品質を再現するための情報整理

まず最初に行ったのは「営業資料の理解」です。
社内で共有される良い営業資料を収集し、営業がどのような話の流れ・資料のフォーマット・文章の書きぶりをしているのかを理解するところから始めました。

全く新しい構成のレポートをAIが出力しても、営業担当者からすれば「見慣れない資料」となり、内容を理解して自分の言葉で話すためのコスト(認知負荷)が高くなってしまいます。そのため、既存の営業資料をフォーマットや構成を踏襲することで、営業担当者がスムーズに受け入れられる設計をベースにおきました。

2. 深掘り観点の策定

既存の再現だけでは、単なる省力化に留まります。そこで、「AIだからこそ出せる価値」を付加するために、レポートに含める独自の深掘り観点を検討しました。

  • これまで営業が「活用しきれていないデータ」、「解釈しきれていないデータ」は何か?
  • その中で、営業トークとして使いやすい(話しやすい)データはどれか?

この点については営業メンバーと議論を重ね、「このデータがあれば、先生ともっと深い会話ができる」というポイントを絞り込みました。

絞った観点に対して単にデータを羅列するだけでは意味がありません。

  • この機能でこのような活用ができています
  • この数字が上がっているのは良い傾向です
  • 特に⚪︎年生でこの機能がしっかり使えています

といった、伝えたいメッセージやデータの解釈までを出力させることが営業現場で活用するハードルを下げ、価値につながると考えました。

3. フォーマット・図の確定と開発

ここまできたら、具体的な出力フォーマットや掲載するグラフ(図)の形式を固め、AI Agentの開発フェーズへと移行しました。

AI Agentの構成

システム全体の構成は以下で、

システム構成

Agentの構成は以下のようにしました。

Agentの構成

  • Root Agent
    • 全体の進行管理役です。必要なSub Agentを呼び出し、Sub Agentの出力をまとめてレポート形式に整形することのみを行います。
  • Sub Agent (= Agent as a Tool)
    • サマリー生成Agent: 必要なデータを取得し、指定されたフォーマットに従って文章を生成します。
    • グラフ・表生成Agent: データの可視化グラフや表など、指定された画像を生成します。

この設計からもわかるようにレポートの構成を固定し、さらに各セクションの出力フォーマットも固定しています。

学校ごとにサービスの利用目的や利用傾向からAgentにレポートの構成から考えさせるという選択肢もありました。
今回は以下の利点から、フォーマットに固定して出力させることにしました。

  • Sub Agentを独立に実行できるようになり、容易にWorkflow化 & 並列処理による高速化が可能
  • どの学校で出力をしても同じフォーマットであることによる認知負荷の低減

AIにSQLを生成させない選択

今回の活用ユースケースとして、レポートをそのまま学校に持っていくことを想定しています。そのため、「他校のデータが混ざる」ということは強く避けるような設計が求められました。

生成させるレポートのフォーマットを確定させたことで幅広くデータを取得する重要性が高くないことから「AIにSQLを書かせない」という選択を取りました。

具体的にはSub AgentがFunction Toolでデータを取得する際、SQL自体を生成させるのではなく、事前に人間が検証した安全なSQLテンプレートを用意し、「学校ID」の部分のみを可変にする実装にしています。これにより、ハルシネーションによる誤ったデータ抽出のリスクを排除しました。

また、データの正確性だけでなく、レポートとしての品質や文脈の適切さを担保するために、生成されたレポートは必ず営業担当者が内容を確認・微調整した上で学校へ提出する運用としています。

実際のコードイメージは以下の通りです。

def get_wau(
    start_date: str,
    end_date: str,
    school_id: str,
) -> dict:
    """特定の学校について、所定の期間内の週次アクティブユーザ数(WAU)を取得します。

    結果はdictionary形式で返され、各キーの説明は field_definitions に含まれます。
    Args:
        start_date (str): The start date in YYYY-MM-DD format.
        end_date (str): The end date in YYYY-MM-DD format.
        school_id (str): The school identifier.
    Returns:
        dict: A dictionary containing WAU data and metadata.
    """
    if not start_date or not end_date or not school_id:
        raise ValueError("start_date, end_date, and school_id must be provided.")

    client, project_id = get_client()
    query = f"""
    select
        format_date("%Y-%m-%d", target_week) as target_week,
        user_type_name,
        grade_name,
        function_name,
        wau,
        wau_rate
    from `{project_id}.<dataset_id>.wau`
    where
        target_week >= "{start_date}"
        and target_week <= "{end_date}"
        and school_id = {school_id}
    order by
        target_week,
        user_type_id,
        grade_code,
        function_name
    """
    data = execute_query(client, project_id, query)
    meta = {
        "target_week": {
            "type": "string",
            "description": "対象週の開始日(YYYY-MM-DD形式)",
        },
        "user_type_name": {
            "type": "string",
            "description": "ユーザ種別名(例: 先生、生徒、保護者)",
        },
        "grade_code": {
            "type": "string",
            "description": "学年名",
        },
        "function_name": {
            "type": "string",
            "description": "機能名",
        },
        "wau": {"type": "integer", "description": "週あたりのアクティブユーザ数"},
        "wau_rate": {
            "type": "float",
            "description": "週あたりのアクティブユーザ率(登録ユーザ数に対する割合)。0から1の範囲で表現される",
        },
    }
    result = {"wau": {"data": data, "field_definitions": meta}}
    return result

成果と気づき

これまでのダッシュボード提供とは一線を画し、営業担当者から素早い活用と非常にポジティブな反応を得ることができました。

特に顕著な成果として、リリースからわずか1ヶ月という短期間で、契約校全体のうち約21%にあたる学校に対して、活用状況レポートが生成されました。これは、ツールの導入・活用を促す上での高いニーズと、AI Agentが提供する価値が即座に受け入れられたと感じています。

営業担当者からは以下のような具体的な声が寄せられました。

またレポートが使われた結果、以下のような学校での動きもありました。

  • 活用レポートを受けて、学年通信に「学習トレーニング機能に取り組んで伸びた」という記載を載せていただいた
  • 活用計画を先生と一緒に立て、活用後に再度レポートを出力して、振り返りをするサイクルの確立

上記の成果から本施策は、営業活動の効率化だけでなく、その先の学校への影響・変化をもたらした事例を作ることができたことが、最も大きな成果だったと思います。

レポート形式が持つ付加価値

今回の開発を通じて、ダッシュボードでは伝えきれない、より詳細で深い情報をレポートというテキストベースでは提供できるという気づきを得ました。

ダッシュボードは、情報を一目で理解しやすくするために、データのビジュアライズが不可欠です。しかし、このビジュアライズの過程で、意図的に情報量を絞り込んだり、データの背後にある文脈や詳細なニュアンスを省略したりすることがあります。これは、解釈の容易さを優先する上でのトレードオフです。

それに対し、テキスト形式を用いることで、単なるデータや結果だけでなく、そのデータが何を意味するのか、どのような解釈が導き出されるのかという点まで踏み込んで記述できます。これにより、ユーザーは情報を受け取るだけでなく、その情報の価値や次に取るべきアクションの示唆までをダイレクトに、かつ明確に受け取ることが可能になります。
この「解釈を与える」機能こそが、テキストがダッシュボードを補完し、時にはそれを超える価値を提供できると認識しました。

おわりに

今回は、活用状況のレポート生成により営業の資料作成を効率化するAI Agentについてご紹介しました。

営業との密な連携こそが今回の成果につながったと思っています。現場の営業担当者が必要としている情報が何であるかを深く掘り下げ、継続的にフィードバックの収集と改修を繰り返しました。

その結果、多忙な営業担当者が迅速かつ的確にアクションを起こすために有効なツールとなり、これまで「お決まりのダッシュボード」しか見ていなかった状態から、AIが自動的かつ親切に多角的な視点を提供することで、データ活用の水準が底上げされたと考えています。

現状のAI Agentはまだまだ開発初期段階だと思っています。生成したレポートをベースにした「対話的な修正機能」や、より高度な「学校ごとのパーソナライズされたレポートの生成」などにも挑戦し、営業担当者がより本質的な課題解決に時間を使えるようサポートしていきたいと思います。

新しい学習トレーニングチーム発足から成果を出すチームになるまで

はじめに

こんにちは。学習トレーニングチーム(以下、学トレチーム)でソフトウェアエンジニアをしている工藤 ( id:irisuinwl ) です。最近のマイブームはウイスキーを飲むことと氷作りです。

自分は2023年までアダプティブラーニングチーム(以下、ALチーム)のリーダーをしていました。

tech.classi.jp

現在ではALチームを再編し、学習トレーニングチームでソフトウェアエンジニアをしております。
新しくなった学習トレーニングチーム発足から1年半ほど経ち、いくつものリリースを通じて、チームとして上手く機能できています。
この記事では、自分がどのようにチーム再編を意思決定し、メンバー全員がチームで活躍できるようにどう取り組んだか、新チームとして上手く機能するために何をしてきたかを書きます。

続きを読む

生成AI活用による数IIIコンテンツ制作における挑戦と成果

こんにちは、Classiのコンテンツディレクターの岩崎・北川とデータサイエンティストの高木です。

EdTechにおいて、「質の高い学習コンテンツ」を「必要な量だけ」「スピーディ」に届けることは、常に最大の課題の一つです。特に高校数学の「数学III」のような専門性が高く、複雑な数式やグラフ描画を伴う科目は、制作難易度が極めて高く、コストも時間もかかるのがこれまでの常識でした。

今回、私たちはGoogleの生成AIモデル「Gemini 2.5 Pro」を活用し、制作フローを根本から見直し、トータルコストを従来の約90%コストカットしました。

本記事では、このプロジェクトを推進した「コンテンツ制作チーム」と、技術実装を担った「データサイエンティスト」の共同執筆という形で、ビジネス・技術の両側面からその裏側をご紹介します。


【Part 1】ビジネス課題とインパクト

なぜ「数学III」でAI活用に踏み切ったのか

Classiには、生徒の自主学習や先生の課題配信を支援する「学習トレーニング」という機能があります。数IA・IIBについてはコンテンツが充実していましたが、理系生徒にとって重要な「数III」に関しては、授業理解課題やおすすめ演習などが未対応の状態でした。

しかし、数IIIの制作には「コスト」と「期間」という2つの大きな壁が立ちはだかっていました。

  • 高額な制作費: 難易度が高いため単価が上がりやすく、特に「原稿執筆」の工程だけでコスト全体の7割強を占める構造でした。
  • 長いリードタイム: 制作開始からリリースまで、通常5〜6ヶ月を要します。

「コストを抑えつつ、いち早く生徒にコンテンツを届けたい」。

その解決策として私たちが選んだのが、従来の専門家が執筆するフローを刷新し、「生成AIに原稿執筆と図版作成を代替させ,専門家が品質のコントロールをする」というチャレンジでした。

フローの変革:AIで「工程の前倒し」と「統合」を実現

従来の制作フローでは、「原稿執筆(社外の専門家)」→「社内チェック」→「図版作成(パートナー企業)」…と、各工程が直列に進み、その都度やり取りが発生していました。

今回構築した新フローでは、生成AIに「執筆」だけでなく「図版作成」までを行わせ、さらにCMS(入稿システム)へ直接取り込めるデータ形式で出力させることにしました。これにより、執筆・図版・データ化の工程を一気に統合・短縮することに成功しました。

従来の多段階のプロセスを、AIによる一貫生成+社内チェックのフローへ刷新しました

成果:執筆費0円、期間半減

この挑戦の結果、全421問の制作において以下の成果を上げることができました。

  1. コストの大幅削減:
    もっともコストがかかっていた原稿執筆費を 0円(100%削減) にしました。図版作成費なども含めたトータルコストでは、従来の見積もりから、約90%のコストカットに成功しています。
  2. リードタイムの短縮:
    通常5〜6ヶ月かかっていた制作期間を、約2.5ヶ月へと半減(50%圧縮)させることができました。

「数学III」という制作難度の高い科目でこのモデルを確立できたことは、今後の他教科展開に向けて大きな自信となりました。


【Part 2】Gemini 2.5 Proによる「作問エンジニアリング」の実践

ここからは、「どうやって実用レベルの数学問題を生成したのか」、技術的な工夫について解説します。

生成フローの概要

使用したモデルは gemini-2.5-pro です。

私たちは「ゼロから新しい問題を作らせる」のではなく、「既存の問題(Classiに既に搭載されている問題)をベースに、条件を変えた類題を生成させる」というアプローチを取りました。

構築した生成フローは、具体的に以下のようなループ処理を行っています。

  1. 執筆ルールの読み込み: 教科共通ルールや、数III独自の記法ルールをインプット。
  2. 類題生成: 既存問題を参照させながら、指定した難易度・形式で問題を生成。
  3. 画像生成・修正: 問題に図版が含まれる場合、描画用のコードを出力させ、修正ループを回す。

1小単元ごとに処理を回し、画像が必要な場合は修正フローへ分岐します

しかし、単にプロンプトを投げるだけでは、高品質なコンテンツは作れません。特に苦労した「数式」と「図版」のプロンプトエンジニアリングを紹介します。

1. 解説中の数式の品質向上(Few-Shot プロンプト)

初期のトライアルでは、数式の計算過程に日本語の説明文が混ざり込んでしまい、可読性が悪い(数式として美しくない)出力が多発しました。

そこで、プロンプト内に「悪い例」と「良い例」を具体的に提示(Few-Shot)し、出力スタイルを厳密に制御しました。

▼ プロンプトのイメージ

  • 出力制約(Few-Shot):
    • 【悪い例】計算過程に「〜なので、」「〜を代入して」といった日本語説明が混ざっているパターン
    • 【良い例】数式のみが改行で美しく記述されているパターン

このように「やってはいけないこと」と「やるべきこと」をセットで渡すことで、AIは期待通りのフォーマットを遵守してくれるようになります。

2. 図版生成における「重なり」の回避ロジック

数学IIIのグラフ作成で最大の壁となったのが、「グラフの線と数値ラベルが重なって文字が読めなくなる」という問題です。

「重ならないようにして」という抽象的な指示では解決しなかったため、私たちは「描画コード上でどう処理すべきか」を言語化してプロンプトに組み込みました。

具体的には、グラフ描画ライブラリを利用する際、線の向き(上向き・下向き)に応じて、ラベルの配置座標(オフセット)を調整するロジックを指示しています。

(左)修正前:グラフと文字が重なっている。(右)修正後:ロジックにより適切に配置されている。

▼ プロンプトに含めたロジックの要約

  • 座標の特定: 描画コード内で定義されている要素の座標(テキスト配置位置など)を特定させる。
  • 条件分岐: 垂線の描画方向(Yの値が正か負かなど)を判定させる。
  • オフセットの適用:
    • 垂線が下向きの場合 → ラベルをX軸の「上」に配置(正のオフセット)
    • 垂線が上向きの場合 → ラベルをX軸の「下」に配置(負のオフセット)

このように、プロンプトの中で「プログラミング的な条件分岐」を定義してあげることで、AIによる図版生成の精度を劇的に向上させることができました。

3. AIと人の役割分担

もちろん、すべての問題がAIだけで完ぺきに仕上がるわけではありません。どうしてもAIでは修正しきれない複雑な図版の微調整などは、無理に自動化せず「人による修正」フローに回しました。

「AIですべてを完結させる」ことに固執せず、リスクの高い箇所に当たりをつけてトライ&エラーを繰り返し、「AIが得意な量産」と「人が得意な仕上げ」を組み合わせたことが、プロジェクト成功の鍵だったと考えています。

4. 生成AI活用における「著作権リスク」へのアプローチ

AIによるコンテンツ生成で、技術と同じくらい重要なのが「著作権侵害リスク」への対策です。 「AIがネット上の他人の著作物を勝手に学習・模倣してしまうのではないか?」という懸念に対して、本プロジェクトでは以下の2つのアプローチでリスクを最小化しました。

  1. 「自社教材」のみを元ネタにする: AIにゼロから作らせるのではなく、権利関係がクリアな「Classiの既存問題(自社教材)」をプロンプトに含め、それをベースに類題を生成させる手法(Few-Shot)をとりました。これにより、意図しない外部データの混入を防いでいます。
  2. ツールによる剽窃(ひょうせつ)チェック: 生成されたテキストに対して、剽窃チェックツール(コピペリン)を使用し、既存のWebコンテンツや他社教材と酷似していないかを確認するフローを組み込みました。

今回は「数学」という、比較的表現の幅が限定的で著作権リスクが低い教科特性もありましたが、今後、英語や国語などの長文コンテンツへ展開する際には、より慎重な権利確認プロセスを設計していく予定です。


おわりに:今後の展望

今回のプロジェクトを通じて、制作難易度の高い数IIIにおいても生成AI活用が十分に実用的であり、コスト・スピードの両面で劇的な成果を生み出せることが証明されました。 今後はこの成功モデルをベースに、以下の2つの軸でプロジェクトを発展させていく予定です。

  1. 他教科・他単元への横展開
    今回のスキームを数学の他単元はもちろん、英語や国語といった他教科へも展開し、全社的なコンテンツ制作のコスト削減・工期短縮を目指します。もちろん、教科ごとの特性に合わせ、著作権リスクや品質基準を慎重に見極めながら適用範囲を広げていきます。
  2. 生成フローのさらなる「高度化と効率化」
    数IIIでの成功の一方で、複雑なグラフ描画の微調整や、数学的な厳密性の担保においては、まだ人の手による修正やチェックが必要な場面も残りました。 今後は、取り込み資料やプロンプトのさらなる磨き込みによる精度向上はもちろん、「AIの出力結果を別のAIがチェック・修正する」といったマルチエージェント的なフローの導入も検討しています。 AI自身に品質管理の一部を担わせることで、人の介在コストを極限まで下げ、よりスピーディに、より高品質な学習コンテンツを生徒たちに届けられる体制を構築していきます。

© 2020 Classi Corp.