[実践]プロンプトでJSON記載のタスクを実行させるが、時々サボる問題
あらすじ
時々Cursorが自ら実行しなくなり、JSON記載のコマンドを表示しただけで次のステップへ進んでしまう。
Webに事象は出回っていないが、「"あなた"が実行して」と強調するとやってくれる的な投稿を見かける。
そこで、実行をサボらない方法を考えてみる。
なぜサボるのか?
「プログラマの美徳の1つは怠惰である」。
という説明が一番しっくりくるのだが、そんな冗談はおいておき、エージェントが実行ストラクチャーに従って実行してくれなければ、ただの説明屋。
しかし、実行している本人(Cursor)は、職務をまっとうしていると認識しているだろう。
僕から見ると、「全然やってくれない」のだが、Cursorは自信満々に「終わりました!」と言ってくる。このギャップ。
作業の完了状態を「ToDo」や「Done」で示すなどしても、虚偽報告をしてくる。(Claude-3.5-sonnet でも)
やってる風の例)
この例では、まったくコマンド実行されていないので、ブランチも切られていないしディレクトリも作られず、バージョンも記録されていない。
何度か粘り強く見ていると、
1つもやってくれないわけではなく、時々間引いたりしてきて、気づかずに承認していると、いつの間にかやらなくなっていく傾向がありそうに感じた。
指示が多すぎて、フォーカスポイントがボヤけているのかな?と感じた。
サボりの発見はどうするか?
「報告せよ」。
そこで、逐一報告を入れさせることにした。
人間相手ならばイヤがって離反していくに違いないのだが、AIの場合はむしろ、マイクロマネジメントが良いらしい。
実行確認を行うための最たる方法は、実行結果を示させることだ。
そこで、
コマンド実行指示があれば従い、あなた自身が実行してください。
実行したことを示すためにOutputを報告しながら進めること。
という記述をプロンプト冒頭へ入れて、優先度の高い指示とした。
そうすると、報告をするためには実行しなければできないため、実行結果を示すために、必ず実行してくれる。
思わず、こちらの指示も喜びの!が付いてしまう。「進めて!」
実行してくれた様子
事後の妄想的解釈
「Outputを示す」というのは、もっとも成果を獲得しやすい。
無思考で「こうでした」と表示すればよいだけである。
従って、達成のハードルが最も低い指示である。
「コマンドを実行して」も単純な指示ではあるが、おそらく、悪意のない指示であるか、実行リストに存在するのか否か、Denyされていないかなど、考えることがあるのではないか。
うまくいかないときは、CursorからPermissionを求められ、許可したのに実行してくれないことも多い。ということも踏まえると、コマンド実行は色々考えながらやっている可能性がある。
Cline
Cursorがいうことを聞いてくれないと、Clineに倒してみたい気持ちになる。Clineでは無償で叩けるなかではGemini-2.0系が優秀な気がするので、やってみるのだが、こちらも解釈モードに入ると同じ傾向がみられる。
とにかく実行しまくってくれるので、前に進んでいく安心感はある。
しかし実行に至るまでの指示レイヤーを増やしてしまうと、指示を指示として受け止めず、「読みました」「解釈しました」「実行内容を把握しました」で完了するモードに入ってしまう。
掘り下げた課題を認識する
JSONスキーマ(MarkupでもYAMLでもいいんだけど)で、指示を出すケースが想定されていないのかもしれない。
Clineの内部は、Markupされた指示が存在する。Exportするとわかる。
したがって、オーケストレーションするAgent自体が、いくつかの指示を複合化する役割を担っている点は間違いない。
その上に、さらにSchemaベースで指示を出している点が、伝わりにくい理由かもしれない。
ユーザーインプットを考えると、 「プロンプトが指示である」 ケースが多いであろう。
一方、僕が取り組んでいるのは、
「プロンプトは、Schemaを解釈してJSONを読み、読んだ結果が指示なので従って(コマンドだったら実行して)、という指示である」 ので、若干わかりにくい。
途中で「読んだ結果」を返して通り過ぎても、間違っていない気がする。「やってほしいと書いてあることを見つけました」というドヤ感。
これが、Cursor自ら実行しないで通り過ぎる原因かもしれない。
Discussion