🐷

[実践]プロンプトでJSON記載のタスクを実行させるが、時々サボる問題

2025/02/11に公開

あらすじ

時々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