AIエージェントの作り方|想像ではなく実際の文面から作る

AIエージェントの作り方で最初に効くのは、話しかけられた一文をどの処理へ振り分けるかという入り口の分岐です。水回りリフォームの現地調査アプリで、正規表現の分岐を27本書き、34本まで増やしても、見積のやり直しが一度も始まりませんでした。列挙をやめて判定をモデルに渡し、ファイルごと消すまでの記録です。
ai-agent-tsukurikata-shippai-bunrui リード図解

私はADHD(不注意や多動・衝動性に特徴がある発達障害)なので物をよく無くします。そこで玄関にラベルを貼りました。帰ってきたときに、手に持っているものをどこへ置くか、先に決めておきたかったからです。

鍵、財布、イヤホン、眼鏡拭き。棚のふちに、テープで4枚並べました。

ところが、実際に持って帰ってくるのは、そこに書いていないものばかりでした。傘、レシートの束、保育園からの紙、コンビニの袋。

そこでラベルを足しました。18枚になりました。それでも、置き場所が決まっているものは半分もありません。

同じような振り分けの問題は、AIを業務に組み込む場面でも起きます。AIエージェント(利用者の指示に応じて必要な処理を選び、実行する仕組み)を業務に組み込む会社が、ここ数年で一気に増えてきました。ただ、AIエージェントの作り方で最初に効いてくるのは、AIの中核となるモデルの選定でも、開発の土台となるフレームワークの選定でもありません。話しかけられた一文を、どの処理へ振り分けるかという、入り口の分岐です。

僕も、AIエージェントの入り口の分岐の作り方を外しました。採ったのは、来そうな言い回しを人が1本ずつ書き出し、文字列のパターンで入力を判定する正規表現というやり方です。分岐を27本並べ、34本まで増やし、最後にファイルごと消しています。

先に一行だけ置きます。AIエージェントを作るとき、利用者がどう話しかけてくるかを、人が想像で書き出してはいけません。 列挙できるのは、書いた人が思いつく言い方だけだからです。

今回話すプロジェクトは、水回りリフォームの現地調査アプリに、話しかけ欄を付けた

大企業と僕の会社の共創事業として、水回り専門のリフォーム会社が使う、現地調査アプリを立ち上げました。最小限の機能だけを先に作って現場に出す、MVP(必要最小限の機能で価値を確かめる製品)という進め方です。扱うのは、戸建てのユニットバス、洗面台、トイレの入れ替えです。

現地調査は、調査担当が1人で客先へ行きます。浴室、洗面所、トイレの順に、寸法と配管の位置と既存の型番を、写真つきで記録していきます。1軒あたり40分から60分。その場で概算の見積を出して、帰る前に、工事を頼む家の持ち主に見せます。現場では、この人を施主と呼びます。

作ったのは、その調査アプリの下に置いた、話しかけ欄です。項目を順に選ばせるのをやめて、「次へ」でも「ユニットバスを一段下げて」でも、思ったことを一文だけ入れれば通る、という欄にしました。調査担当は、手が濡れていたり、しゃがんでいたりして、画面を細かく触れない時間が長いからです。

話しかけ欄に来る言葉は、3種類に割れます。画面を進める指示(「次の箇所へ進んで」「ここは飛ばして」)。いま見ている設備についての質問(「この給湯器、まだ部品って出ますか」)。そして見積のやり直し(「ユニットバス、ひとつ下のグレードで出し直して」)です。

今日は、その振り分けをどう作って、どう外したか、という話をしていこうと思います。

前置きはさておき、本題に入ります。

① 教科書どおりに、正規表現で分岐を書いた

ai-agent-tsukurikata-shippai-bunrui 図解 1

AIエージェントの作り方の教科書には、入り口の分岐について定石が書かれています。モデルを呼ばずに決められるものは、正規表現で即決する。 そのほうが速く、安く、結果がぶれないからです。

素直にそのとおり書きました。

次へ進む言い方を6本。飛ばす言い方を6本。戻る言い方を3本。見積のやり直しを疑う言い方を12本。合わせて27本の正規表現を並べ、どれにも当たらなかったものは質問として扱う、という作りです。

この27本は、ちゃんと動きました。「次へ」と打てば次の箇所へ進み、「スキップ」と打てば飛びます。モデルを呼んでいないので、返りは一瞬です。

調査アプリを社内で見せたときも、問題は出ませんでした。この段階では、教科書が正しいと思っていました。

② 現場で使ってもらったら、見積のやり直しが一度も始まらない

