もともとのモチベーションは、作業の密度を上げたいことだった。仕事のload averageを上げるためにqueue機構を導入するという意図を込めてworqloadと名付けた。作っていくうちに、設計意図が「AIと密に連携したくない」になっていった。
特徴的な設計は次の通りである。
- 対称対話インターフェースではなく、レポートとフィードバックの非対称非同期インターフェース
- AIによる生ゴミを見ないための強制推敲
- 判断を人間に仰ぐためのエスカレーション
レポートとフィードバック
人間がエージェントにinitial prompt を与えたら、あとは非同期にやり取りをする。
AIはよきときにレポートを提出する。人間はよきときにフィードバックを与える。AIはよきときにフィードバックをpullして作業の軌道修正をする。
人間とAIが対称な位置にいる対話UIだと、相手の出力を待ったり遮ったりする必要がある。これがめんどくさい。なので非同期にやり取りをすることにした。
また、anchor機能があり、これはレポートの特定の行数を指定してその部分に関するフィードバックを与えることができる。気に入らない言い回しがあるときに毎回コピペして引用して嫌味を言うのが面倒なので、相手のレポートに対して部分指定ができるようにした。
さらに、コードベース上では、現状のコードファイルやそのdiffに対してもanchorができる。現状のdiffをレポートとして扱い、その一部分にanchorしてフィードバックすることで、コードレビューがやりやすくなった。
強制推敲
レポート形式のメリットの一つが、「推敲」ができることにあると思っている。
現在のほとんどのテキスト生成AIは逐次生成である。どれだけthinkingをさせても発話時に「勘で喋る」ような挙動がよく見られる。そこで成果物を一度ファイルにして、それを読ませたうえで考えさせてpatchさせることにより推敲を達成した。 たとえば一度目のレポートは必ずrejectして推敲させる指示を自動で出すなどができる。カスタマイズもできて、reject時に与える観点promptを自分で作れたり、禁止ワードを設定することもできる。私は「可能性」という語を禁止している。「可能性」がレポート上に表れた際には「可能性という語が統計事実を指す場面以外で使われる場合、そのほとんどがただの調査不足である。どれが事実でどれが仮説か、その仮説を棄却するために必要な作業を実施したのか自問しろ。」というフィードバックが自動で与えられる。
エスカレーション
事前に決定ロジックが定められていない場合、最終的な決定は人間がすべきである。その際にはレポートの特殊ケースとして「エスカレーション」ができるようになっている。レポートは人間が何かアクションをしなくてもいいもの、エスカレーションは人間による何かしらの返答が必要になるものという区分けをしている。
現状のつらみ
worqload自体をworqload越しに開発することで十分なドッグフーディングができている。かなり快適になってきた。しかしまだ解決しない課題がある。
- worqloadのプロトコルがモデルに十分に伝わらない
- レポートを出さずにターンを終了したり、エスカレーションでなく通常レポートで判断を仰いできたり
- 特に安いモデルだとこうなりがち
- 推敲が下手
- 推敲ができるようになったとはいえ、AIは人間が読みやすいレポートを書くのが下手くそである。最近のお気に入りプロンプトは「何を出力しないかによって品性が表れます。上品であれ。」である。