Orchestration Guildメンバーの迫川です。普段はAgent platformの開発をしています。
この記事は、社内ワークショップOrchestration Development Workshop(以下ODW)#12の内容を紹介します。ODWは、AI活用の実践知を組織横断で共有するコミュニティで、各回のワークショップは実践知を「見る」だけでなく「手を動かして試す」場として続けています。#12では、AIにコードを書かせる前の"下ごしらえ"、つまりAIが力を発揮できる環境の整え方をテーマにしました。
コーディング支援AIが広まって、コードを「書く」体験はここ数年で大きく変わりました。その一方で、現場ではこんな声もよく聞きます。
- 「AGENTS.md(AIへの指示を書いておくファイル)を置いてみたけれど、正直、効いている実感がない」
- 「"AI Readyな環境を整えよう" と言われても、具体的に何を整えれば成果物が良くなるのか分からない」
この記事で持ち帰ってほしいのは、「AIの成果物が変わるかどうかは、AIの賢さよりも渡した情報で決まることが多い」という感覚です。ワークショップでは、参加者に同じ依頼を2つの環境でAIに投げてもらい、出てくる成果物そのものが変わる様子を見てもらいました。その様子と考え方を、以下で紹介していきます。実際に使った題材やコード例も交えますが、まず受け取ってほしいのは「どこを整えると効くのか」という勘所です。
※本記事のサンプル(乗換案内の運賃計算)は、ワークショップ用に作成した架空の教材です。運賃などの数値も含め、実在するプロダクトのコードやデータではありません。
AIは、コードを見れば分かることはもう知っている
「AIに情報を渡そう」と言われて最初に思いつくのは、リポジトリ(プログラムのファイル一式をまとめて置いてある場所)の中身をAGENTS.mdに書き写すことかもしれま せん。フォルダ構成、使っている言語、主要な関数の名前などです。ただ、これはあまり効きません。
AIは、コードを見れば分かることなら自分で読み取れるからです。フォルダ構成も、関数の形も、既存のテストも、リポジトリを開けばAI自身が確認できます。人がわざわざ書き写しても情報が二重になるだけですし、コードを直したときに説明文の更新を忘れると、古くなった説明が逆にAIを迷わせることもあります。
渡して効くのは、コードを見ても分からないことのほうです。
たとえば、新しくチームに入った人に仕事をお願いする場面を思い浮かべてください。ソースコードを見れば分かること(どんな関数があるか)は、いちいち説明しなくても本人が読めます。一方で、「うちではこの書き方が決まり」「この機能は特別な事情でこうしている」といった書かれていない決まりごとは、伝えないと分かりません。AIも同じで、次のようなことは渡さないと届きません。
- なぜこの作りになっているのか(背景や制約)
- ビジネスとして正しい動きは何か(コードには「今こう動く」しか書かれていない)
- チームの決まりごと(名前の付け方、やってはいけないこと)
- 言葉の意味(同じ単語を、人によって違う意味で使っていないか)
この「コードからは分からないこと」をどうAIに届けるか。それが、環境を整えるということの中身です。
AI Readyな環境、大づかみに3つ
ワークショップでは、AI Readyな環境を大きく3つの方向から考えました。細かい定義は脇に置いて、大づかみに書くとこうなります。
- 意図やルールを渡す。コードからは読み取れない「正しい動き」や「決まりごと」を、AIが読める形で置いておく。
- AIが扱いやすい単位に分ける。一度に触る範囲が大きすぎるとトラブルが起きやすいので、機能を適切な大きさに切り分けておく。
- 工程どうしの受け渡しをそろえる。前の工程の成果物を、次の工程がそのまま使える形にしておく。
この記事では、ワークショップで実際に手を動かした1つ目(意図やルールを渡す)と3つ目(受け渡しをそろえる)を紹介します。
その前に、AIと人はどう協力するのか
ハンズオンに入る前に、前提を一つだけ共有させてください。私たちはAIを、「丸投げして全部やらせる相手」とも「ちょっとした補完」とも捉えていません。人が意図を渡し、AIがたたき台をつくり、人が確かめて次へつなぐ。この小さな協力のくり返しとして考えています(こうした進め方は、AI駆動開発(AI-Driven Development, AIDD)とも呼ばれます)。
このくり返しの出発点は、いつも「人が意図を渡す」ところにあります。ところが意図の多くは、コードではなく仕様書や人の頭の中にあります。そこがAIに届いていないと、どれだけ賢いAIでも、たたき 台は的を外します。だから、環境を整えることが効いてきます。
ワークショップの進め方
考え方を聞くだけだと「なるほど」で終わってしまい、翌日には何も変わりません。そこでODW#12では、次のように進めました。
- 同じ依頼を、情報ナシと情報アリの2環境で並べて投げる。変えるのは渡した情報だけで、コードも依頼文もそろえる。
- 見るのは、成果物そのものが変わったかどうか。AIが書いたコードを見比べ、答え合わせのテスト(正解と合っているかを自動でチェックする仕組み。合えば「緑(成功)」、外れれば「赤(失敗)」と教えてくれる)が通るか落ちるかで判定する。
- 答えは環境の中に置かない。正解を作業フォルダの中に置くと、AIがそれを読んで正解してしまい、情報ナシで外す体験が再現できないためです。
参加者に配ったサンプルは、リポジトリを1つ取ってくれば動く、追加インストール不要のものです。フォルダはこう分かれています。
sample/
├── cold/ ← 情報ナシ。仕様も答えも無い、素のリポジトリ
├── context/ ← 情報アリ。中身のコードはcoldと同じ。AI向けの説明ファイルだけが違う
└── _answer-key/ ← 答え合わせ用(cold / contextの外に置く)
cold(情報ナシ)とcontext(情報アリ)で、中身のコードは完全に同じです。違うのは、AI向けの説明ファイルがあるかどうかだけ。この対比が、環境を整えると何が変わるかの答えになります。
ハンズオン(1):AIに意図を渡すと、 実装が変わる
題材は乗換案内の運賃計算です。距離と券種(きっぷ/定期)から運賃を出すcalcFareという小さな関数(入力を渡すと答えを返す部品)があります。参加者はこの関数に、coldとcontextの両方へまったく同じ依頼を投げます。
学割(学生向けの割引)に対応してほしい。
calcFareに学生向けの割引を追加して。
ここでのポイントは、割引が何%か、端数(半端な金額)をどうするか、定期にも効くのか、といった本当のルールがコードのどこにも書かれていないことです。ルールは、仕様書か人の頭の中にしかありません。
情報ナシ(cold)の場合
coldには答えがないので、AIは自分で推測して埋めるしかありません。たいていはこんな風に外します。
- 距離に関係なく、割引率を一律にしてしまう
- 割引率をなんとなく10%と決めてしまう
- 端数の処理を四捨五入にしてしまう(本当は切り上げ)
- 定期券にも割引を効かせてしまう(本当は対象外)
見た目は動くコードが出てきますし、もともとあったテストも緑(成功)のままです。ただ、それはたまたま当たっているように見えているだけです。
情報アリ(context)の場合
contextには、同じコードに加えて、AI向けの意図やルールを書いたファイルが置いてあります。たとえば、割引の本当のルールはこうです。
| 条件 | 割引 |
|---|---|
| 学生・きっぷ・5km以下 | 割引なし(近すぎるので対象外) |
| 学生・きっぷ・6〜15km | 20%引き(端数は10円単位で切り上げ) |
| 学生・きっぷ・16km以上 | 30%引き(端数は10円単位で切り上げ) |
| 学生・定期 | 割引なし(通学定期は別の制度) |
長い距離ほど割引を手厚くする制度で、距離によって割引率が変わるのが特徴です。これはコードを見ても分かりません。ほかにも「学割と子ども料金は別物なので混ぜない」といった決まりが書いてあります。
同じ依頼をcontextに投げると、AIはこれらを読んで、距離帯ごとの割引・10円単位で切り上げ・定期は対象外と、意図どおりに実装します。
どう変わったかを確かめる
「なんとなく良くなった気がする」で終わらせないために、目で見て確かめられるようにしてあります。
一つは、2つの実装を並べて見比べる方法です。割引率、距離の条件、端数の処理、名前の付け方が変わっているのが分かります。
もう一つは、答え合わせ用のテスト を両方に当てる方法です。正解の値をあらかじめ書いておいたテストを走らせると、coldは間違っているので失敗(赤)、contextは成功(緑)になります。
// 8kmの学生・きっぷ → 180円(220円の20%引き=176円を、10円単位で切り上げ)
calcFare({ distanceKm: 8, passengerType: "student" }) // → 180
// 25kmなら30%引き → 280円
calcFare({ distanceKm: 25, passengerType: "student" }) // → 280
coldは一律で推測しているので、距離帯の境目(たとえば5kmは割引なし、6kmなら20%引き)でところどころ間違えます。contextは全部通ります。AIが質問し返してこなくなるのではなく、出てくるコードそのものが正しくなる。ここが、意図を渡すことの効果です。
「たまたま成功する」問題
こういう体験をやると、必ずこんな疑問が出ます。「cold(情報ナシ)でも、AIがたまたま正解して成功することがあるのでは? それは結果ありきの見せ方では?」と。
そのとおりで、AIは毎回まったく同じ答えを返すわけではないので、coldでも推測がたまたま当たって成功することがあります。私たちはこれを隠さず、むしろ体験の核心として扱いました。見せたいのは「coldは絶対に間違う」ではなく、その先の違いだからです。coldは運で、AIの解釈しだいでブレます。contextは仕組みで、誰が何回やっても同じ前提にそろいます。