ai-agent-tsukurikata-shippai-bunrui 図解 2

ところが、調査アプリを実際の現場の調査担当に使ってもらうと、様子が変わりました。

見積のやり直しが、一度も始まりません。調査担当が話しかけ欄に打ち込んでも、見積は作り直されず、ただの返事が出るだけです。

最初に疑ったのは、見積を作り直す側の処理でした。呼ばれてから中で失敗しているのだろう、と考えたからです。

処理の記録であるログを開くと、そもそも呼ばれていませんでした。入り口の時点で、質問の経路に流れていました。

そこで、見積のやり直しを疑う言い方を12本から19本に増やしました。「プランを変えて」の語順違い、「別の候補を出して」の言い回し。そのうえで、遠回しな頼み方まで足しています。雨や暑さの話、疲れたという体調の話、もっと短くという時間の話。施主が横にいる場で「安くして」とは言いにくい。だから、そういう言い方で見積を軽くしてくれと頼んでくるのではないか、と考えました。分岐は全部で34本になりました。

それでも、見積のやり直しは始まりませんでした。

③ 気づいたのは、拾えなかった一行をログに出したとき

ai-agent-tsukurikata-shippai-bunrui 図解 3

増やしても動かないので、増やす手をいったん止めました。

代わりに、どのパターンにも当たらなかった入力を、そのまま書き出す一行をログに足しました。当たったときはどのパターンに当たったかを、当たらなかったときは入力の頭から60字を残します。

半日ぶんのログを開いて、当たらなかった側だけを読みました。

並んでいたのは、こういう文です。「みつもりやりなおして」。「ユニットバスやめて」。「おまかせで」。

漢字が1文字も無い入力があります。設備の名前に否定形をくっつけただけの口語があります。何をしてほしいのか書いていない、丸投げの一言があります。34本のどれにも、かすりもしていませんでした。

ここではっきりしました。増やす方向が、そもそも間違っていました。

④ 原因を1件に絞る

ai-agent-tsukurikata-shippai-bunrui 図解 4

外した理由として思い当たることは、いくつもあります。テストに使った入力が綺麗すぎたこと、現場に出るのが遅かったこと、ログを最初から出していなかったこと。

ただ、原因を絞ると1件でした。

利用者がどう話しかけてくるかを、人が想像で書き出したこと。

列挙できるのは、書いた人が思いつく言い方だけです。ところが実際に来るのは、思いつかなかった言い方のほうです。27本でも34本でも、この関係は変わりません。数が足りなかったのではなく、列挙という方法が入り口に向いていませんでした。

⑤ 直したのは1箇所だけ

ai-agent-tsukurikata-shippai-bunrui 図解 5

やったことは1件です。見積のやり直しの判定からだけ、正規表現を全部消しました。 19本が0本になっています。

代わりに、モデルが必要に応じて呼び出す「道具」を1つ渡しました。道具といっても実体は短い定義文で、「見積をやり直す」という名前と、呼ぶときに何を添えるかが書いてあるだけです。呼ぶかどうかは、モデルが決めます。呼べば見積の作り直しが走り、呼ばなければ普通の返事になります。

画面を進める指示の分岐は、そのまま残しました。「次へ」「スキップ」「戻る」は、言い方が有限だからです。

分岐のファイルは、81行から52行になりました。

この状態で同じ入力を流すと、「みつもりやりなおして」も「ユニットバスやめて」も「おまかせで」も、見積のやり直しとして拾われました。

⑥ あとで知った ── その渡し方には名前がついていました

ai-agent-tsukurikata-shippai-bunrui 図解 6

しばらくして、ソフトウェアの設計について長く書いてきた Martin Fowler のサイトで、開発会社 Thoughtworks の技術者が寄せた実務記事を読み、手が止まりました。

Kiran Prakash が2025年5月に書いた、モデルに関数を呼ばせる話です。そこには、モデルは呼び出しを自分では実行せず、呼び出しの中身を説明するデータを作って、別のプログラムに渡すだけだ、と書かれていました。原文はこうです。「The LLM does not execute these calls directly, instead it creates a data structure that describes the call, passing that to a separate program for execution and further processing」。

僕が手探りでやったのは、まさにこれでした。名前は function calling、日本語では関数呼び出しと訳されています。同じ記事には、道具に付ける説明文が、その道具が何のためのものかをモデルに伝える、とも書かれていました。原文は「the description field provides extra context to help the LLM understand the function’s purpose」。

