私のコーディングエージェントがタスクを完了した。なぜスレッドが切れてしまったのか?
コーディングエージェントにおける最悪のバグは、クラッシュではありません。
それは、最初のタスクは成功したのに、次のメッセージを送った瞬間にエージェントが記憶喪失になったように感じられるときです。タスクを依頼し、エージェントがそれを完了する。その後、「ボタンを緑色にして」と伝えると……。
あなたにとっては同じ会話の続きです。しかしシステムにとっては、タスクの完了はセッションの終了を意味することがよくあります。そのため、システムはゼロからやり直し始めてしまうのです。
CliGateを構築している際、私は3つの異なるレイヤーを混同していることに気づきました:
- チャットの会話 (Conversation)
- ランタイムセッション (Runtime session)
- 現在の実行ターン (Current execution turn)
これらは別物です。
会話 (Conversation) は、対話を続けるための長期的な空間です。 ランタイムセッション (Runtime session) は、その会話における作業スレッドです。 ターン (Turn) は、そのセッション内で行われる単一の実行です。
タスクが完了したときに終了すべきなのは、ターンだけです。セッションはアクティブなまま維持されなければなりません。
壊れたフローは以下の通りです: ユーザーがタスクを依頼する -> ランタイムセッションが開始される -> タスクが完了する -> 会話によってアクティブなセッションがクリアされる -> 次のフォローアップで全く新しいセッションが開始される。
これにより、次のような短いフォローアップができなくなります:
- retry that(やり直して)
- do the same for this file(このファイルでも同じことをして)
- explain the error(エラーを説明して)
- continue(続けて)
システムが即座にセッションを切り離してしまうと、すべてを説明し直さなければなりません。エージェントは機能していても、会話が不自然に感じられてしまうのです。
私は、モデルに対して以下のルールを明示することでこれを解決しました:
- 会話は永続的であること。
- ランタイムセッションはデフォルトで維持(sticky)されること。
- 完了または失敗したタスクは、現在のターンのみを終了させること。
- 新しいセッションは、ユーザーが要求した場合、またはモデルが変更された場合にのみ開始すること。
タスクの完了を「セッションの死」として扱うのをやめました。この小さな変更が、製品全体の体験を向上させます。
CliGateでは、以下の条件の場合にのみ新しいセッションが開始されます:
- まだセッションが存在しない場合。
- ユーザーが新しいセッションを要求した場合。
- モデルの変更により、古いセッションとの互換性がなくなった場合。
これは人間の思考プロセスと一致しています。ユーザーは、一つのチャットタブが継続的な一つのスレッドとして機能することを期待しています。これは、TelegramやFeishuのようなモバイルアプリにおいて極めて重要です。
新しいロジックはシンプルです:
- 最初のメッセージがランタイムセッションを作成する。
- その後のメッセージはそのセッションを使い続ける。
- 完了してもスレッドは切れない。
- 明示的なコマンドによってのみ、新しいセッションが開始される。
これにより、エージェントは単なるコマンド実行器ではなく、同僚のように感じられるようになります。
コーディングエージェントを構築しているなら、これを覚えておいてください: 会話 (Conversation) は永続的な単位である。 ランタイムセッション (Runtime session) は再利用可能なワーカーである。 ターン (Turn) は、成功または失敗時に終了するものである。
これら3つのレイヤーを分離しましょう。そうすることで、フォローアップがようやく会話のように自然に感じられるようになります。
出典: https://dev.to/codekingai/my-coding-agent-finished-the-task-why-did-the-thread-die-2jk2
オプションの学習コミュニティ: https://t.me/GyaanSetuAi