いつも私のブログを読んでくださり、本当にありがとうございます!!
今日は、最近私が没頭している「AIエージェント開発」の世界について、少し情熱的にお話ししたいと思います。
実は、日々の小さな開発や調査を通じて、ある「言語」の重要性を痛感しているんです。
それは、図解をテキストで記述できるドメイン固有言語、***「Mermaid」***です!!
言葉の壁を超える「Mermaid」という絆
最近のAIは本当に優秀で、私たちの言葉を驚くほど正確に理解してくれます。
でも、プロジェクトが複雑になればなるほど、言葉だけではどうしても限界が来てしまうことがあるんです。
「Aの場合はB、でもCの時はDに分岐して……」
そんな複雑なロジックを言葉で伝えようとすると、文脈が重なり、小さな誤解が積み重なって、最終的にAIが迷子になってしまう……そんな経験、皆さんはありませんか?
そこで私が辿り着いた答えが、***「フロー図(Mermaid)で伝える」***という方法でした。
今年の1月から、私は必死に勉強しました。AIとより深く、正確に意思疎通を図るために、自分の手でMermaidを書けるようになるまで、毎日毎日、修行のようにコードを叩きました。
今では、自己流ではありますが、自由にフローを描けるようになりました。プログラミングをするような感覚でAIに「機序(仕組み)」を伝える。その通りにAIが動き出した時の感動は、言葉では言い表せないほど大きなものです!!
「変換」の難しさと、AIエージェントの成長
ただ、Mermaidにも「泣き所」があります。それは、ツールによってレンダリング(表示)の解釈が微妙に異なることなんです。
VSCodeでは綺麗に見えるのに、Typoraではエラーになってしまう。まるで一昔前のブラウザ戦争を思い出させるような状況が、今Mermaidでも起きています。
そこで私は、AIエージェントに「Mermaidの互換性変換」を任せることにしました。
最初は、「AIなら簡単に変換してくれるだろう」と楽観視していました。でも、現実はそう甘くありませんでした。AIは自信満々に「完了しました!」と報告してくれるのに、実際に出力された図が壊れていたり、指定した仕様が守られていなかったり……。
ここで私は一つの大きな気付きを得ました。AIは直接ファイルを書き換えるだけでなく、***「内製のスクリプト」***を自ら生成して、それを実行することで仕事を成し遂げようとしているのだと。
そのスクリプトに僅かなミスがあれば、結果は当然失敗します。だからこそ、私はAIエージェントの「機序」そのものを見直すことにしたんです。
成功への鍵は、自己レビューと絶え間ない改善
新しく構築した機序では、以下のプロセスを鉄の掟として組み込みました。
***1. 仕様と入力を徹底的に理解する***
***2. 内製スクリプトを生成し、変換を実行する***
***3. 出力結果をAI自身が「自己レビュー」し、ミスがないかチェックする***
***4. もしミスがあれば、スクリプトや仕様をその場で修正し、再トライする***
この「自己レビューと修正のループ」をMermaidのフローに明示的に組み込むことで、AIエージェントは驚くほど正確に、計画通りに成果物を出せるようになりました。
ちなみに、以下が私のAIエージェントプロジェクト構造の中に「入れ子」で実行される変換の機序となります。
# mermaid変換処理方法
## フローのオブジェクト説明
- 仕様: `#file:.main/mermaid変換仕様.md`のこと
- 入力: フォルダ`.main/transfer`フォルダ直下の全ファイルのこと
- 出力: フォルダ`.output/transfer`フォルダ直下の全ファイルのこと
- 報告<完了>: `#file:.output/結果報告.md`のこと
- 報告<警告>: `#file:.output/結果報告.md`のこと
```mermaid
flowchart TD
RT-START(["開始"]);
%%オブジェクト
RT-O-01000[/"o-01000: 仕様"/];
RT-O-01100[/"o-01100: 入力"/];
RT-O-01200[/"o-01200: 出力"/];
RT-O-01300[/"o-01300: 報告"/];
%%アクション
RT-A-01000["a-01000: `仕様`を把握する"];
RT-A-01100["a-01100: `入力`を読み込み把握する"];
RT-A-10000["a-10000: `入力`に対して
`仕様`を基に変換する"];
RT-A-11000["a-11000: `出力`に対して
mermaidの仕様から外れた部分が無いか
チェックする"];
RT-A-11100["a-11100: 内製スクリプト内容など
変換方法を再検討する"];
RT-A-11200["a-11200: `仕様`のせいでmermaidが正しくできない場合は`仕様`を訂正する"];
RT-A-11300["a-11300: 今回の変更内容の報告書を作る"];
%%ブランチ
RT-B-01000{"b-01000: 読むべき`入力`がまだあるか?
全ファイル処理終わるまで繰返し"};
RT-B-01100{"b-01100: `出力`にmermaidの仕様から外れた部分は無く、正常か?"}
%%フロー
RT-START -->
RT-O-01000 --> RT-A-01000 --> RT-B-01000 -->|YES| RT-O-01100 --> RT-A-01100 --> RT-A-10000 --> RT-O-01200 --> RT-A-11000 --> RT-B-01100 -->|YES| RT-B-01000;
RT-B-01100 -->|NO | RT-A-11100 --> RT-A-11200 --> RT-A-10000;
RT-B-01000 -->|NO | RT-A-11300 --> RT-O-01300 --> RT-END;
RT-END(["終了"]);
```
AIは日々進化しています。今日書いたことは、明日にはもう過去のものになっているかもしれません。でも、この「機序を大切にする心」と「AIと共に歩む情熱」だけは、変わらずに持ち続けていきたいと思っています。
皆さんも、AIという最高のパートナーと共に、新しい世界を描いてみませんか?
それではまた次の記事でお会いしましょう!!