つまり、分岐は消えていませんでした。正規表現から、道具の説明文へ引っ越しただけです。

引っ越したのなら、移った先が効いているかどうかを確かめる方法が要ります。それも同じサイトにありました。Bharani Subramaniam と Martin Fowler が2025年2月に出した、生成AIのパターン集です。特定の仕事の文脈でモデルの応答を評価すること。それに Evals(評価)という名前が付いていました。原文は「Evaluate the responses of an LLM in the context of a specific task」です。

続けて書いてあるのは、Evalsでは結果を合格か不合格かの2択で見ない、ということです。合格とみなす基準値であるしきい値を置いて、前より下がっていないかを確かめる。 原文はこうです。「Unlike tests, they aren’t simple binary pass/fail results, instead we have to set thresholds, together with checks to ensure performance doesn’t decline」。

説明文は、書いて終わりではなく、測るものでした。新しい理屈は、ひとつも要りませんでした。

⑦ 変えてみて、何が良くなって、何を失ったか

ai-agent-tsukurikata-shippai-bunrui 図解 7

正規表現を消してから22日後、画面を進めるために残していた15本——次へ6本、飛ばす6本、戻る3本——も消しました。分岐のファイルは、52行まるごと削除しています。

いま入り口にあるのは、モデルへ渡す道具が3つだけです。見積をやり直す、いま見ている設備について調べる、画面を進める。どれを呼ぶかは、毎回モデルが決めます。

ただ、代償があります。3件書いておきます。

1件目。「次へ」の一言でも、モデルを1回呼ぶようになりました。 正規表現なら待ち時間ゼロで返っていたところに、通信と生成の時間が乗ります。速さと安さを、判断の幅と交換した形です。

2件目。分岐は消えず、説明文へ移りました。 3つの道具に付けた説明文を数えると、合わせて1,391字あります。52行のファイルが、1,391字の散文に置き換わった形です。

そして道具を3つにしてから17日後、散文になった副作用が出ました。「静かな給湯器ってないですか」という、調べてほしいだけの一言が、見積のやり直しへ流れていたのです。見積が丸ごと作り直され、関係のない設備が候補に混ざりました。

だから、説明文に境目を書き足しました。「見積をやり直す」は見積を作り直すとき専用で、近い製品のおすすめや在庫の質問は調べる側へ回す、と明記しています。

そのうえで、説明文に書き足した境目が効いたかどうかを、道具の選択結果で確かめました。現場から集めた入力を並べ、こちらが「これはこの道具を呼ぶ場面だ」と決めた正解(期待する振り分け)と、モデルが実際に選んだ道具が一致するかを数えました。比べる入力は、書き足したあとに現場から集まったぶんを足して、45件から54件に増やしています。一致は、45件中38件から、54件中54件になりました。 「静かな給湯器ってないですか」は5回中5回とも見積のやり直しに流れていたのが、6回中6回とも調べる側になっています。

3件目。利用者の一文だけでは、呼ぶ道具が決まらなくなりました。 「それも見積に入れて」と言われても、「それ」が何を指すのか分かりません。だから、会話の文脈として、直前のやり取りを毎回8件ぶん一緒に渡すようにしています。渡す量が増えれば、そのぶん費用も増えます。

⑧ 現場でAIエージェントを作るなら、この順番

ai-agent-tsukurikata-shippai-bunrui 図解 8

入り口の分岐を決めるときに使っているのは、次の3つの問いです。

問いはいいいえ
言い方が有限か(ボタンの文言・決まった合図)正規表現で即決するモデルへ道具として渡す
間違えても誰かが気づくか(画面に出るか、黙って進むか)そのまま任せる人が確かめる一段を挟む
説明文を直したあと、測れるか進めてよい先に入力の一覧を作る

いちばん効くのは、3つ目の問いです。説明文は、人が普段使う言葉で書く自然言語なので、ある道具の説明文を直した瞬間に、説明文を直していない道具の判定まで動きます。 45件中38件だった一致が54件中54件になった一方で、書き足し方を誤れば逆へも同じだけ動きます。

だから、AIエージェントを作る順番は次の4件になります。

1件目、入り口の分岐を1つだけ選ぶ。全部を一度に道具へ移さない。

2件目、その分岐に来る入力を、実際に動いているアプリのログから集める。「みつもりやりなおして」は、机の上では出てきません。

3件目、道具の説明文を書き、集めた入力を流して、どの道具が選ばれたかを数える。ここで初めて、説明文が良いか悪いかを言えます。

