ACES エンジニアブログ

ACESのエンジニアブログです。

#4|Pilot-Tower開発を回してみた — 成果と摩擦のリアル

はじめに

こんにちは、株式会社ACES でテックリードをしている福澤 (@fuku_tech) です!

本シリーズでは、AI駆動開発における人間とAIの役割分担を、自動運転になぞらえた4つのPhaseで整理しています(詳細は下図を参照)。前回の記事(以降、「#3」と呼称)では、AIに運転席を譲るPhase 3の設計思想として「Pilot-Tower開発(P&T開発)」を紹介しました。plan.md をSSoTとしたループ構造、AIが判断に迷ったときだけ停止するDecision Required(DR)、そしてAIに任せない領域を定めるガードレール。この3つの仕掛けで自走と統制を両立する、という話でした。

思想については前回語りました。本記事では plan.md、DR、ガードレールなど以下の#3の記事で導入した概念を前提としているため、先にお読みいただくとよりスムーズです。では実際にこの思想で開発を回してみてどうだったか。今回は、P&T開発の実践の手触りと、そこで起きたつまずきを語ります。

tech.acesinc.co.jp

/plan-execute の実際: 1本のPRができるまで

/plan-execute は、plan.md を入力にAIが自律的に実装→品質ゲート(Lint・Tests)→レビュー→PR作成の4フェーズを回すコマンドです。

Phase 1: 実装
  └→ plan.mdに沿って実装
  └→ 適宜worklog.mdに作業のサマリーを記録
  └→ DRが必要なら停止して開発者にエスカレーション(暴走防止)

Phase 2: 品質ゲート
  └→ Lint / Format 自動実行
  └→ テスト自動実行
  └→ 失敗したらまずは自己修正
  └→ 自己修正では解消が難しい場合は別の Codex CLI 等を使って別の LLM に修正を依頼
  └→ エラーがなくなるまで or 上限回数に到達するまで繰り返す

Phase 3: レビュー
  └→ セルフレビュー
  └→ Codex CLI 等の別の LLM にレビューを依頼
  └→ 指摘があれば自動修正
  └→ 修正すべき指摘項目がなくなるまで or 上限回数に到達するまで繰り返す

Phase 4: PR作成
  └→ PRタイトル・説明を自動生成

「張り付き」から「離れられる」へ

シリーズ第二回目の記事(以降、「#2」と呼称)で解説したPhase 2の運用では、コマンド実行→出力レビュー→次のコマンド選択の繰り返しで、AIが動いている間ずっと人間が張り付いている必要がありました。AIの処理待ち時間そのものは短くても、次に何をさせるかを判断して指示を出す工程が常に発生していました。

tech.acesinc.co.jp

Phase 3では、この体験が大きく変わりました。/plan-execute に投げたら30分から2時間は離れられます。会議の裏で仮実装や本実装が進み、戻ってきたらDRに答えるかPRを確認するだけです。/plan-execute コマンドの内部にworklogの記録、DRでの停止、ガードレール領域での報告といった複雑さが隠蔽されたことで、エンジニアの認知負荷が下がりました。「planを作って育てて /plan-execute を実行する」というシンプルな運用に収束しています。

ただし、これは#2で整えたガイドライン・ガードレールという土台があってこそ回っている点は強調しておきたいと思います。

実際の事例

具体的なイメージを持ってもらうために、実際のタスクをベースに一連の流れを追ってみます。題材は、複数のSpeech(文字起こし)テキストを一括更新するAPIの実装です。以下はバックエンド側の plan.md を例に、一連の流れを追っていきます。

最初に人間がやることは、plan.md の「種」を書くことです。この段階ではGoalとざっくりした制約だけで構いません。

## Goal
複数のSpeech(文字起こし)テキストを一括更新するAPIを実装し、
フロントエンドのキーワード一括置換機能を実現する。

## Constraints
- サーバーサイドの実装のみ(フロントエンドは対象外)
- 既存のSpeech単体更新APIには変更を加えない

## Definition of Done
- 一括更新APIが正常に動作し、テストが通ること

この種を /plan-refine でAIと対話しながら育てます。CursorのPlanモードやClaude CodeのPlan機能を使ったことがある方にはおなじみの体験ですが、ポイントはその対話結果が plan.md というファイルに永続化され、後続の /plan-execute が参照するSSoTになることです。以下は /plan-refine を経て育った plan.md の抜粋です(社内固有の情報はマスキングしています)。

## Goal
複数のSpeech(文字起こし)テキストを一括更新するAPIを実装し、
フロントエンドのキーワード一括置換機能を実現する。

## Constraints
- サーバーサイドの実装のみ(フロントエンドは対象外)
- 既存のSpeech単体更新APIには変更を加えない
- 既存のbulk_executeパターンを踏襲
- All-or-Nothing(部分成功なし): 不正が1件でも含まれる場合、
  1件も更新せず4xxを返す

## Definition of Done
- 一括更新サービスが実装されている
- 空文字や最大文字数超過のバリデーションが実装されている
- 存在しないIDが含まれる場合は404を返す
- 他テナントのリソースが指定された場合はテナント隠蔽のため404を返す
- All-or-Nothing: 上記いずれかに該当するIDが1件でも含まれる場合、
  更新を1件も行わない
- DB更新と検索インデックス更新・キャッシュ削除が整合する順序で
  実行される
- 単体テストカバレッジ100%

なお、今回のように実装の方向性が見えている場合は /plan-refine の対話だけで十分ですが、要件レベルでも技術的にもふわっとしていて人間にもイメージがついていない場合は、/plan-spike(仮実装による技術検証)でカジュアルに探索的な実装をさせてみることで、制約やDoDをクリアにしていけます。

/plan-execute を実行すると、AIが自走し、実装→品質ゲート(Lint、Tests)→セルフレビュー→PR作成の一連が人間の介在なしに回ります。途中でAIが判断に迷った場合、DRを発行して停止します。このタスクでは2件のDRが発行されました。

### DR-001: バルク更新の上限件数

- Priority: P0
- Context: 一回のバルクアップデートで更新できる件数の上限
- Options:
  - A: 100件(既存のバルク操作と同じ)
  - B: 1000件(長時間会議に対応)
- Recommendation: B
- Decision: B(1000件)

### DR-002: エンドポイント設計

- Priority: P1
- Context: 新APIを既存の汎用バルク実行エンドポイントに統合するか、
  独立したエンドポイントにするか
- Options:
  - A: 既存のバルク実行エンドポイントに新オペレーションを追加
  - B: 独立した専用エンドポイントを新設
- Recommendation: B
- Decision: A(既存エンドポイントに統合)

DR-001ではAIの推奨(B: 1000件)をそのまま採用し、DR-002ではAIの推奨(B: 独立エンドポイント)とは異なるA(既存エンドポイントに統合)を選択しました。人間はDRを読んでA/Bのどちらかを書き込むだけです。選択肢と推奨案がすでに提示されているので、背景を一から調べる必要がなく、判断のコストが大幅に下がります。DR-002でAIの推奨を覆したのは、既存のバルク処理APIの実装パターンとの一貫性を優先したためです。こうしたプロダクト全体のコンテキストに基づく判断は人間が担う方が適切で、DRの仕組みがあるからこそ判断ポイントが自然に浮上し、見落とされずに済みます。

DRに答えるとAIが再走し、残りの実装を完了させます。

チームで見えてきた変化

この一括置換機能(APIと画面)の開発 (設計からmainブランチへのマージまでの全工程) は、従来であれば2〜3日と見積もっていた規模感でした。P&T開発で回した結果、人間の実稼働時間は2〜3時間で完了しました。これは私個人の体感だけではなく、API認証のClient Credentials対応など他のタスクでも同様の短縮効果がチーム内で報告されています。

AIに自走させている間に別のタスクのplanを作れるようになったことで、2〜3プロジェクトを同時並行で進められるようになったというメンバーもいます。Phase 2では人間がAIに張り付いていたため、基本的に1タスクずつの直列作業でした。Phase 3では人間の役割がDRへの判断回答に絞られたことで、並列度が上がりました。

設計判断が難しい箇所はDRでその都度判断しながら進められるため、後からAIが書いたコードを大きく手戻りさせるといったことがなくなったという実感もあります。#3で「DRのログ蓄積によってAIの自律判断範囲が拡大し、人間の介入がさらに減っていく」と書きましたが、実際にその兆候は出始めています。似たような設計判断が過去のdecision-logに蓄積されることで、以前はDRに上がっていた判断がAI側で自律的に処理されるケースが増えてきました。

エンジニアだけでなく、非エンジニアによる実践事例も出てきています。例えば、PdMがP&T開発を用いてスマホアプリの不具合修正を自ら完結させたケースです。これまでエンジニアの工数を待たなければならなかった微細な修正が、PdMの手によって迅速に解消されるようになりました。この事例における具体的な実装ロジックはほとんどAIの生成結果そのままであり、コードレビューこそエンジニアが最終確認として実施したものの、品質担保の軸は実機での動作確認に置かれていました。P&T開発の仕組みが、個人のコード執筆能力とは別のレイヤーで品質を担保しているからこそ成り立っている、象徴的な事例だと考えています。

つまずきとその乗り越え方

成果だけを並べると順風満帆に聞こえるかもしれませんが、もちろんつまずきもありました。ここでは、実際に起きた失敗エピソードとその対処を率直に共有します。

git reset --hard で数時間分の作業が消えた

初期に起きた分かりやすい失敗です。AIが自走中に git reset --hard を実行し、数時間分の作業が消えました。実際には git reflog で復元できたので事なきを得ましたが、破壊的な操作を勝手に判断して実行されると、心理的にAIに任せにくくなります。

対処はシンプルで、 settings.json に禁止操作として明記しました。ルールに書けば再発しない。AIのやらかしは仕組みで潰す、という原則を最初に教えてくれたエピソードです。

コンテキスト蓄積による精度低下

AIが長時間稼働すると、コンテキストウィンドウに情報が積み上がりすぎて判断精度が落ちるという課題もあります。後半のタスクでガードレール領域に不用意に手を出しそうになったり、前半で合意した方針と矛盾する実装をしたりすることがありました。

現状では、セッションを意図的に切り替えて plan.md で状態を復元する運用と、SubAgentsの活用で緩和しています。plan.md がSSoTとして機能しているからこそ、セッションを切っても文脈を失わずに再開できます。ただ、完全な解はまだ見つかっていません。

「手放す怖さ」をどう越えたか

技術的なつまずき以上に大きかったのは、心理的な壁です。「AIに任せて大丈夫なのか」「本番に出して問題ないのか」という不安は、仕組みの説明だけでは払拭できませんでした。

この不安を越えるために、モブプログラミング会(90分×4回)を実施しました。チームメンバーが実際に一緒にP&T開発を動かす場を設け、DRできちんと停止すること、ガードレール領域に触ったらAIから報告が来ること、Lint→Tests→セルフレビュー→別LLMによるレビューを通過した上でPRが作られること、この一連を目の当たりにしてもらいました。百聞は一見にしかずという諺の通り、品質ゲートが実際に機能する様子を確認できたことで、不安が払拭され大きな手応えを得ることができました。

ここ数ヶ月の運用で、AIの実装に起因するインシデントは0件です。#2で整えた土台(ガイドライン・品質ガードレール・AI向けドキュメント)が効いている結果だと考えています。皮肉なことに、この間にヒヤリハット*1が起きたのはむしろ人間が書いたコードの方でした。

今いちばんの悩み: 巨大PRとレビューの限界

一方で、まだ乗り越えられていない課題もあります。AIが自走してくれるのはいいのですが、1つのPRに大量の変更を詰め込んでくるケースが頻発します。品質ゲート(lint・テスト・セルフレビュー・別LLMレビュー)は通っているものの、変更差分の大きなPRが量産されると、人間側のレビューが追いつきません。「これ本当に出して大丈夫か?」という不安が残り続けます。

暫定策としては、タスクを設計段階で小さく分解してから /plan-execute に渡すことでPR粒度を制御したり、PRを意味のある単位に分割するスラッシュコマンドで事後的に対処したりしています。ただ、これらはいずれも人間の介在を増やす方向の対処です。#1で「人間が運転席に座り続ける限り、AIの稼働時間は人間の稼働時間に縛られる」と書きましたが、タスク分解やレビューについても同じ構造が当てはまります。人間の手数を増やすことでしか品質を担保できない状態では、ボトルネックが別の場所に移るだけで、AIの自律稼働時間を最大化するという当初の目的はスケールしません。

この問題は、タスク分解自体をAIに動的にやらせることで緩和できる可能性もあります。Claude CodeのTask Systemのように、AIが実装中にサブタスクを切り出して並列処理する仕組みを応用すれば、結果的にPRの粒度も小さくなることが期待できます。現在試験的に導入を始めていますが、本格運用はこれからです。

さらに言えば、そもそもこの問題自体が一過性のものかもしれません。GitHub元CEOのThomas Dohmke氏が新会社Entireを立ち上げた際にXで発信していたように、コードを理解してレビューするという行為自体が死にゆくパラダイムだとすれば、意図と成果を検証するワークフローへの移行が進み、人間がコードを逐一レビューする前提自体が変わりうる。そうなれば、PR粒度の問題も構造ごと解消される可能性もあります。

とはいえ、その日まで待つわけにはいきません。本命は、人間の目視に頼らなくても安全にリリースできる仕組みです。「壊れないようにする」だけではなく「壊れても速く直せる」リリース安全網が整えば、レビューで事前に品質を担保しなければならないという不安を感じにくくなる効果があると考えています。次回の#5|AIが書いたコードをどう本番に出すか(2026/03/18公開予定)では、そのアプローチについて語ります。

おわりに

P&T開発を数ヶ月回してみて、planを作って /plan-execute を投げるというシンプルな運用に収束し、人間はAIの自走中に別のタスクを進められるようになりました。一方で、AIの暴走やコンテキスト蓄積、巨大PRのレビュー負荷といったつまずきも経験しました。ルールに書けば再発しないものは仕組みで潰し、構造的に解決できないものは投資先を見極めて手を打つ。そして、その仕組みが本当に機能することをチームで一緒に体験して初めて、次のステップに進めます。その積み重ねが、小さなチームで大きなことをやる力になると考えています。

ACESでは現在、複数のエンジニアポジションで採用を行っています。本シリーズを読んでACESの開発に興味を持っていただけた方は、ぜひカジュアル面談でお話ししましょう!

ACESの採用情報はこちら↓

recruit.acesinc.co.jp

open.talentio.com

*1:デプロイ直後に検知し、影響ユーザー0人で即revert

#3|AIが自走し、人間は管制する — Pilot-Tower開発の設計思想

はじめに

こんにちは、株式会社ACES でテックリードをしている福澤 (@fuku_tech) です!

本シリーズでは、AI駆動開発における人間とAIの役割分担を、自動運転になぞらえた4つのPhaseで整理しています(詳細は下図を参照)。前回の記事では、人間が運転席に座りつつAIに作業実行を任せるPhase 2として、開発プロセスをサブプロセス単位に分解し、スラッシュコマンドとしてAIに割り当てる実践を解説しました。コマンド単位ではAIが精度よく動くようになった一方で、コマンド間をつなぐ「次に何をすべきか」の判断は常に人間が担っている、という構造的な限界が見えてきました。

今回は、この「組み合わせて回す」役割自体をAIに委ねるPhase 3の設計思想について解説します。私たちが「Pilot-Tower開発」と名付けたこのアプローチが、どういう問いから出発し、どういう思想に至り、どういう仕組みに結実したのか。設計の思想と仕組みに焦点を当てます。

Phase 3とは何か: 「管制塔モデル」への転換

Phase 2の限界の再確認

Phase 2では、人間が運転席に座りながら「コマンド実行→出力レビュー→次のコマンド選択→実行」のループを回していました。各コマンドの実行精度はAIのおかげで十分に上がりましたが、このループ自体は人間が回している以上、AIの稼働時間は人間の稼働時間に縛られます。会議中も、夜間も、AIは人間の次の指示を待っている状態です。

Phase 3の定義

Phase 3は、運転席自体をAIに譲るフェーズです。AIが自ら計画を読み、実装し、検証し、次のステップを判断して進む。人間は管制塔として、AIが「自分では判断できない」と停止したポイントにだけ介在します。

観点 Phase 2 Phase 3
運転席 人間 AI
人間の役割 コマンド選択→実行→レビュー→次のコマンド選択... 要所での判断のみ

Pilot-Tower開発というメタファー

この役割分担を、私たちは航空管制に見立てて「Pilot-Tower開発」(通称P&T開発)と呼んでいます。AIがPilot(操縦)、人間がTower(管制塔)です。

命名には意図があります。後述するHarness EngineeringやSDD(仕様駆動開発)といった考え方が最近注目されていますが、それらはコードベースやインフラの環境設計、あるいは仕様書を起点としたワークフローに主眼を置いています。私たちがPilot-Tower開発と名付けたのは、開発プロセスそのものの設計に焦点を当てているためで、既存の概念とはレイヤーが異なると考えたからです。この違いについては後ほど詳しく触れます。

核心問題: AIに自走させつつ逸脱を防ぐ

Phase 3の設計で向き合うべきトレードオフは明快です。AIに自走させるほど人間の手は空くが、逸脱のリスクも高まる。逸脱を防ごうとチェックポイントを増やせば、結局Phase 2に逆戻りする。このトレードオフをどう解くかが、今回のテーマです。

思想: 上流と下流の境界を溶かす

プロセスの構造そのものが問題だった

#2|スラッシュコマンドで回す開発 — プロセスを分解してAIに割り当てるでの結論は「プロセスを細分化してAIに渡せば精度は上がる」でした。これは正しいのですが、個々のコマンドの精度が上がっても、人間が毎回つなぎ直すループが残っている限り、スループットは人間の処理速度に律速されます。解くべきは個々の精度ではなく、プロセスの構造そのものではないかと考えました。

なぜ「仕様を先に固める」だけでは足りないのか

従来のソフトウェア開発は、要件定義→設計→実装という直列プロセスが基本です。上流が詰まると全体が止まる。最近は「vibe codingではなく、まず仕様を書こう」という方向性が注目されていますし、その方向性自体は正しいと考えています。

ただ、私たちがPhase 3で解きたかった問題は、「AIの出力精度を上げる」ことのさらに先にありました。出力精度の向上はもちろん重要ですが、私たちの問題意識は、人間の関与を最小化し、AIの自律稼働時間を最大化することにあります。仕様の精度がいくら上がっても、人間がゲートとして介在し続ける構造のままでは、AIの稼働時間は人間の稼働時間に縛られたままです。この構造自体を変えたいと考えました。

【直列プロセス】
要件定義 → 設計 → 実装 // 上流が詰まると全体が止まる

要件定義・設計・実装の境界を溶かす

この問題意識から至った思想の転換は、要件定義・設計・実装の境界を溶かすというものです。

「どういう要求を満たし、どんなユーザー体験を提供したいか」(What/Why)さえ明確であれば、How(どう実装するか)はAIが探索的に実装しながら、影響範囲やリスクを洗い出せます。要件定義の完了を待ってから設計・実装に入るのではなく、探索ループの中で要件の理解・設計の具体化・仮実装による検証が相互にフィードバックし合いながら深まっていくイメージです。仕様は完成品ではなく、探索を通じて育てていく指針として扱います。

【同時に回すプロセス】
      What/Why を定める
            │
      ┌─────┼─────┐
      ↓     ↓     ↓
  要件の   設計の   仮実装で
  深掘り   具体化   検証
      └─────┼─────┘
            ↓
     plan.md に知見を蓄積
            │
        本実装へ

ただし、探索と本実装は明確に分けています。探索はあくまで捨てる前提の仮実装(plan-spike)であり、コードは捨てても、得られた知見は plan.md に蓄積されます。

3つのモードで不確実性を段階的に減らす

具体的には、以下の3つのモードを使い分けて不確実性を段階的に減らしていきます。

モード 目的 成果物
plan-refine 対話で計画を詳細化 plan.md の更新
plan-spike 仮実装で技術検証 知見(コードは捨てる)
plan-execute 本実装 プロダクションコード + PR

plan-refineは、AIと対話しながら plan.md の不明瞭な点や矛盾を潰していくモードです。plan-spikeは、実際にコードを書いて技術的な不確実性を検証するモードで、コードは捨てる前提ですが学びは plan.md に残します。この2つのモードで十分に不確実性が減ったら、plan-executeで本実装に移行します。

移行の目安として、セッションを切り替えて別のLLMに「この plan.md だけで迷いなく実装できるか」をレビューさせるという方法を使っています。実装文脈を持たない別のLLMが問題なく理解できるなら、plan.md は本実装に十分な精度に達していると判断できます。

仮実装が効いた実例

直近で取り組んでいる認可基盤の大幅アップデートで、plan-spikeの効果を実感しました。このタスクでは、Cerbosという新規ライブラリの導入、既存コードベースの整理、データ移行の安全性確保、機能的な後方互換性の維持と、不確実性とリスクが多く重なっていました。

初手でplan-spikeを実施したことで、いくつかの重要な知見が得られました。実装イメージが具体的になったこと、影響範囲の洗い出しができたこと、そして何より、本格的な指示を与えていない状態でAIがどういう設計・実装をしてしまうかを事前に把握できたことが大きかったです。この「AIの癖」を事前に知れることで、plan.md の制約やDoDをより的確に書けるようになります。

一方で、plan-refineの対話だけで十分にイメージが掴める場合もあります。実装者がAIからの質問に一問一答で回答していくだけで計画が固まるようなケースでは、仮実装を挟む必要はありません。見えていないものが多いタスクほど、plan-spikeの価値は高くなります。

各タスクにおけるSSoTとしての plan.md

この思想が結実したのが、各タスクにおけるSSoT(信頼できる唯一の情報源)として機能する plan.md です。ここで重要なのは、plan.md は人間が読み書きする仕様書ではないという点です。AIが読み、AIが更新し、AIがそれに基づいて自律的に判断するためのドキュメントです。人間はGoalやConstraintsの大枠を与えますが、探索ループの中で plan.md が詳細化されていく過程を細かくレビューするわけではありません。大事なポイントだけ確認し、問題なければ実装を進めてもらうという運用です。

plan.md には、Goal(何を達成するか)、Constraints(やらないこと・守るべきルール)、DoD(完了条件)を記載します。最初は「種」の状態で構いません。探索ループを通じて育てていけばよいからです。

## Goal
<!-- このタスクで実現すること。1-2行で簡潔に -->

## Constraints
<!-- やらないこと・守るべきルール -->

## Definition of Done
<!-- 完了とみなす条件。検証可能な形で -->

plan.md は静的な仕様書ではなく、開発が進むにつれて常に更新される「生きたドキュメント」です。AIは plan.md を読むことで「何をすべきか」「何をしてはならないか」「いつ完了とみなすか」を自律的に判断でき、人間に確認する回数を極限まで減らせます。

つまり、人間がやることの起点は plan.md の種を与えることであり、Goal(何を達成するか)、Constraints(やらないこと)、DoD(完了条件)を定めることです。最初からすべてを詰める必要はなく、ラフな種から始めて探索ループで育てていけるのがこの設計の強みです。ただし、AIに自走させるには「次に何をすべきかをどう判断するか」「判断に迷ったらどうするか」「踏み込んではいけない領域をどう守るか」という仕組みが要ります。次に紹介する3つの仕掛けが、これらを解決します。

自走と統制を両立する3つの仕掛け

思想だけでは仕組みにならないので、Pilot-Tower開発では3つの仕掛けで自走と統制を両立させています。

仕掛け1: ループ構造

Phase 2では人間がスラッシュコマンドの連鎖を手動で回していましたが、Phase 3ではこのループ自体をAIが回します。

plan.md → 実装/検証 → worklog.md → DR抽出 → plan.md更新
   ↑                                        ↓
   └────────────────────────────────────────┘

AIは plan.md を読んで実装を進め、作業ログを worklog.md に記録し、判断が必要な事項をDR(Decision Required、後述)として抽出し、plan.md を更新する。このサイクルを人間の介入なしに回し続けます。

仕掛け2: Decision Required(DR)

AIが自走中に「自分では判断できない」と認識した場合、DRを発行して停止します。DRには設計原則があります。

まず、DRはブロッカーに限定します。進行を止める判断のみをDR化し、些末な確認事項でAIを止めません。次に、A/B形式で選択肢と推奨案を提示します。人間は背景を読み込んで判断を組み立てる必要はなく、選択肢の中から選ぶだけです。

### DR-001: 移行の進め方(一括 vs 段階的)

- Priority: P1
- Context: 約145個の関連クラスが存在し、約53個が未移行...
- Options:
  - A: **一括移行** - 未移行の関連クラスを一度に移行
  - B: **段階的移行** - ドメインごとに分けて順次移行
- Recommendation: B(段階的移行)
- Reason: PRが巨大になりレビューが困難、問題発生時の影響範囲を限定できる...
- Decision: <!-- ここに A or B を記入するだけ -->

実際の運用では、1つのタスクで発生するDRは多くても3〜5個程度です。しかもDRへの回答はdecision-logとして蓄積され、AIが過去の判断パターンを参照できるようになるため、似たような判断は今後DRに上がらなくなっていく方向に進みつつあります。

運用イメージとしては、AIが夜間や会議中に自走し、判断が必要な箇所でDRを出して停止する。人間は翌朝まとめてDRに回答すると、AIが再走し始めます。いわば「AIとの朝会」のようなリズムです。

仕掛け3: ガードレール

3つ目の仕掛けは、AIに任せない領域を事前に定義するガードレールです。認証・認可、課金・決済、セキュリティ・プライバシー、コアビジネスロジック、不可逆操作、外部公開APIの破壊的変更といった領域は、AIが触れた場合に自動的にDRが発生し、必ず人間がレビューする設計になっています。

ポイントは「何を任せるか」ではなく「何を任せないか」を定めていることです。任せない領域さえ明確にすれば、それ以外はすべてAIに委ねられます。#2では、人間が必ずレビューする領域の線引きとしてガードレールに触れましたが、Phase 3ではこれをAIの自走中に自動的にDRを発生させる仕組みとして機能させています。なお、ガードレールの具体的な内容はプロダクトの特性によって変わります。私たちのプロダクトでは会議データという機密性の高い情報を扱うため上記の領域を定めていますが、別のプロダクトであれば異なるラインになるはずです。

3つの仕掛けが「自己改善するシステム」を成す

これら3つの仕掛けは、独立した機能ではなく、互いに連動して使うほど賢くなるシステムを成しています。

DRのログ蓄積によってAIの自律判断範囲が拡大し、人間の介入がさらに減っていきます。worklogの蓄積によってよく詰まるパターンが可視化され、ガイドラインやスキルの追加・改善につなげられます。この自己改善のループが回り続ける限り、Phase 3は時間とともに成熟していく設計になっています。実際、まだ数ヶ月の運用ですが、開発がどんどん安定して回るようになってきている実感があります。

加えて、この仕組みは「失敗を許容する」設計でもあります。緊急度の高いタスクでは人間の介在を増やしてしっかりレビューしますが、時間的な余裕があるタスクは、あえてAIに自走させて失敗パターンを蓄積する「成長タスク」として捉えることもあります。上手くいかなかったケースはフィードバックとして残し、次のタスクに活かす。このサイクルを回すことで、システム全体が育っていきます。

業界の潮流と私たちのアプローチ

近いアプローチとの関係

最近、AIを前提とした開発の進め方にいくつかの方向性が出てきています。ここでは、私たちのPilot-Tower開発と関係の深い2つのアプローチを取り上げ、それぞれの位置づけを整理します。

2026年2月、OpenAIが「Harness Engineering」*1というアプローチを発表しました。3人のエンジニアがCodexエージェントを使い、人間が一切コードを手書きしないという制約のもとで約100万行のプロダクトを構築した実践報告です。リンター、構造テスト、CI、Observabilityといった環境を整えることで、AIが自律的に動ける「ハーネス(馬具、制御装置)」を構築するという考え方です。

また、SDD(仕様駆動開発)*2は、KiroやGitHub Spec Kit等のツールとともに広まりつつあるアプローチで、仕様書の品質を上げることでAIの出力精度を向上させるワークフローを体系化しています。

私たちのPilot-Tower開発を含め、これらのアプローチは「AIに自律的に動いてもらうために何を整えるか」という同じ問いに対する異なるアプローチだと考えています。

比較軸 Harness Engineering SDD(仕様駆動開発) Pilot-Tower開発
設計のゴール AIが正しく動ける環境を作る AIの出力精度を仕様の品質で上げる 人間の関与を最小化しAIの自律稼働時間を最大化する
主な焦点 コードベース・インフラの環境設計 仕様書を起点としたワークフロー 開発プロセスの設計
仕様の位置づけ 仕様書は明示的には扱わない(環境・ツールで制御) 人間が策定しAIに渡す起点ドキュメント AIが自律的に更新し続ける「生きたドキュメント」(plan.md
整えるもの リンター、構造テスト、CI、Observability等 要件定義書、設計書、タスクリスト等 plan.md、DR、 worklog.md、ガードレール等
人間の介在 環境設計とPRレビュー 仕様策定と承認ゲート DRへの判断回答

これらは対立するアプローチではなく、レイヤーが異なる補完関係にあると考えています。AIが自律的に動ける環境を整えること(Harness Engineering)、AIに渡す仕様を体系化すること(SDD)、AIが自律的に動くプロセスを設計すること(Pilot-Tower開発)は、それぞれ異なるレイヤーで同じ方向を向いています。私たちはプロセス設計のレイヤーからこの問いにアプローチしています。

なお、これらのアプローチを正確に比較するには、それぞれを本格的に実践してみる必要があります。上の整理はあくまで公開情報に基づく私の解釈であり、実際の運用上の差異はもっと複雑だろうと思います。

次回予告

思想と設計の話はここまでです。ではこの設計思想で実際に開発を回してみてどうだったか。DRのリアルな運用、想定と異なったポイント、そして成熟に伴うチームの変化について、次回の #4|P&T開発を回してみた — 成果と摩擦のリアル(2026/03/11公開予定)で解説します。

おわりに

Phase 3の設計を通じて一貫しているのは、「AIに任せること」と「放任すること」は違うという認識です。plan.md で方向を定め、DRで判断を止め、ガードレールで領域を守る。この3層があるから安心して任せられますし、使い続けるほどシステム全体が成熟していきます。

この設計は、小規模チームで大きなことをやるために、必然的にたどり着いたものでもあります。人間の稼働時間に縛られない開発スループットを実現することが、私たちにとってはAI駆動開発の核心です。

正直なところ、この設計が理想通りに回るかどうかは、まだ日々検証中です。次回は、実際にこの設計で開発を回した中で見えてきた成果と摩擦を率直にお伝えします。

ACESでは現在、複数のエンジニアポジションで採用を行っています。本シリーズを読んでACESの開発に興味を持っていただけた方は、ぜひカジュアル面談でお話ししましょう!

ACESの採用情報はこちら↓

recruit.acesinc.co.jp

open.talentio.com

*1:https://openai.com/index/harness-engineering/

*2:SDD(Spec-Driven Development / 仕様駆動開発)について、私たち自身は実践していないため、本記事では公開情報に基づく概念的な位置づけの整理にとどめています。

#2|スラッシュコマンドで回す開発 — プロセスを分解してAIに割り当てる

はじめに

こんにちは、株式会社ACES でテックリードをしている福澤 (@fuku_tech) です!

前回の記事では、AI駆動開発の4フェーズモデルを紹介し、「人間が運転席に座り続ける限り、AIの稼働時間は人間に縛られる」という構造的な課題を提示しました。

tech.acesinc.co.jp

この構造を変えるにはAIに運転席を譲る必要がありますが、それには人間のマインドセットの転換も不可欠であり、一朝一夕に実現できるものではありません。AIが自律的に動くためには、まず人間とAIの役割分担を整理しておく必要があります。つまり、「何をAIに任せ、どう動かすか」を事前に決めておくことが求められるのです。

今回はその役割分担の設計の話です。鍵になるのは、開発プロセスを細かく分解して、AIが実行できる単位に落とし込むことです。「プロセスの細分化」と「スラッシュコマンドへのマッピング」という2つの軸で、私たちがPhase 2をどう組み立てたかを解説します。

Phase 2のリキャップ

Phase 2(Hybrid Co-Driving)は、人間が運転席に座り、AIに実行を任せる分業モデルです。「何をするか(What)」と「出力の品質判断(Review)」は人間が担い、「どうやるか(How)」はAIに任せます。

この分業を成り立たせるために導入したのが「スラッシュコマンド」です。人間がこれまで手作業でやっていた繰り返し作業をコマンドとして定義し、AIに実行させます。たとえば「ブランチを切る」「コードレビューをする」「PRを作る」といった作業を、 /branch-create /code-review /pr-create のようなコマンドに対応させます。

人間はコマンドを選んで実行し、出力をレビューして次のコマンドを選ぶ。この繰り返しでPhase 2の開発フローが回ります。

プロセスを分解して、スラッシュコマンドを割り当てる

なぜサブプロセス単位まで分解するのか

Phase 2の核心は、業務プロセスを細分化し、各サブプロセスにスラッシュコマンドを対応させることです。(以降、スラッシュコマンドは単に「コマンド」と呼称します。)

「要件定義して」「設計して」のような大きな粒度でAIに投げても、期待通りの精度は出にくいと感じています。曖昧な指示はAIの出力を不安定にし、人間のレビューコストをかえって増やしてしまいます。サブプロセス単位まで分解して初めて「ここは人間が判断すべき」「ここはAIに任せられる」という線引きが明確になります。

実際に開発プロセスを分解すると、次のようなイメージになります。

なお、この考え方は開発に閉じたものではなく、汎用的に利用できます。業務プロセスを理解する→細分化する→AIに任せる領域を選定する→コマンド化(エージェント化)するという流れは、マーケティングやCS、リサーチなど他の領域にも横展開できます。この点は、2026/03/25公開予定の#6「1チームの実践を、組織の力に変える」で改めて取り上げます。

設計原則: 単一責任とUNIX哲学

コマンドを設計するうえで最も重要な原則は、「1つのコマンドに1つの責務だけを持たせる」ことです。小さなコマンドを組み合わせて大きな作業を実現するという、UNIX哲学に通じるパイプライン的な発想で設計します。

この原則を守らないと何が起きるか。複数の責務を1つのコマンドに詰め込むと、Context Confusion(コンテキストの混乱)やContext Rot(コンテキストの劣化)が発生し、後半の工程がスキップされたり、仕様と異なるコードが生成されたりと、品質が不安定になります。しかもどの指示がボトルネックなのか特定も困難です。責務ごとにコマンドを分割することで、この問題は解消されます。サイバーエージェント社のテックブログ*1でも同様の知見が報告されています。

具体的な手順

コマンドを整備するための手順は、以下のように整理できます。

  1. 既存の開発フローを棚卸しし、定型的に発生する作業を特定する
  2. 各作業を「入力→処理→出力」の形に分解する
  3. AIに実行させるコマンドとして定義する
  4. コマンドの精度を左右するガイドラインやルールを整備する

特に4のガイドライン整備は見落とされがちですが、コマンドの出力品質を安定させるうえで欠かせません。コーディングルール、命名規則、アーキテクチャの方針といったドキュメントが、AIが正確に動くための前提条件になります。私たちが具体的に何を整備したかは、後述の「なぜワークしたか」セクションで詳しく解説します。

コマンドの実例

私たちACES Meet開発チームでは、一例として以下のようなコマンドを運用しています。

コマンド 責務
/branch-create 実装内容に基づいて新規ブランチを自動作成
/api-build 対話的にAPIを実装
/code-scan 変更差分に対するクイックレビュー
/code-review 各レイヤーに対する詳細なセルフレビュー
/code-refactor レビュー指摘に基づくクイックフィックス
/commit 意味のある変更単位でのコミット自動生成
/pr-create PRタイトル・説明の自動生成とプッシュ
/pr-comment PR上のポイント箇所にセルフコメントを付与

これらを表の上から順に実行することで、ブランチ作成からPRコメントまでの一連の開発フローが回ります。各コマンドが単一責任を持っているため、問題が起きたときにどのステップが原因かすぐに特定できますし、特定のコマンドだけを差し替えたり改善したりすることも容易です。なお、/api-build/commit のように、内部的に複数のコマンドをパイプしたオーケストレーションコマンドも混在しています。たとえば /commit は内部で /commit-stage/commit-create がパイプされています。この発展形については次のセクションで説明します。

発展形: オーケストレーターコマンド

コマンドを使い込んでいくと、自然と「複数のコマンドを組み合わせた上位コマンド」が欲しくなります。たとえば、レビューからリファクタまでの反復ループを1つのコマンドにまとめるような発想です。

このオーケストレーターコマンドは、Phase 3への布石でもあります。Phase 2ではこの「組み合わせて回す」役割を人間が担っていますが、Phase 3では運転席自体をAIに譲ります。AIが自律的にプロセスを回し、人間は判断が必要な箇所にだけ介在する。そのために必要な探索ループ、判断停止の仕組み、ガードレールの設計思想を次回の記事にて解説します。

なぜワークしたか

すでにあった下地

Phase 2への移行がスムーズに進んだ背景には、もともとチームに備わっていた前提条件がありました。

開発プロセスが可視化・標準化されていたことで、全員が同一のフローで動けていたため、「どの作業を切り出してコマンド化するか」の議論が具体的に進められました。また、コーディングルールがすでに文書化されていたため、AIに渡すガイドラインの整備もゼロからではなく、既存資産をベースに拡張する形で進められました。

意図的に作った下地

一方で、AI駆動開発のために意図的に整備したものもあります。2025年12月の約1ヶ月間を準備期間とし、私が既存のプロセスを見直しながら以下の整備を進めました。2026年1月からチーム運用を開始し、現在も継続中です。

まず、ユビキタス言語の整備です。社内固有の概念や用語が一般的な意味と異なる場合、そのままプロンプトに入れてもAIが適切に解釈できないことがあります。プロダクト内の用語を整理し、AIが正確に理解できる状態を作りました。

次に、各種ガイドラインの整備です。コーディングルール、命名規則、アーキテクチャ方針、テスト方針といったドキュメントを、AIが参照できる形に整えました。これがコマンドの出力精度を左右する最も重要な要素です。ガイドラインが曖昧なままだと、チームで使ったときに出力の精度が安定しにくくなります。

なお、認証・認可やコアビジネスロジックといった人間が必ずレビューする領域の線引き(ガードレール)もガイドラインの一部として定めています。

これらのガイドラインをAIが必要なタイミングで参照できるよう、AGENTS.mdCLAUDE.md(プロジェクトルートに配置するAI向けの設定ファイル)で各ドキュメントの場所を示すようにしています。ポイントは、ファイルの中身を直接埋め込むのではなく、パスだけを記載している点です。たとえば、以下のようにドキュメントの場所を一覧で示しています。

## Quick Reference

Refer to these resources proactively as needed during development.

| What | Where |
|------|-------|
| **Product Overview** | `docs/guidelines/acesmeet-overview.md` |
| **DB Design** | `docs/guidelines/db-design-guideline.md` |
| **API Design** | `docs/guidelines/api-design-guideline.md` |
| **Architecture** | `docs/guidelines/architecture-guideline.md` |
| **Coding Style** | `docs/guidelines/coding-guideline.md` |
| **Code Quality & Testing** | `docs/guidelines/code-quality-charter.md` |
| **Error Handling Guideline** | `docs/guidelines/error-handling-guideline.md` |
| **Ubiquitous Language** | `docs/glossary/ubiquitous-language.csv` |

こうすることで、AGENTS.md / CLAUDE.md 自体は目次のような役割に留まり、AIが必要なタイミングで必要なドキュメントだけを参照しにいく段階的開示の構造になります。セッション開始時にすべてをコンテキストに載せない設計にすることで、コンテキストの肥大化を防いでいます。

下地が成否を分ける

Phase 2の成否は、こうした「下地」で決まるというのが私たちの実感です。#1|AI駆動開発の4フェーズと私たちの現在地でも述べたとおり、マインドセットの転換自体は小さいものの、チームとして再現性のある状態に持っていくには、この下地づくりが成否を分けます。人間がやっていることを言語化し、コマンドとして定義し、AIに実行させていく。やること自体はシンプルですが、下地の整備には相応の労力がかかります。私たちの場合、2025年12月の約1ヶ月を集中的な準備期間に充てました。ただ、下地を一気に整えたこととチームのモチベーションが高かったことで、その後の運用立ち上げは想像以上に速く、Phase 2からPhase 3の入口まで数ヶ月で到達できました。

一方で、ガイドラインが不十分なままチームで使い始めると、コマンドの出力精度は安定しにくくなります。Phase 2を機能させるうえで、下地の整備は欠かせないステップだと考えています。

Phase 2の限界

Phase 2の運用が回り始めると、別の課題が見えてきます。

毎回「コマンドを実行する→出力をレビューする→次のコマンドを選択する→実行する」という人間介在のループが発生します。各コマンドの実行自体はAIが担いますが、コマンド間の接続、つまり「今の出力は問題ないか」「次に何をすべきか」の判断は常に人間です。

人間が運転席に座り続ける限り、AIの稼働時間は人間の稼働時間に縛られる。これは#1で提示した構造問題そのものです。Phase 2はその問題を解消するものではなく、AIが動ける範囲を広げるための土台づくりでした。

次のステップは、「組み合わせて回す」役割自体をAIに委ねることです。AIが自律的にプロセスを回し、人間は判断が必要な箇所にだけ介在する。それがPhase 3の話です。

おわりに

Phase 2を始めるにあたって、まず試してみてほしいのは、自分のチームの開発フローを一度棚卸ししてみることです。「この作業は毎回同じ手順を踏んでいる」と気づいたら、それがコマンド化の候補です。小さく始めて、ガイドラインを育てながら広げていくのが現実的な進め方だと思います。

ただし、Phase 2を回していくと、「毎回人間がコマンドをつなぐループ」がボトルネックになることにも気づきます。次回の記事では、このループ自体をAIに委ねる「Pilot-Tower開発」の設計思想について解説します。

tech.acesinc.co.jp

ACESでは現在、複数のエンジニアポジションで採用を行っています。本シリーズを読んでACESの開発に興味を持っていただけた方は、ぜひカジュアル面談でお話ししましょう!

ACESの採用情報はこちら↓

recruit.acesinc.co.jp

open.talentio.com

#1|AI駆動開発の4フェーズと私たちの現在地 — AIに運転席を譲れるか

はじめに

こんにちは、株式会社ACES でテックリードをしている福澤 (@fuku_tech) です!

Cursorでコードを書かせ、Claude Codeで設計を壁打ちし、テスト生成まで任せる。AIコーディングツールがこの1〜2年で一気に進化して、個人の開発スピードは間違いなく上がりました。

私たちもその恩恵を受けています。

一方で、ふと立ち止まると違和感がありました。個人の作業は確かに速くなった感覚はあるものの、同じ8時間の営業時間内でチーム全体の生産性が2倍になったかと聞かれると、残念ながらそこまでの実感はありません。チーム内でもベストプラクティスは共有され、一定程度の改善は回っていましたが、点と点が繋がる(体系的に積み上がっていく)感覚がなかったというのが正直なところです。

そういったモヤモヤの原因はシンプルで、人間が運転席に座り続けていることそのものではないかと考えました。

AIがコードを出力し、人間がレビューし、次に何をさせるか考えて指示を出す。この「判断→指示→レビュー」のループが、結局のところ人間の処理速度に律速されています。

人間が運転席に座り続ける限り、AIの稼働時間は人間の稼働時間に縛られるという構造を変えるには何を変えればいいのか。この記事から始まるシリーズで、その問いに対する私たちなりの整理と実践を共有していきます。

AI駆動開発の4フェーズ

私たちは、自動運転のレベル分けになぞらえて、AI駆動開発の進化を4つのフェーズで整理しています。

Phase 名前 説明 人間の役割
1 AI Copilot 人間が運転席、AIは助手席 全ての判断・実行を人間が行う
2 Hybrid Co-Driving 運転席を頻繁に交代 判断は人間、実行はAIに任せる
3 Supervised Autonomy 短時間、AIに完全に運転席を譲る 監視とレビュー
4 Full Autonomous 長時間、AIが自律的に稼働 意思決定のみ

現在、世の中の多くの開発チームはPhase 1〜2あたりにいると感じています。GitHub CopilotやCursorのTab補完はPhase 1の典型例で、便利ですがあくまで人間の手の延長です。Phase 2では人間が作業を言語化し、AIに実行させる形になりますが、主導権はまだ人間にあります。Phase 3に入ると、AIが自ら計画・分解・実行を回し、人間は要所でレビューして方向を修正する「管制塔」の役割に移ります。Phase 4のフルビジョンは、多くのチームにとってまだ構想段階でしょう。

核心は「誰が運転席に座るか」

この4フェーズを貫く軸はシンプルで、誰が運転席に座るかという一点だけです。

Phase 1と2では、タスクの分解、実行順序の決定、品質判断等のすべての採配を人間が握っています。Phase 3と4では、その採配をAIに委譲する。つまり、Phase 2から3への移行が、最も本質的な転換点になります。

移行の難所

Phase 1から2への移行は、マインドセットの転換としては小さなものです。運転席に座るのは人間のままで、「自分で書く」から「AIに書かせて自分がレビューする」へのシフトだからです。実際、プロンプトを都度書いてAIに作業させるだけなら、すぐにでも始められます。ただし、それだけでは個人の使い方の域を出ません。一口にPhase 2と言っても、チームとして再現性のある状態に持っていくには、開発プロセスの分解、AIが動ける範囲の整備といった地盤づくりが必要で、この準備が成否を分けます。

Phase 2から3への移行は、まったく別の難しさがあります。「自分がやった方が正確」「自分がやった方が結局早い」という考えを手放し、AIに運転席を譲ってスケールさせる方に舵を切るというマインドセットの転換が求められます。ただし、マインドセットだけでは足りません。逸脱を検知する仕組みや人間が介入するタイミングの定義、品質を担保するガードレール等、安全に任せるための設計を丁寧に作り込む必要があります。

この転換をどう実現したか。それがこのシリーズの本題です。

5年目のB2B SaaSでの実践

私たちACESは、東大松尾研究室発のAIスタートアップです。AIを事業の中心に据えている会社なので、AI活用への心理的ハードルは低い方でした。ただ、開発におけるAIの使い方は個人のスキルや好みに依存していて、チームとして体系化されてはいませんでした。「あの人は上手く使えているけど、自分はいまいち」という温度差がある状態でした。

私たちが開発しているACES Meetは、会議・商談の録画データをAIで解析するB2B SaaSで、リリースからもう少しで丸5年になります。開発チームはPdM・デザイナーを含めて10名ほどの体制です。金融領域をはじめとするエンタープライズのお客様にも利用されており、会議という機密性の高いデータを扱うので、セキュリティ要件はかなり厳しいプロダクト特性があります。そうしたプロダクトでAI駆動開発をどう推進しているか、PoCや個人開発、新規立ち上げではなく、本番の実践の話を書いていきます。

なぜチーム全体の底上げを選んだのか

Cursorのように、少人数のチームから始まったツールが爆発的に成長する事例が出てきています。少数精鋭で大きなことをやれる時代が来ていて、目指すべき方向はそこでしょう。

個人が強くなるのは大歓迎で、どんどんそうなってほしいと思っています。ただ現実にはばらつきがあります。だから私たちは、個人が2倍になるのを期待するより、チーム全員を1.1倍→1.2倍…と底上げしていく仕組みづくりを優先しました。底上げされた土台の上でなら、個人が2倍になる速度も早まるはずです。

ちなみにこの考え方は開発チームに閉じるものではありません。組織全体に横展開すれば、100人の組織で1.1倍でも+10人分のインパクトになります。

現在地とシリーズの地図

自動運転になぞらえた4つのPhaseには、それぞれ向き合うべき問いと手放すものがあります。今日現在、私たちはPhase 3の入口あたりまで来たという感覚です。2025年12月に約1ヶ月の準備期間を経て2026年1月にチーム運用を開始し、わずか数ヶ月でここまで到達しました。下地の整備に集中的にリソースを投下したことと、チーム全体のモチベーションが高かったことが、このスピード感の要因です。

Phase 1→2: 「何をAIにやらせるか」

全部自分で書くというスタンスを手放すところから始まります。開発プロセスを分解し、AIが動ける範囲を広げる地盤づくりのフェーズですが、運転席にはまだ人間が座っています。具体的な実践方法は以下の記事で解説します。

tech.acesinc.co.jp

Phase 2→3: 「どうすれば安全に任せ切れるか」

ここが最大の転換点です。「自分でやった方が正確」「自分でやった方が結局早い」という考えから脱却し、運転席自体をAIに譲ります。ただし、任せることと放任することは違います。安全に任せるための仕組みをどう作るかが問われます。設計思想と実践のリアルは以下の記事で解説します。

tech.acesinc.co.jp

#4|P&T開発を回してみた — 成果と摩擦のリアル(2026/03/11公開予定)

Phase 3→4: 「壊れたときどう直すか」

「壊れないようにする」から「壊れても速く直せる」への発想転換です。AIが書いたコードを安全に本番へ届けるための仕組みと、その現在地を以下の記事で解説します。

#5|AIが書いたコードをどう本番に出すか — リリース安全基盤の設計と展望(2026/03/18公開予定)

1チームから組織全体へ

1チームの実践を組織全体に横展開していくための取り組みです。開発チームに閉じず、組織全体をAI駆動にしていく過程を以下の記事で解説します。

#6|1チームの実践を、組織の力に変える — AI駆動型の組織をどう作るか(2026/03/25公開予定)

おわりに

正直、私たちもまだ道半ばです。現在、Phase 3の運用を回しながら、日々試行錯誤を続けています。完成した成功事例ではなく、進行中の実践のリアルな姿をお伝えできればと思っています。

次回 #2|スラッシュコマンドで回す開発 — プロセスを分解してAIに割り当てる では、開発プロセスの分解とスラッシュコマンドへのマッピングというPhase 2の具体的な実践について解説します。ぜひお付き合いください。

ACESでは現在、複数のエンジニアポジションで採用を行っています。本シリーズを読んでACESの開発に興味を持っていただけた方は、ぜひカジュアル面談でお話ししましょう!

ACESの採用情報はこちら↓

recruit.acesinc.co.jp

open.talentio.com

AIエンジニアは何者か(どこから来て、どこへ行くのか)

1. はじめに

こんにちは。株式会社ACESでAIエンジニアのEMをしている阿久澤(@kei_akuzawa)です。先日、温泉施設でほぼ丸一日間のデジタルデトックスを行いましたが、効果絶大ですね。最近は”AI疲れ”なんて言葉もありますが、こうした息抜きは忘れないようにしたいものです。

さて、冒頭で私は「AIエンジニアの」と自己紹介させていただきました。でも、この自己紹介って実は結構モヤモヤするんですよね。AIエンジニアという職種は新しく、AIの急激な発展にともなってその守備範囲は刻一刻と変化しています。さまざまな会社さんの求人票を見させていただいても重視されている観点は千差万別です。最近流行りのFDE(Forward Depoyed Engineer)のような関連職種も登場し、それらの違いに戸惑うこともあります。

この記事では、”AIエンジニア”という職種に期待されうる役割を紐解き私なりの類型化を試みたいと思います。記事の後半では、AIエンジニアの今後の展望についての仮説も紹介します。JDの記載に悩んでいる採用担当の方や、キャリアに悩んでいる”AIエンジニア”の方に届けば幸いです

💡
この記事を書こうと思ったきっかけは、社内で採用要件の検討を機にAIエンジニアの職能を分解・言語化したことでした。2026年2月現在、ACESでは音声領域のAIエンジニアを切実に募集しています。興味を持たれた方は公式HPから応募、または私のXのDMにてご相談をお待ちしておりますー!

2. 役割を紐解く

さて、AIエンジニアの役割を整理するにあたって、適当な軸を設置したいと思います。ここでは個人的にしっくり来ている2軸で整理します。

2.1 モデル

第一の軸は「モデル」への関与です。近年はAIブームにあやかって何でもかんでもAIと名前をつける風潮がありますが、いまの(第三次、第四次)AIブームのコアとなる技術は間違いなく「モデル(深層学習モデル、そしてその延長線上にある大規模言語モデル)」です。

この軸に沿って、以下3つのカテゴリに分類を行います。

モデルへの関与 説明 代表的な作業
Use 既存のモデルを前提に、プロンプト設計やRAG、UX設計を通じて、システム全体の品質を担保。 ・Prompt-tuning
・RAGなどの複合システムのEnd-to-Endの品質改善
・UX設計(ex. Human-AI/Agent-Interaction)
Customize 既存のモデルを、特定タスク・制約条件に合わせたチューニングで最適化する。 ・モデルパラメータのfinetune
・ハイパラ調整
・蒸留等による軽量化
Build 汎用の基盤モデルそのものを設計・学習し、再利用可能な形で提供する。 ・LLMの事前学習・事後学習
アーキテクチャ・学習手法の開発

ざっくり言うと「モデルを作る人 / 使う人」といった軸です。「Build」は汎用性を持つ基盤モデルを作るLayerであり、特定のユースケースを強く意識しません。「Customize」は特定のユースケースを意識したモデルのチューニングを行います。「Use」は既存のモデルを活用しながら、ユーザーに価値提供するための複合システム(検索ツールやMemoryなど、モデル以外の外部システムを含む)を作り上げます。

特にここ数年では、以下のような背景のもとで、Build / Customize / Useの区分がはっきりとしてきたなと感じます

  1. 基盤モデルの台頭に伴うBuildとCustomizeの分離
    • LLMに代表される基盤モデルの訓練には莫大なコストが必要となるため、Buildは一部の巨大資本を持つ企業の仕事に収斂しました。Customizeと使っている技術は一部共通しますが、立ち位置は明確に分かれた印象です
  2. LLMの登場によるUseの存在感向上
    • LLMは汎用性が高く様々な仕事を任せられるため、LLMを使ったアプリケーションの数や多様性が拡張し、結果としてUse層の存在感が増したように感じています。

2.2 開発ライフサイクル

第二の軸は「開発ライフサイクル」への関与です。ざっくり言うと「要求定義 → 要件定義 → 設計 → 開発 → テスト → 運用」といった開発の流れのことです。

ソフトウェアエンジニアであっても開発ライフサイクルには得意領域の色が出るところだと思います。それがAIエンジニアにおいては、特にR&DやPoCの段階を中心に色が出ると考えます。AI開発においては、AI特有の不確実性(作ってみないと精度が分からない)を織り込むためにPoCが開発ライフサイクルの一つとして置かれることが一般的です。そしてR&Dと開発には別種のスキルが要求されます。前者は大学・大学院等での訓練によって磨くことができる一方、後者はエンジニアとしての実務経験がものを言います。

そこで本記事では、開発ライフサイクルを「①R&D・PoC、②設計・開発、③運用」の三つに分類します。

  • ①R&D・PoC:製品の実用化に向けたコア技術開発や主要リスクの検証
  • ②設計開発:再現性・保守性・拡張性を持たせて製品に落とす
  • ③運用:品質・コスト・安全性を継続的に担保し改善する

また開発ライフサイクルを「モデルへの関与」ごとに設けると以下のテーブルのようになります(テーブルはLLMに生成させたものですが、大まかには私の意図通りです)

モデルへの関与 開発対象 R&D・PoC(不確実性の解消) 設計開発(プロダクト化) 運用(継続提供)
Use Application ・価値仮説の検証(ユーザー課題・利用シーン)
・プロトタイピング(Prompt/RAG/Agent)
・E2E評価の設計とベースライン(簡易セット)
・失敗パターン抽出(幻覚、検索漏れ、UX破綻)
アーキテクチャ設計(RAG構成、ツール設計、状態管理)
・ガードレール(入力制御、出力制約、権限制御)
・評価基盤の整備(回帰テスト、E2Eテスト)
・性能/コスト最適化(キャッシュ、モデル選定、分岐)
・品質監視(成功率、拒否率、幻覚率の代理指標)
・オンライン評価/AB(プロンプト・検索・UI改善)
・インシデント対応(誤回答、漏洩、逸脱)
・ナレッジ更新運用(RAGの更新・鮮度管理)
Customize モデル ユースケース要件と評価指標の定義
・データ探索(ラベル方針、偏り、ノイズ)
・小規模学習(LoRA等)で当たりを付ける
・失敗例分析(誤分類、長文弱さ等)
・学習パイプライン(再現性、版管理、実験管理)
・データ作成/前処理の標準化(データ仕様化)
・推論最適化(量子化、蒸留、バッチ/ストリーム)
・システム統合(API、依存関係、テスト)
・ドリフト/劣化監視(データ/概念/性能)
・再学習のトリガー設計(いつ・何で更新するか)
ロールバック/カナリア(安全なリリース)
・コスト監視(GPU/推論単価)
Build モデル ・先行研究・実装サーベイ(SoTA/失敗例)
・アーキ/学習手法の検討(スケーリング仮説)
・事前学習/事後学習の実験(小〜中規模)
・評価体系の設計(能力・安全性・頑健性)
・大規模学習の設計(データパイプライン、HPC)
・学習安定化(分散、チェックポイント、再開)
・再現可能な訓練/評価フレームワーク整備
・リリース形態設計(重み配布/API/SDK
・提供基盤の運用(Serving、SLA/SLO)
・継続評価(回帰、安全性、レッドチーム)
・モデル更新計画(互換性、バージョニング)
・利用状況監視(濫用、逸脱、性能劣化)

以下に簡単に補足します。

  • Use : Useは一般的なソフトウェア開発の枠組みに近いものの、AIが組み込まれることで、0/1の「機能の有無」ではなく、「精度・UXの良さ」としての側面が強調されます。モデルに対する理解は比較的必要とされない一方で、PoCにおける評価・実験を行う必要があるのは他レイヤーと同様です
  • Customize: Customizeでは特定のユースケースに合わせた要件を満たすようにモデルを開発します。モデルの精度はもちろんのこと、コスト要件や顧客システムとの互換性なども満たすことが必要となります
  • Build: Buildにおける基盤モデル開発はtry-and-errorを含むのでPoCとして位置付けました。また最終的にはAPIなどの形態で製品として提供するような開発ライフサイクルを想定し、開発・運用業務もスコープに入れています。

2.3 留保事項

先ほど、簡単化のために「モデルへの関与」を3つ(Use/Customize/Build)に分類しましたが、実際にはグラデーションがありそうです。例えばRAG開発の一部として、埋め込みモデルを独自に作ることがあるかもしれませんが、これはUseともCustomizeとも言えそうです。開発ライフサイクル内で「R&D・PoC」を取り上げましたが、実際のところR&Dは「基礎研究、応用研究、開発研究」などの段階に細分化することができます。

またAIエンジニアの役割を特定するにあたって「モデルへの関与 x 開発ライフサイクル」の2軸を扱いました。しかし、上記二つ以外にも整理に使えそうな軸はいくつかあります。例えば画像・音声・言語・時系列など、扱うデータのドメインによって技術領域は異なり、しばしば専門職として成立しています。他にもマネジメント v.s. スペシャリスト、あるいはプロダクト v.s. プロジェクトといった軸も考えられそうです。加えて、データ基盤やHPCなどの技術領域については今回スコープ外としています。

もし本記事で捨象されてしまったこれらの要素が大事だと思う人がいたら、、、続きはあなたが書いてください!!!

3. 代表的な職種

さて、ここでは二つの軸(モデル x 開発ライフサイクル)の上に、”AIエンジニア”が該当・関連する職種をプロットしてみます。この2軸は個人のスキル・専門性に対応しているため、職種定義の境目として機能します(プロットに役立ちます)。

職種プロット(モデル x 開発ライフサイクル)

さて、こちらは皆様の各職種に対するイメージと合っていましたでしょうか?注意点として、ここでは私のイメージ(独断と偏見)に基づいて職種をプロットしています。他社の職種定義と異なることは往々にしてあると思いますが、本記事のプロットの正当性を主張するつもりは全くありません。大事なのは「この2軸に沿った職種のクラスタが存在している」という仮説であり、そのクラスタどのようなラベル(職種名)をつけるかは自由です。

さて、各職種を該当箇所にプロットした意図を解説します

  • Research Scientist: 研究開発を担う。開発・運用はスコープ外
  • Research Engineer: AIの最先端研究と製品化の橋渡しをする職種。Research ScientistよりもR&Dの比率は下がり、ソフトウェアエンジニアリングの比率が上がる。
    • Applied ML Engineer: 特定のユースケースにおいてMLの専門性を発揮。
    • Applied AI Engineer: MLではなくAIとつく場合は、Customize層(だけ)ではなくUse層までをスコープとするニュアンスを感じる
  • MLOps Engineer: MLモデルの運用を担う専門職。小規模チームではApplied ML Engineerと兼任することもある。
  • FDE: 最近流行りの職種。顧客と近い位置で開発ライフサイクルを一気通貫。既存モデルを使う
  • AI PdM: 最近流行りの職種その2。AIの特性を理解した上で機能開発に落とし込む。

さて、冒頭私は”AIエンジニア”として自己紹介させていただきましたが、上記の整理に基づくとApplied AI Engineerが最近の業務に近そうです。皆さんはいかがでしょうか?

4. 今後の展望

さてAI技術は今も目まぐるしく発展しています。AIエンジニア関連の職種は今後どうなっていくのでしょうか?我々はキャリアをどのように伸ばしていくけばよいのでしょうか?ここでは最新の環境変化を踏まえた今後の展望を雑多に語っていきます。

4.1. スマイルカーブの進行による影響

スマイルカーブ現象とは、製造業においてバリューチェーンの上流工程と下流工程の付加価値が高く、中間工程(組立・製造工程)の付加価値が低くなる現象のことです。中流の組立・量産において標準化・分業が進むことで差別化が困難になり発生すると言われています。

スマイルカーブ

スマイルカーブ現象をAI開発になぞらえると、以下2通りの仮説が立ちます。

  • モデルの「Build」と「Use」の付加価値は増大、「Customize」は縮小
  • 開発ライフサイクルにおける「R&D・PoC」と「運用」の付加価値は増大、「設計開発」は縮小

実際のところ、米ビックテックや一部スタートアップを中心とした基盤モデルの発展に伴い、モデルの「Customize」需要は減少しているように感じます。2010年代中盤〜ChatGPT登場までは、さまざまな企業が自社開発したモデルというのは明確な競争優位性でした。しかし今では基盤モデルのAPIを叩くだけで企業独自モデルに迫る(あるいは上回る)精度を達成できてしまいます。

一方スマイルカーブ仮説に対するカウンターとして、企業独自のデータやビジネスプロセスと密接に関連するようなAI開発においては、中流工程の標準化が進まないかもしれません。2026年現在、「パランティア」「FDE」の台頭に象徴されるように、企業個別のビジネスプロセスを理解した上でAIを導入することが注目を集めています。このようなオーダーメイド製品を前提にしたときに、中流工程において標準化がどの程度進むかはまだ不明です。具体的には、特定タスクでの精度向上 / コストカットのためのfinetune、ビジネスプロセスにフィットするAIのUX設計(前回ブログも参照)などが中流工程における付加価値として残り続けるかもしれません。

4.2. 縦に伸ばすか横に伸ばすか

スマイルカーブのような環境変化の中で、我々はキャリアをどう伸ばしていくべきでしょうか。

縦に伸ばす(モデル軸)

「Customize」から「Use」への拡張は、現実的な選択肢の一つだと考えます。例えば「Use」層におけるprompt tuningは一見すると簡単で誰でも出来そうな業務です。しかしその実、科学的な仮説検証能力がアウトプットの品質にダイレクトに効いてくると考えています。例えばcherry-pick(自分にとって都合の良いサンプルだけ集めて判断する)などを行ってしまえば、良いチューニングにはなりません。

加えて、AIの原理原則に対する理解というのも、縦方向に対しての汎用スキルだと考えています。前回のブログ記事でも説明したように、不確実なAIの挙動を前提としたUX設計は、従来のアプリケーション開発のものとは明確に異なります。AIを機能やUXに落とし込む上で、AIの原理原則に対する理解力は大きな強みになりそうです。

横に伸ばす(開発ライフサイクル軸)

「開発ライフサイクルに対するフルスタック性」というのは、当面の間AIエンジニアの大きな強みになると考えています。理由は現在のAI開発において企業ごとのすり合わせ(インテグレーション)が重要となっているためです。AIを企業のコア業務に導入しようとする際、企業ごとに独自のシステム制約やビジネスプロセスが存在するために、既存のAIをモジュールのように組み合わせるだけで完成品を作るのは困難です。このような「インテグラル型」の製品では、モジュール同士の総和として最終製品の品質が決まるのではなく、乗算として品質が決まります。

モジュール型 v.s. インテグラル型

したがって、システムや開発ライフサイクルを横断して全体の擦り合わせができる人材というのは、大きな付加価値を提供することが出来るはずです。近年FDEが流行っているのもこの辺りの背景があるんだろうなと思っています。

5. 終わりに

ここまで読んで下さりありがとうございます。何か皆さんのキャリアや採用要件について考えのきっかけになるところがあれば幸いです。

余談ですが、ChatGPTが出た当時、同僚と「AIによって真っ先に仕事を奪われるのはAIエンジニアである」と自虐めいた雑談を良くしていました。実際、スマイルカーブの進行による環境変化は過激です。しかしキャリアは横にも縦にも伸ばしていくことが出来そうなので、現在はそこまで深刻に捉えていません。

最後に、2026年2月現在、ACESでは音声領域のAIエンジニアを切実に募集しています。 プロダクト開発のライフサイクル全体を横断しながら、AIモデルのCustomizeとUseまで、縦にも横にもキャリアを磨くことができるポジションです (弊社が取り組んでいるAI特有のUX設計や、AI開発のライフサイクルについては、リンク先の過去ブログ記事にも紹介があります)。 興味を持たれた方は公式HPから応募、または私のXのDMにてご相談をお待ちしておりますー!

AIのUXは『Guidelines for Human-AI-Interaction』に基づいて決めよう——ACES Meetの事例を添えて——

1. はじめに

こんにちは。株式会社ACESのAIエンジニアの阿久澤です。長らく運動とは無縁でしたが、最近は村上春樹さんのエッセイ『職業としての小説家』に啓発されて、一日一回のランニングを日課にしています(彼は毎日1時間程度走るそうです)。HPは消費しますが、最大HPは上がっている気がしますね。

さてこのブログでは、AIとUXの関係性について弊社で特に意識しているポイントと、弊社のSaaS『ACES Meet』の開発における実践内容について紹介していきます。AIとUXの関係性については、日本のAI企業/開発者の中で強く意識されていると認識しています。例えば、LayerX 福島さんのブログの以下の言葉

AIで体験を構築する部分も、AIの精度は100%にならないという前提で、いかにその間違いをUX的に吸収できるかを考える必要があります。

AI-UXとAX(AI Transformation)というLayerXの挑戦』より引用

は、AIを機能に落とし込んでいく際のポイントを端的に表していると考えます。

さて、実際に機能開発をする上で「AIの間違いをUX的に吸収する」とは、具体的にどういったことでしょうか?このようなAIとUXの関係性について考える時、弊社ではMicrosoft Researchが提唱した『Guidelines for Human-AI-Interaction』(以下、HAIガイドライン*1を参考にすることが多いです。このガイドラインは人とAIが協働するUX設計のベストプラクティスを体系的に整理したものであり、具体の機能開発において守るべき原則や考えるべき観点を教えてくれます。

HAIガイドラインはChatGPTの登場より前の2019年に発表されたものですが、そのエッセンスはまだ錆びておらず、むしろLLM時代にあってその重要性を増しているものと考えています。弊社のResearch FellowでありCHIの専門家であるriku_arakawaさん(@rikky0611)が社内に普及させ、AIを機能に落とし込む際のUX設計の指針として弊社で重宝されてきました。

2. 『Guidelines for Human-AI-Interaction』の紹介

Microsoft Research が 2019 年に提唱した『Guidelines for Human-AI-Interaction』は、人とAIが協働する際のユーザー体験設計に関する18の原則(デザインガイドライン)を、4つのフェーズに沿って体系的に整理したものです。このガイドラインに沿った機能を開発する / UXを提供することで、ユーザーがAIを信頼し、安心して機能を利用するようになると期待できます。

それでは、ひとまずガイドラインをざっと眺めてみましょう。

フェーズ No 原則内容(日本語意訳) 英語原文
Initially
(導入時)
G1 システムが何をできるかを明示する G1. Make clear what the system can do.Help the user understand what the AI system is capable of doing.
G2 システムがどの程度うまくできるかを明示する G2. Make clear how well the system can do what it can do.Help the user understand how often the AI system may make mistakes.
During Interaction
(利用中)
G3 文脈に応じてタイミングよくサービスを提供する G3. Time services based on context.Time when to act or interrupt based on the user’s current task and environment.
G4 ユーザーの状況に関連した情報を提示する G4. Show contextually relevant information.Display information relevant to the user’s current task and environment.
G5 社会的・文化的規範に沿った体験を提供する G5. Match relevant social norms.Ensure the experience is delivered in a way that users would expect, given their social and cultural context.
G6 言語や振る舞いに偏見を含ませない G6. Mitigate social biases.Ensure the AI system’s language and behaviors do not reinforce undesirable and unfair stereotypes and biases.
When Wrong
(失敗時)
G7 ユーザーがAIを呼び出せる手段を提供する G7. Support efficient invocation.Make it easy to invoke or request the AI system’s services when needed.
G8 不要になったAI機能を簡単に終了できるようにする G8. Support efficient dismissal.Make it easy to dismiss or ignore undesired AI system services.
G9 誤ったときにユーザーが修正・回復できるようにする G9. Support efficient correction.Make it easy to edit, refine, or recover when the AI system is wrong.
G10 ユーザーの意図が曖昧なときに範囲を限定して対応する G10. Scope services when in doubt.Engage in disambiguation or gracefully degrade the AI system’s services when uncertain about a user’s goals.
G11 AIがなぜその結果になったかを説明する G11. Make clear why the system did what it did.Enable the user to access an explanation of why the AI system behaved as it did.
Over Time
(継続利用)
G12 過去のインタラクションを記憶・参照できるようにする G12. Remember recent interactions.Maintain short-term memory and allow the user to make efficient references to that memory.
G13 ユーザーから学習し、体験をパーソナライズする G13. Learn from user behavior.Personalize the user’s experience by learning from their actions over time.
G14 更新・適応は混乱を最小限に抑える G14. Update and adapt cautiously.Limit disruptive changes when updating and adapting the AI system’s behaviors.
G15 細かいフィードバックを得られるようにする G15. Encourage granular feedback.Enable the user to provide feedback indicating their preferences during regular interaction with the AI system.
G16 ユーザー行動の結果とその影響を伝える G16. Convey the consequences of user actions.Immediately update or convey how user actions will impact future behaviors of the AI system.
G17 AIの監視や挙動をユーザーが制御できるようにする G17. Provide global controls.Allow the user to globally customize what the AI system monitors and how it behaves.
G18 システムの更新や変更を通知する G18. Notify users about changes.Inform the user when the AI system adds or updates its capabilities.

こちらを見て何か染み入るものはありましたでしょうか。「うんうん」となっている方、さすがです。実務でかなりAIを使っておられることでしょう。逆にイメージがつかなかった方、この次の章で弊社事例をケーススタディとしてご紹介するので、ぜひそちらもご覧になってください。

さて、私としては上記のガイドラインの特徴を「人間中心」の視点と考えています。人間中心とはつまり、AIを単なる自動化ツールとしてではなく、人間の意思決定や行動を補助するパートナーとして位置づけています。例えば、

  • 「誤りを避ける」よりも「誤りがあったときにどう対処するか」を重視しています。
  • ユーザーがAIを「盲目的に信じる」のではなく、「AIがどのように結論に至ったか理解したうえで判断する」できるように、説明性や透明性を重視しています。

なお、AIとUXに関わるガイドラインとしては、本記事でご紹介するマイクロソフト版のHAIガイドライン以外にもいくつか例があります(例えばGooglePAIR Guidebookなど)。そうしたガイドラインの中で、マイクロソフト版は特に人間のメンタルモデルに焦点を当てて「人がどう気持ちよくAIを使いこなしていくか」の設計を丁寧に掘り下げている印象です。また抽象と具体のバランスが整っており、原理原則から実務に落とし込むのに役立つと私的には考えています。

💡 ※参考: A Comparative Analysis of Industry Human-AI Interaction Guidelines 逆にGoogleガイドラインはもう少し包括的で、例えば「どの業務をAIで代替するべきか」という企画や、「モデル訓練方法」といった開発部分まで言及があります

3. 弊社での事例

ここからは弊社のプロダクトACES Meetを事例として、実際の機能開発においてHAIガイドラインをどう活用してきたかご紹介します。 なお本記事では弊社の宣伝も含めてACES Meetを事例としますが、HAIガイドラインの論文にも事例は載っている(Table.1)ので、ご興味のある方はそちらもご覧ください。

3.1 問題設定: 話者分割

『ACES Meet』は、会議を効率的に記録・要約するためのAI議事録ツールです。Zoom、Teams、Google Meetといった主要なビデオ会議ツールと連携できるほか、音声ファイルを直接アップロードして文字起こし・要約を生成することも可能です。

このサービスの大きな強みのひとつが「誰がどの発言をしたか」を識別する 話者分割機能です。一見単純な処理ですが、会議データの特性によって思いの外複雑な処理になります。

たとえばZoom経由で取得した音声データでは、参加者ごとに別々のマイク音声が取得できる場合があります。この場合はマイクごとの分割が明確なので、話者の区別は比較的簡単です(これをマイク間の話者分割と呼びます)。ところが、ひとつのマイクを複数人が共有している「会議室録音」の場合、ひとつの音声ファイルの中に複数人の声が混在していますまた、ユーザーが音声ファイルをアップロードするケースも、基本的には「ひとつのファイル内に複数人の話者がいる」という状況を想定しなければならず、マイク内の話者分割を行う必要があります。さらに難しいのは二拠点にそれぞれ2人がいる(≒合計で2×2=4人が参加)ようなハイブリッド会議で、この場合はマイク内・マイク間の話者分割を併用する必要があります。

「マイク間話者分割」は単純で、それぞれ個別の音声ファイルごとに書き起こしを生成すれば、自動的に話者と発言を紐づけることができます。一方「マイク内話者分割」では、ひとつの音声ファイルから複数の話者を自動的に切り分ける機械学習モデルが動作しています。音声の特徴量をもとに「この声とこの声は同じ人物か、それとも別人か」を推定します。これは機械学習モデルの推定に依存しているため、どうしても誤りが生じます。声質が似ている人を同じ人物と判断してしまったり、逆に同じ人の発話を複数人と誤認してしまったりすることがあります。

ユーザーにとっては「議事録上で発言者が誰なのか分かる」ことが非常に重要であるため、話者分割の精度は体験価値に直結します。ただし、マイク内話者分割は機械学習モデルの推定である以上、完全な精度は望めません。また、ユーザーはACES Meetの導入時点では基本的にマイク内・マイク間という概念には馴染みがありません。このような状況下で、ユーザーがAIの挙動を理解し、AIの誤りを受け入れて使いこなすようなUXを作ることがゴールとなります。

3.2 HAIガイドラインの実践

[G1. Make clear what the system can do. / G2. Make clear how well the system can do what it can do] マイク間・マイク内の概念を明確に

先に述べた通り、話者分割には「マイク間の話者分割」、「マイク内の話者分割」の2種類が存在します。ここで重要なのは、ユーザーに「どちらの分割なのか」を明示することです。以下に、実際のACES MeetのUIでどう表現されているかを掲載します

上記は、youtubeなどで良くある動画のシークバーを話者ごとに表したものです(色が付いている部分は発言時間帯です)。録画時の状況としてはハイブリッド会議になりまして、ある会議室に3人と、自宅から参加している人物が2人います。赤色で囲われた名前は「発言者の名前」、オレンジ色で囲われた部分は「誰のマイクで収音しているか」を表しています。

この表記が重要なのは「マイク間の話者分割」、「マイク内の話者分割」で精度が異なるためです。マイク間の分割であれば安心して信頼してよいが、マイク内の分割については誤りが含まれている可能性があります。ユーザーが事前に「ここは信頼して良い / ここは誤りが含まれるかもしれない」ことを知ることで、認知負荷が下がり誤りの修正を効率的にできるはずです。これらの違いを理解してもらうことは、Guideline G1, G2が示す、「システムが何を、どの程度うまくできるのかを明示する」という原則の実践です。

次の節では、ユーザーがどのように誤りを修正するか見ていきましょう。

[G9. Support efficient correction] 人間が効率的に修正する工夫

マイク内話者分割(≒AIによる話者分割)は便利ですが、当然ながら誤りが発生します。大切なのは「誤りが起きないようにする」ことに加えて、「誤りが起きても人間が簡単に修正できる」ようにすること —— Guideline G9で提唱されている Support efficient correction の考え方です。

2種類の誤り

話者分割の誤りには大きく分けて2種類あります。

  • 過小分割: 本当は複数人が話しているのに、同一人物と判定されてしまうケース。例えば会議室でAさんとBさんが会話していて、両者の声が似ているため、AIが「同じ人」と誤認する場合
  • 過剰分割: 本来はひとりの人間が話しているのに、複数の話者として切り分けられてしまうケース。例えばAさんの声を「Aさん」と「Cさん」に分けてしまう、といった誤り

どちらが直しやすいか?

UXの観点からすると、どちらの誤りがユーザーにとって修正しやすいかが重要です。私たちが検討した結果、過剰分割の方が修正コストが低いという結論に至りました。なぜなら「複数に分かれた話者をまとめる(統合する)」操作は、非常に少ないクリック数で実現できるからです。

3クリックで話者を統合する様子

一方で過小分割をユーザーが人手で修正するのは容易ではありません。例えば「Aさん」に分類された会議中の発言をすべて確認し、Bさんの発言を見つけるたびにに話者ラベルを振り直すといったような、大きな負担を強いてしまいます。

ACES Meetでの実装方針

この知見を踏まえて、ACES Meetではソフトウェア・アルゴリズムの両面から効率的な修正をサポートしています。ソフトウェア面としては、上記のように数クリックで話者を統合するような機能をリリースしました。一方でアルゴリズム面では、あえて「やや過剰分割気味」に機械学習モデルをチューニングしています。つまり、多少多めに話者を切り分けてユーザーに後から統合していただく手間を許容しつつ、過小分割による負を引き起こす確率を最大限に抑えているのです。

💡「やや過剰分割気味」に機械学習モデルをチューニングするとは、recallとprecisionのバランス調整のようなものです。

また基本的に統合対象の話者は同じマイクに所属しています(「マイクAの話者1とマイクBの話者2が実は同一人物でした」というシーンは想像しづらいですよね)。そのために、前節でご紹介したような「マイク間・マイク内の概念をわかりやすく伝える」UIがあることで、「どの話者を統合すれば自然か」が明確になり、ユーザーは迷わず修正作業に取り組むことができます。

3.3 HAIガイドラインとの対応づけ一覧

HAIガイドラインには全18項目があり、本記事でそのすべてを掘り下げることはしません。その代わりに、前節で紹介したもの、出来なかったものも含めて、弊社の話者分割に関連するHAIの実践内容を一覧化して簡単にご紹介します。

フェーズ No 原則内容(日本語意訳) 話者分割機能における実践
Initially
(導入時)
G1 システムが何をできるかを明示する マイク内・マイク間の区別
G2 システムがどの程度うまくできるかを明示する マイク内・マイク間の区別
During Interaction
(利用中)
G3 文脈に応じてタイミングよくサービスを提供する N/A
G4 ユーザーの状況に関連した情報を提示する 会議参加者の中から話者割り当てを行う
(自動・手動)
G5 社会的・文化的規範に沿った体験を提供する N/A
G6 言語や振る舞いに偏見を含ませない N/A
When Wrong
(失敗時)
G7 ユーザーがAIを呼び出せる手段を提供する マイク内話者分割のon / offを切り替えられる
(対面会議を利用しない人はoffにすることができる)
G8 不要になったAI機能を簡単に終了できるようにする ソフトウェア: 容易に話者の統合ができる
G9 誤ったときにユーザーが修正・回復できるようにする アルゴリズム: 過剰分割気味のチューニング
ソフトウェア: 容易に話者の統合ができる
G10 ユーザーの意図が曖昧なときに範囲を限定して対応する N/A
G11 AIがなぜその結果になったかを説明する 発言と動画を1クリックで移動が可能
->ファクトチェックが容易
Over Time
(継続利用)
G12 過去のインタラクションを記憶・参照できるようにする
G13 ユーザーから学習し、体験をパーソナライズする ユーザーの声の特徴を記録し、自動で話者名を割り当てる
G14 更新・適応は混乱を最小限に抑える
G15 細かいフィードバックを得られるようにする 修正が簡単・直感的に行える
(話者単位、発話単位)
G16 ユーザー行動の結果とその影響を伝える ユーザーの修正に基づいて声の特徴を記録
G17 AIの監視や挙動をユーザーが制御できるようにする
G18 システムの更新や変更を通知する CSからの案内やサイト内での通知

ちなみに、N/Aはnot applicable(話者分割というユースケースと関わりが薄いもの)で、空欄は「本当はxxxの工夫の余地があるけど出来てないなー」と思ったところです。話者分割という機能一つ取っても、アルゴリズム・ソフトウェアの横断で考えるべきポイントがいくつもありそうなことが伝わりますでしょうか。

4. チームでの協働

先にも述べた通り、話者分割機能の開発にあたってはソフトウェア・アルゴリズムの両面からの工夫が盛り込まれています。そのため、ACES Meetでの機能開発にあたってはプロダクトチームとAIチームの間で多くの協働が必要でした。

一つ大きな問いは、こうした開発テーマの立案をPdMとAIエンジニアのどちらが主導するべきかという点でした。プロダクト開発において開発テーマ選定を主導するのは一般的にPdMだと思います。一方AIの挙動についての深い理解がないと、こうした開発テーマの立案は難しそうに思います。例えば「AIの失敗パターンが過剰分割と過小分割の二通りある」という感覚はAIエンジニアにとって容易に理解できますが、プロダクト全方面を見ている多忙なPdMが無意識的にキャッチアップするのは難しそうです。

この溝を埋める上で重要だったのは、第一に、AIエンジニア側の責務を開発に限定せずに「AIがどう使われるか」の機能設計にまで巻き込む(あるいは染み出す)ことだと思います。またそのためには当然連携を増やしていかなければなりませんが、その辺りの話は前回ブログもご参照ください: AIエンジニアのR&Dが事業に届くまで

もう一つは、『Guidelines for Human-AI-Interaction』のように体系化されたベストプラクティスをもとに議論することだと思います。HAIガイドラインMicrosoft Researchの研究結果に支えられた説得力を持ち、ともすれば個人の感性の問題に矮小化される危険があるかもしれないUXについての議論と意思決定を、スムーズにしてくれるものだと思います。

5. むすびに

HAIガイドラインの実践にはPdM、UXデザイナー、AIエンジニア、その他すべてのメンバーが知見を持ち寄り、リスペクトを持って協働することが大事だと考えています。ACESでは「人とAIが協働するビジネスプロセスの実現」を掲げており、これを共に実現していく仲間を求めています。もしこの挑戦に共感していただける方がいれば、ぜひ私たちと一緒に取り組んでいきましょう!(ここで採用サイトのリンクを貼る

*1:Amershi, S., Weld, D., Vorvoreanu, M., Fourney, A., Nushi, B., Collisson, P., Suh, J., Iqbal, S., Bennett, P., Inkpen, K., Teevan, J., Kikin-Gil, R., & Horvitz, E. (2019). Guidelines for Human-AI Interaction. CHI 2019. ACM. https://www.microsoft.com/en-us/research/publication/guidelines-for-human-ai-interaction/

ChatGPTのMCP連携とNotionの構造化で取り組む高性能ナレッジ検索

1. はじめに

こんにちは!ACESでR&D部門統括をしている久保(@seishin55)です。

ACESでは、事業としてAIを活用したプロジェクト推進(DXパートナーサービス)やプロダクト開発(AIソフトウェア開発)を行う一方、社内業務にも積極的にAIを取り入れています。今回は、その中でも他社にも応用可能と思われる「ナレッジ検索」の取り組みについてご紹介します。

当社ではドキュメント管理にNotionを採用しており、ドキュメント文化が根付いた環境の中で、体系的かつ豊富な情報が蓄積されています。この資産を最大限活用しない手はありません。また、チャットツールとして全社員にOpenAIのChatGPTを配布しており、日常的に業務で活用しています。そのため、ChatGPTから直接Notionの情報にアクセスできれば、より効率的に知識を引き出せる理想的な環境となります。こうした背景から、「ChatGPT上でNotionのデータを参照しながらナレッジ検索を実現する」ことが、本プロジェクトの出発点となりました。

あわせて、活用の窓口を一元化することも重視しました。個別のツールごとに専用のAIを作ると便利さはあるものの、利用者からするとどのAIに聞けばよいか迷う場面が増え、結果的に活用が広がりにくくなる場合もあります。その点、ChatGPTのような汎用的な対話環境を業務の中心に据え、必要なデータやシステムを裏側で繋ぎ込むことで、利用体験の一貫性を保つことによって、より良い体験の実現が期待されます。こうした発想もプロジェクトを支える背景のひとつです。

さらに、取り組みにあたっての前提として、Notionのデータ構造の特異性を認識する必要があります。Notionは人が使うには使いやすいインターフェースである一方で、AIが活用するにあたっては工夫が必要であるという点です。NotionのデータはAIに不向きであるという意見がSNS上では散見されます。例えば、以下の記事で説明されています。

note.com

今回の取り組みにおいては、Notionのデータ構造に対して処理を施し、AIに対しても読みやすい形に変換を行い、活用できるようにしています。当社では、Notionデータに限らず、AIが活用しやすいデータ形式に変換して、データを整備することは多く、この点の強みもあります。この記事は、いわゆるRAG (Retrieval-Augmented Generation)の取り組みにあたりますが、実際の利用にあたって十分な精度で活用を行うための、1事例としてもご参考にして頂ければと思います。

本記事では、実際の挙動をお見せした後に、構築した技術の全体像とそのポイントについて解説していきます。

2. 実際の挙動

まずは、実際の挙動です。ChatGPTに当社の強みについて質問した回答が以下になります。画像中にハイライトしている「エキスパートAI」という単語は社内で定義している単語になりまして、それを踏まえて回答を行ってくれています。回答のNotionマークを押すと回答に利用したNotionページを参照できるので、本当に正しいかどうかを人手で確認することも可能です。

実行例: 本記事のシステムでの挙動

ここで参照しているNotion記事の中には以下のように質問文にある「エキスパートAI」について記述してあるスライド画像が格納されており、今回はこれを参照して回答を作成してくれていました。

参照元のデータ

今回のシステム内では、画像データであってもデータ登録時に検索できるように処理(構造化)を行っており、検索することが可能になっています。この構造化処理を行わない場合、以下のような回答になるのですが、この場合、検索情報に必要な情報が不足していることに起因して、やや期待とズレた(断片的な)回答になってしまっていました。

実行例: 一般的なRAGの挙動

今回紹介するシステムでは、構造化処理によって回答の質も担保しながらChatGPTを活用し、利用しやすいインターフェースを構築することを行っています。

3. システムの全体像

今回ご紹介する機能の全体像を以下に示します。

システムの全体像

今回は、ChatGPTをインターフェースとして活用しつつ、裏側でコネクター(次章で説明します)に必要な機能(MCPサーバー)を実装しています。ChatGPTの内部のAIモデルがそのコネクターを活用した回答を生成します。技術スタックとしては、Microsoft Azureを中心に構成しており、データの管理にはSnowflakeやAI Searchを利用しています。ChatGPTを活用することで、裏側の仕組みだけ考えればよく、比較的簡易に構築が可能です。次章では、この構成を実現するためのポイントについて説明していきます。

なお、今回ご紹介する機能には執筆時点で、プレビュー版(Azure FunctionsのMCP bindings)やβ版(ChatGPTのカスタムコネクター)など本番利用に推奨されない機能が含まれます。実際に対応が追いついていない箇所もいくつか見られたので、期待通りの挙動にならない部分も一定存在します。ご自身の環境で利用する場合には、これらを踏まえて検討を行って下さい。(注目される領域ではあるので、早期に対応されることを期待はしています。)

4. 構築ポイント

4.1. ChatGPTとコネクター

まず、今回のシステム構成で重要なポイントであるChatGPTの「コネクター」機能を説明します。この機能は、ChatGPTが外部のデータソースを活用してチャットができるようになる機能になります。例えば、デフォルトで、Google DriveGmailと連携する選択肢があります。これらを選択することで、チャットを行う時に、適宜AIが判断して情報参照してくれるようになります。

以下の記事がコネクター機能についての公式記事になります。プランによって使える範囲が異なるので、使いたい場合は確認が必要です。また、コネクター機能は執筆時点で発展途上で更新も早いため、新規のコネクターなど随時追加されています。時折確認してみると機能アップデートされているかもしれません。

help.openai.com

ここまでは、ChatGPT内で事前に用意されたコネクターの話でしたが、このコネクター機能の連携先は自前で用意することも可能です。今回はこの機能を利用しました。このように、自前で用意したデータに対してアクセスできるようにするオプション機能を「カスタムコネクター」といいます。この機能の仕様には注意すべき点があるので、これは次節に説明します。

なお、実はデフォルトのコネクターとしてNotionも対応されていまして、こちらを活用することで、基本的なNotionの参照は実現できます。便利な機能なのでお手軽にまずは利用されることをおすすめします。一方で、データの検索性能はサービス(Notion⇔ChatGPT)側に依存するところではありますので、内部的な検索性能を更新することはできません。後述する構造化の処理を挟み、性能の改善を行いたかったため、今回はカスタムのコネクターとして独自にデータソースを用意することとしました。例えば、2章でお示しした実際の動作で行ったような画像データに対する検索性能など検索できる性能が拡張されています。*1

4.2. カスタムコネクターMCP

カスタムコネクターを使えば、独自に用意したデータを活用できることは前節で触れました。ここでは、カスタムコネクターについて深堀ります。ChatGPTをカスタムコネクターに接続するためには、「MCPサーバー」を立てる必要があります。AIの界隈では「MCP」は一般的な単語になりつつありますが、MCPとは、Model Context Protocolの略であり、AIエージェントにツールを持たせるための標準規格になります。この規格に則って開発を行うと、同じ規格に対応したクライアント(ここではChatGPT)に簡単に接続できます。ChatGPTのカスタムコネクターはこの規格に対応しており、MCPサーバーを用意することで接続することが可能です。(MCPについてもっと知りたい方は検索してみると丁寧に解説してある記事も出てくるかと思います。)

そのため、カスタムコネクターを利用するためには、MCPサーバーを立てる必要があります。MCPサーバー自体は任意にAIエージェントが利用するツールを作成することができるのですが、カスタムコネクター機能は情報検索の利用に制約が掛かっておりまして、使えるツールに制約があります。具体的には、 searchfetch のツールのみが利用可能で、それぞれ、テキストから検索、と、ドキュメントIDから詳細情報の取得、の機能になります。仕様に則って、この2つのツールのMCPサーバーを用意することによって、ChatGPTに接続することが可能です。カスタムコネクターの詳細については以下の記事にありますので実際に取り組む際はご参照下さい。

platform.openai.com

なお、このカスタムコネクターはβ版であることには注意が必要です。例えば、本来であれば、作成したカスタムコネクターをチーム全体に展開したいのですが、β版のため制限が掛かっています。今後開発が進み、正式リリースされることが待たれます。

4.3. MCPサーバーの構築

では、MCPサーバーを構築することを考えます。MCPサーバーの構築方法自体は様々あるので、手段はどのようでも構いません。ここでは、MCPサーバーを簡易に構築することが可能なAzure FunctionsのMCP機能で開発を行いました。これを活用すると、基本的に必要となるツールの関数を記述するだけでMCPサーバーを作成することができます。以下にドキュメントがあるのでこちらを参照できます。

learn.microsoft.com

本記事では、ChatGPTに接続しますが、MCPは標準規格のため、例えば、ClaudeやCursorなどMCPに対応しているサービスでも利用することも可能です。また、執筆時点においては、本機能はプレビュー版になりますが、先日のAzure OpenAI Service Dev Dayでロードマップも公開されており、Streamable HTTPとよばれる通信規格への対応なども含めて着実に対応される模様です。

ChatGPTのカスタムコネクターの接続はOAuth認証にも対応がされています。今回はMCPサーバーにOAuthの実装を施すことも考えました。MCPサーバーの認証として、API Managementを使う構成を公式で公開されていたので、これを活用しました。つまり、API ManagementをMCPサーバーとChatGPTの間に挟むことで認証の機能を搭載しました。詳細については以下のドキュメントが参考になります。

learn.microsoft.com

4.4. Notionとデータ管理

前節までで、ChatGPTと独自データの連携の方法は説明しました。最後に、独自データ側の整備についても説明したいと思います。システム全体像でお示ししたように、対象となるデータソース(ここではNotion)をSnowflakeを介してAzure AI Searchに保存することで、検索対象のデータとして登録することができます。自動で定期的に同期を行いつつ、データを最新に保つことで、AIエージェント側はAzure AI Searchの中のデータを参照するだけになります。

さて、この登録するデータですが、Notionデータを検索しやすい形に独自の変換(構造化)を施しています。まず、NotionのAPI経由で取得できるデータは個別の記事の全文が取れるというわけではなく、ブロックとよばれる記事ページ単位より細かい単位で取得されます。そのため、データの取得後にページ全体をAIが理解しやすいMarkdown形式でまとめ直しています。また、それに対して構造化処理をさらに行っており、例えば、画像データを説明する文章に変換するなど、AI、人にとっても分かりやすい形式に変換しています。これらを最終的には検索しやすい形式、つまりチャンク化(文章を適切に分割)等を行った上で、Azure AI Searchに格納しています。

冒頭でお見せした実際の挙動の中で参照したスライド画像は以下のような形に変換を行って、データの保存を行っています。

# ACES のエキスパート AI

ChatGPT などの汎用LLM(=優秀な新卒)では対応が難しい、業界・業務の専門知識や企業独自のナレッジを融合し、個社の強みと企業特性を踏襲した「エキスパート AI」を開発しご提供します。

## 汎用的な生成 AI
- 例: OpenAI など
- 「優秀な新卒AI」が業務を部分的に効率化
- 教科書に記述されている知識
- インターネットに公開されている情報
- 一般論な考え方

### 対応可能な業務
- 一般に公開されている情報を調べる業務
- 与えられた情報単体を整理する業務
- 一般論や型に沿ってアイデアを列挙する業務

## エキスパート AI /ACES
- 個社の強みと企業特性を踏襲した AI 開発
- お客様の生の声、リアルな情報
- 企業独自の業務の進め方やノウハウ
- 自社内に蓄積する情報やナレッジ

### 対応可能な業務
- 業界特有のルールや暗黙知を踏まえた業務
- 自社に蓄積されたナレッジを理解した業務
- 属人的なノウハウを必要とする高度な業務

画像の場合、単に文章化するだけではなく、全体的な位置関係も踏まえて構造的な文章にする必要があるため、一定の工夫が必要な場合があります。今回はこのような構造化処理を行うことによって、回答精度を向上させています。

5. さいごに

本記事では、ACESにおけるAI活用事例の一つとして、Notion × ChatGPTによる社内ナレッジ検索の取り組みをご紹介しました。この仕組みが情報資産を最大限に活かし、業務効率を高める上での参考になれば幸いです。今後も、社内外に役立つ取り組みやノウハウを積極的に発信していきたいと考えています。

関連する取り組みの紹介ですが、今回ご紹介したChatGPTでの利用の他に、同様のデータを参照するボットも社内Slack上でも稼働しています。AIエージェントと人が協働する場をつくるために、どのようなインターフェースや仕組みが有効かを試行しながら、最適な形を探っています。また、近年注目される「コンテキストエンジニアリング」の概念とも関連し、RAGやメモリ管理といった技術の活用も進めていきます。

AIの領域は、LLM(大規模言語モデル)の進化を背景にかつてないスピードで変化しています。大規模モデルの性能向上だけでなく、それを活用するためのインフラやツールも日々進化を続けています。ACESでは、この変化をいち早く捉え、スピード感を持って試行・導入を重ねることで、より大きな価値提供につなげていきたいと考えています。

ACESでは、AI活用を共に推進するパートナーとしてご支援しています。RAGの精度改善をはじめとする各種ソリューションや、業務改善や事業開発など、ニーズに合わせたサポートをご提供しています。ぜひ下記ページよりお気軽にご相談ください。

dxpartner.acesinc.co.jp

また、ACESでは共にAI活用を進めていく仲間も募集しています。ご興味をお持ちの方は、ぜひお問い合わせください。

recruit.acesinc.co.jp

*1:カスタムのコネクターを利用したかった背景としては、単に今回の取り組みで利用したいというだけではなく、デフォルトで対応されていないデータソースを含めてどの程度展開可能性があるかの検証の目的もあります。今回はNotionデータを対象としましたが、同じスキームで任意のデータに展開することができます。本文中にも記載をしましたが、デフォルトのNotionのコネクターでも一定対応できる範囲なので、まずはそちらの利用からご検討をおすすめします。