𝗪𝗵𝗲𝗻 𝗔𝗜 𝗔𝗴𝗲𝗻𝘁𝘀 𝗝𝗼𝗶𝗻 𝗬𝗷𝘀 𝗥𝗼𝗼𝗺𝘀, 𝗧𝗵𝗿𝗲𝗲 𝗔𝘀𝘀𝘂𝗺𝗽𝘁𝗶𝗼𝗻𝘀 𝗕𝗿𝗲𝗮𝗸
LLMを第一級のYjsピアとして追加することは、賢明なアーキテクチャ上の判断です。しかし、それはコラボレーションスタックがピアの対称性(peer symmetry)に対して抱いている、暗黙の前提を崩してしまいます。
ほとんどのシステムは、すべてのピアが人間と同じ速度で動作することを前提としています。AIエージェントが1分間に3,000単語を生成する場合、「スループット」「Undoの所有権」「プレゼンスのケイデンス(周期)」という3つの核心的な領域が崩壊します。
以下にその解決策を示します。
- 書き込みのスターベーション(飢餓状態)を防ぐ
CRDTモデルには、クライアントを制限(スロットリング)する中央サーバーが存在しません。エージェントが絶え間ない書き込みを行うと、同期サイクルが溢れかえってしまいます。これにより、人間のユーザーが収束ウィンドウ(convergence window)を確保できなくなり、カーソルの遅延や更新の消失を招きます。
解決策はトランスポート層ではなく、アプリケーション層にあります。LLMのストリームとYjsの書き込みの間にトークンバケット(token bucket)を導入し、エージェントの速度を制限してください。
• キューに格納する操作の容量を設定する。 • エージェントが人間の動作を妨げない(スターベーションの閾値を下回る)ように、補充レートを設定する。
- Undo履歴を分離する
エージェントがユーザーと同じorigin(起点)を共有していると、Ctrl+Zが混乱を招きます。人間のミスとAIの提案を区別できなくなるからです。
エージェントに独自のoriginを与えてください。エージェントには個別のUndoManagerを使用します。
• ユーザーのUndoManagerは人間の操作のみを追跡する。 • エージェントのUndoManagerはAI固有の操作を処理する。 • デフォルトのCtrl+Zに紐付けるのではなく、「AIの提案を拒否」という独立したUIボタンを用意する。
- プレゼンス更新を統合(Coalesce)する
AIエージェントは、人間が視認できるよりも速いスピードで位置情報の変更を生成します。すべての変更をブロードキャストすると、レンダリングサイクルにノイズが発生します。
エージェントのプレゼンスは、以下のように異なる方法で管理する必要があります。
• 操作ごとではなく、一定の間隔でawareness(認識)の更新を統合する。
• awarenessの状態にtypeフィールドを追加する(例: type: 'agent')。
• このtypeを使用して、レンダリング層に対してカーソルの扱いを変えるよう指示する。
「ピアとしてのエージェント」というパターンは、正しい構築手法です。課題は、前提条件を明示的にすることにあります。レート制限、Undoの分離、プレゼンスの統合をエッジケース(例外的なケース)として扱わないでください。これらをコア要件として扱うべきです。
Source: https://dev.to/norfolkd/when-an-ai-agent-joins-your-yjs-room-three-assumptions-break-50h8