4件目、説明文を直したら、同じ入力をもう一度流して、下がった項目が無いかを見る。合格と不合格ではなく、前回の数字と比べます。

この4件は、扱っているものには依存しません。浴室でも、部品でも、契約書でも同じです。

⑨ この作り方が効き続ける理由

ai-agent-tsukurikata-shippai-bunrui 図解 9

モデルが賢くなっても、この順番は変わらないと考えています。

話しかけ方を決めているのは、モデルではなく利用者だからです。日本語を話す人の数だけ言い方があり、そこには漢字を打たない人も、否定形で頼む人も、丸投げする人もいます。列挙が追いつかないのは、モデルの性能の問題ではありません。27本を34本に増やしたときと同じことが、モデルを新しくしても起きます。

一方で、道具の説明文の効き方は、モデルを乗り換えると変わります。同じ説明文を渡しても、道具の選ばれ方が動きます。だから資産になるのは説明文そのものではなく、説明文を測るための入力の一覧のほうです。その一覧を1本作っておけば、乗り換えるたびに使い回せます。

この入り口の設計を実際の業務に落とす話は、AIエージェント開発のページに整理しています。作りかけのAIエージェントで、どこまでを正規表現で決めるか迷っている工程があれば、こちらからご相談ください。

玄関のラベルは、18枚とも剥がしました。棚に置いたのは、いちばん大きいカゴを1つだけです。

代わりに、カゴの横へ紙を貼りました。何を入れていいかを書いた紙です。

いま貼っているのは3枚目の紙で、いちばん下の行に「傘はここに入れない」と書き足したところです。

以上です。

▶ この記事のテーマを実務で相談する: AIエージェント開発

You May Also Like

デザイン思考とは?8人に聞いたら全員が同じことを言った

デザイン思考とは、使う人の観察から出発して解決策を組み立てる進め方です。ワークショップで8名に意見を聞いたところ、共通して出たのは「ごちゃごちゃして見える、わかりづらい」でした。ここで画面を整理しに行くと外します。整理すべきは見た目ではなく機能の構造で、そのために先に作るのがファンクションリストでした。横向きで使う場面の行動観察から、進行方向の表現を水平に統一した経緯まで書きます。
View Post

MCPとは?検索画面を作るのをやめてMCP接続にした

MCPとはModel Context Protocolの略で、AIと社内の道具やデータを繋ぐための共通の作法です。社内ナレッジを全社に開くために専用のフロントエンドを作ろうとしていましたが、初期フェーズではそれを見送り、MCP接続を主軸にする設計変更をしました。理由は画面が要らないからではありません。画面を作ると、そこに認証も権限も検索体験も全部くっついてくるからです。残したのはAPIキーの発行とフォルダごとの権限管理だけでした。何を作らないと決めたのかを書きます。
View Post

ファインチューニングとは?その前に分類ではないかを疑う

ファインチューニングとは、学習済みモデルに自社のデータを追加学習させて特定の用途に合わせることです。AIの出力を検査する仕組みを作るとき、最初は生成モデルを賢くしようとしていました。ところが必要だったのは生成ではなく分類でした。Macの16GBで常駐でき、高速に動くエンコーダー型を選び、100件を目視で作ってから6000件へ拡張しました。言い換えや翻訳は100%、抽象化された要約は70〜80%止まります。選定の理由とデータセットの作り方を書きます。
View Post

ローカルLLMとは?大企業が行き着く理由と、届かない見積書

ローカルLLMとは、AIのモデルを外部のクラウドに預けず、自社が管理する環境の中に置いて動かす構成です。大企業がAI導入で止まるのは性能ではなく、社内データが外に出ること。ならば自社で動かせばいい——そう考えて見積もりを取ったら、私たちは止まりました。止めたのはGPUの固定費です。そこから分かったのは、全部を所有する必要はないということでした。100MBのモデルで振り分けだけを自社に持ったら、精度は95%から97%になりました。所有すべき場所を決めるための表を、そのまま置きます。
View Post

プロンプトインジェクションとは?禁止をプロンプトに書かない

プロンプトインジェクションとは、AIへの指示文に別の指示を紛れ込ませて、本来の制約を外させる攻撃です。対策としてまず思いつくのは、システムプロンプトに禁止事項を書き足すことです。私たちもそうしました。そして守られませんでした。プロンプトによる禁止は確率的で、ツール層のフックは決定的です。44行のフックで守る側へ移した実装と、パスの正規化や失敗時に閉じる設計まで、そのまま書きます。
View Post