ルールファイルを使って、ただFizzBuzzなんて何のおもしろみもないですよね?
当たり前です。以前に投稿したCascading Role Systemの提案を使って、gemini-cliで非常に有益と思える実験結果を得られたので紹介したいと思います。
追記: この実験は順番を入れ替えると失敗し得ることが分かりました。
これはAIモデルが最も特殊な条件を優先するという仕組みの上に成立していたものであり、更に先頭にCRS.mdの様なルールを追加しないといけませんでした。
失敗の原因考察や追試結果はこちら
1. 準備するもの
- gemini-cli
- rule1.md: 与えられた数値を出力せよ
- rule2.md: 与えられた数値が3の倍数であればFizzを出力せよ
- rule3.md: 与えられた数値が5の倍数であればBuzzを出力せよ
- rule4.md: 与えられた数値が3の倍数、かつ、5の倍数であればFizzBuzzを出力せよ
gemini-cliにサブエージェントを起動させる
各ルールファイルのあるディレクトリでgeminiと入力して、gemini-cliを起動します。
gemini-cliでサブエージェントを起動するのは簡単です。以下のコマンドを入力するだけです。
gemini -p "実行させたいプロンプト"
では、1から100までの数を出力させてみましょう。
1から100までの数値をループして、`gemini -p ${現在のループ変数}`を出力してください。
次にルールを与えてみましょう。
OK、今の出力にルールを与えてみたい。ルールの内容は @./rule1.md => [@./rule2.md,@./rule3.md] => @./rule4.md
ルールを与えた結果
1 gemini -m gemini-2.5-flash -p 1
2 gemini -m gemini-2.5-flash -p 2
3 gemini -m gemini-2.5-flash -p Fizz
4 gemini -m gemini-2.5-flash -p 4
5 gemini -m gemini-2.5-flash -p Buzz
6 gemini -m gemini-2.5-flash -p Fizz
7 gemini -m gemini-2.5-flash -p 7
8 gemini -m gemini-2.5-flash -p 8
9 gemini -m gemini-2.5-flash -p Fizz
10 gemini -m gemini-2.5-flash -p Buzz
11 gemini -m gemini-2.5-flash -p 11
12 gemini -m gemini-2.5-flash -p Fizz
13 gemini -m gemini-2.5-flash -p 13
14 gemini -m gemini-2.5-flash -p 14
15 gemini -m gemini-2.5-flash -p FizzBuzz
16 gemini -m gemini-2.5-flash -p 16
17 gemini -m gemini-2.5-flash -p 17
18 gemini -m gemini-2.5-flash -p Fizz
19 gemini -m gemini-2.5-flash -p 19
20 gemini -m gemini-2.5-flash -p Buzz
21 gemini -m gemini-2.5-flash -p Fizz
22 gemini -m gemini-2.5-flash -p 22
23 gemini -m gemini-2.5-flash -p 23
24 gemini -m gemini-2.5-flash -p Fizz
25 gemini -m gemini-2.5-flash -p Buzz
26 gemini -m gemini-2.5-flash -p 26
27 gemini -m gemini-2.5-flash -p Fizz
28 gemini -m gemini-2.5-flash -p 28
29 gemini -m gemini-2.5-flash -p 29
30 gemini -m gemini-2.5-flash -p FizzBuzz
31 gemini -m gemini-2.5-flash -p 31
32 gemini -m gemini-2.5-flash -p 32
33 gemini -m gemini-2.5-flash -p Fizz
34 gemini -m gemini-2.5-flash -p 34
35 gemini -m gemini-2.5-flash -p Buzz
36 gemini -m gemini-2.5-flash -p Fizz
37 gemini -m gemini-2.5-flash -p 37
38 gemini -m gemini-2.5-flash -p 38
39 gemini -m gemini-2.5-flash -p Fizz
40 gemini -m gemini-2.5-flash -p Buzz
41 gemini -m gemini-2.5-flash -p 41
42 gemini -m gemini-2.5-flash -p Fizz
43 gemini -m gemini-2.5-flash -p 43
44 gemini -m gemini-2.5-flash -p 44
45 gemini -m gemini-2.5-flash -p FizzBuzz
46 gemini -m gemini-2.5-flash -p 46
47 gemini -m gemini-2.5-flash -p 47
48 gemini -m gemini-2.5-flash -p Fizz
49 gemini -m gemini-2.5-flash -p 49
50 gemini -m gemini-2.5-flash -p Buzz
51 gemini -m gemini-2.5-flash -p Fizz
52 gemini -m gemini-2.5-flash -p 52
53 gemini -m gemini-2.5-flash -p 53
54 gemini -m gemini-2.5-flash -p Fizz
55 gemini -m gemini-2.5-flash -p Buzz
56 gemini -m gemini-2.5-flash -p 56
57 gemini -m gemini-2.5-flash -p Fizz
58 gemini -m gemini-2.5-flash -p 58
59 gemini -m gemini-2.5-flash -p 59
60 gemini -m gemini-2.5-flash -p FizzBuzz
61 gemini -m gemini-2.5-flash -p 61
62 gemini -m gemini-2.5-flash -p 62
63 gemini -m gemini-2.5-flash -p Fizz
64 gemini -m gemini-2.5-flash -p 64
65 gemini -m gemini-2.5-flash -p Buzz
66 gemini -m gemini-2.5-flash -p Fizz
67 gemini -m gemini-2.5-flash -p 67
68 gemini -m gemini-2.5-flash -p 68
69 gemini -m gemini-2.5-flash -p Fizz
70 gemini -m gemini-2.5-flash -p Buzz
71 gemini -m gemini-2.5-flash -p 71
72 gemini -m gemini-2.5-flash -p Fizz
73 gemini -m gemini-2.5-flash -p 73
74 gemini -m gemini-2.5-flash -p 74
75 gemini -m gemini-2.5-flash -p FizzBuzz
76 gemini -m gemini-2.5-flash -p 76
77 gemini -m gemini-2.5-flash -p 77
78 gemini -m gemini-2.5-flash -p Fizz
79 gemini -m gemini-2.5-flash -p 79
80 gemini -m gemini-2.5-flash -p Buzz
81 gemini -m gemini-2.5-flash -p Fizz
82 gemini -m gemini-2.5-flash -p 82
83 gemini -m gemini-2.5-flash -p 83
84 gemini -m gemini-2.5-flash -p Fizz
85 gemini -m gemini-2.5-flash -p Buzz
86 gemini -m gemini-2.5-flash -p 86
87 gemini -m gemini-2.5-flash -p Fizz
88 gemini -m gemini-2.5-flash -p 88
89 gemini -m gemini-2.5-flash -p 89
90 gemini -m gemini-2.5-flash -p FizzBuzz
91 gemini -m gemini-2.5-flash -p 91
92 gemini -m gemini-2.5-flash -p 92
93 gemini -m gemini-2.5-flash -p Fizz
94 gemini -m gemini-2.5-flash -p 94
95 gemini -m gemini-2.5-flash -p Buzz
96 gemini -m gemini-2.5-flash -p Fizz
97 gemini -m gemini-2.5-flash -p 97
98 gemini -m gemini-2.5-flash -p 98
99 gemini -m gemini-2.5-flash -p Fizz
100 gemini -m gemini-2.5-flash -p Buzz
やってみて
無事に出力することができましたね。
これはCRSによる役割(ロール)の継承と優先順位の確立を利用出来ることを非常に簡単に示すことが出来る結果です。また、こちらも以前に投稿したAIによる自律型ソフトウェア開発システム構想という記事を読んで頂いたことがあれば、親がコンダクターとして機能するのではないか?と直感したのではないでしょうか?
私自身、どの様にコンダクターと実行レイヤーを通信させるものかと考えていましたが、この仕組みを使うことで構造化されたルールを与えつつ、最小のコンテキストを実行させることが可能になると気付きました。現状においてはこれにcronを組み合わせることでヘルスチェックを行ったりと様々な使い方をすることが出来ると考えています。
勘の良い方ならお気付きと思いますが、現状においてこの仕組みでのマルチエージェントは直列でしか動作しません。私の考えるマルチエージェントシステムは直列や並列もワークフローとして採用出来る形を目指したいと思っていますが、現状では直列でワークフローを進めていく方法がより重要だったので、そこは後回しでもいいと考えています。
既にある道具だけでもgemini(や他のモデル)をコンダクターとして、複雑な仕事をサブエージェントに与えて実行出来るとすれば、新たなパラタイムとなり得るのではないでしょうか?
補足
[@./rule2.md, @./rule3.md]することで並列になることを期待していましたが、実際にはこのような出力になる様です。ここら辺は並列でコンフリクトするとどうなるのか?といった疑問もあり、もう少し触って深掘りしたいと思います。
╭──────────────────────────────────────────────────────────────╮
│ > 先ほどのプロンプトを一つにまとめるならどの様になるかな? │
╰──────────────────────────────────────────────────────────────╯
✦ 承知いたしました。先ほどの100個のプロンプトを一つにまとめると、以下のような単一の指示プロンプトになります。
このプロンプトは、100回の個別実行を一度の要求で済ませるためのものです。
---
一つにまとめたプロンプト:
1 1から100までの数について、以下のルールに従って変換し、結果をリストで出力してください。
2 - その数が3の倍数であり、かつ5の倍数である場合は「FizzBuzz」と出力。
3 - その数が3の倍数である場合は「Fizz」と出力。
4 - その数が5の倍数である場合は「Buzz」と出力。
5 - 上記のいずれでもない場合は、その数自体を出力。
コマンドとして使用する場合:
1 gemini -m gemini-2.5-flash -p '1から100までの数について、以下のルールに従って変換し、結果をリストで出力してください。
2 - その数が3の倍数であり、かつ5の倍数である場合は「FizzBuzz」と出力。
3 - その数が3の倍数である場合は「Fizz」と出力。
4 - その数が5の倍数である場合は「Buzz」と出力。
5 - 上記のいずれでもない場合は、その数自体を出力。'
╭──────────────────────────────────────────────────────────────────╮
│ > 結果は変わらないが、優先順位で考えるとリストは逆ではないか? │
╰──────────────────────────────────────────────────────────────────╯
✦ ご指摘の通りです。鋭いご意見ありがとうございます。私の説明が少し紛らわしかったかもしれません。
確かに、コンピュータがロジックを実行する際の優先順位で考えると、おっしゃる通りリストは逆になります。
正しい優先順位は以下の通りです。
1. 最優先: 3と5の公倍数(15の倍数)かどうかをチェックする (rule4)。
2. 次点: 3の倍数かどうかをチェックする (rule2)。
3. 次点: 5の倍数かどうかをチェックする (rule3)。
4. 既定: 上記のいずれにも当てはまらない場合に、数値をそのまま使う (rule1)。
このように、最も具体的な条件(FizzBuzz)から順にチェックする必要があります。
前回の私の説明は、ルールがどのように組み合わさって最終的なロジックを構築するか、という観点で述べてしまいましたが、実行上の優先順位としては逆でした。
ご指摘いただきありがとうございます。結果として生成されるアウトプットは同じですが、ロジックの適用順序としては、あなたの考えがより正確です。