AI・機械学習
Prime Agent: 自己改善型のRLMエージェント
Prime Agent: A self-improving RLM agent (primeintellect.ai)
要約
Prime Agentは、再帰的言語モデル(RLM)と継続的ハーネスという2つの抽象化を中心に設計された、自己改善型のコーディングハーネスです。これにより、エージェントは自身のコンテキスト上で言語モデルプログラムを記述し、任意に長いセッションを過去の情報へのアクセスを失うことなく処理できます。また、エージェント間の通信を可能にし、サブエージェントやセッションを横断したオーケストレーションを実現します。
全文翻訳
Prime Agent: 自己改善型のRLMエージェント
本日、再帰的言語モデル(RLM)[引用]と継続的ハーネス[引用]という2つの抽象化を中心に設計された、自己改善型のコーディングハーネスであるPrime Agentをローンチします。現代のハーネス設計は、古い世代のモデルの能力に基づいて構築されており、現在の最先端モデルが可能なことを反映していません。固定されたツール呼び出しスキーマやコンテキスト圧縮は、モデルが足場を活かすのではなく、その足場の周りで作業することを強制します。静的で手作業で設計されたサブエージェント、プロンプト、スキル、メモリは、設計時に一度設定され、エージェントが実行中に学習したことに適応することはありません。私たちは、ハーネスは代わりに、現在のモデルの能力を、次の最先端の推論パターンのために外挿すべきだと考えています。
Prime Agentは、この原則に基づいて、2つの主要な抽象化を中心に構築されています。
再帰的言語モデル(RLM)は、コンテキストを変数として扱い、サブエージェントの委任をREPL内の関数呼び出しとして扱います。永続的なREPLは、モデルに履歴、サブエージェント、ツールへのプログラム的なアクセスを提供し、自身のコンテキストに対するアクションとして言語モデルプログラムを記述することを可能にします。この設計により、エージェントは自身の過去の情報にアクセスすることなく、任意に長いセッションを処理できます。
継続的ハーネスは、ハーネス自身の状態(プロンプト、スキル、メモリ、サブエージェントとして抽象化される)を、エージェントが自身の軌跡から作成、読み取り、更新、削除(CRUD)できるものとして扱います。エージェント間通信と組み合わせることで、このメカニズムは、サブエージェント間、さらにはPrime Agentセッション間でのオーケストレーションを可能にします。例えば、Prime Agentは永続的なサブエージェントを起動し、軌跡の後半でそれらにメッセージを送り、別のPrime Agentセッションと直接通信することができます。
これらの抽象化は、モデルの能力をブートストラップする上で強力です。Prime Agentは、汎用コーディングアシスタントとして、長期間の自律評価のデフォルトランタイムとして、そして研究および自己研究の協力者として効果的であるように構築されています。
Prime Agentは完全にオープンソースであり、以下からインストールできます。
curl -fsSL https://app.primeintellect.ai/prime-agent/install.sh | sh
Prime Agent
エージェントハーネスのパフォーマンスは、ハーネスの設計と、ハーネスを中心にトレーニングされたモデルの能力の両方に依存します。私たちは、Prime Agentを最新のオープンおよびクローズドな最先端モデルですぐに使用できるように設計すると同時に、新しい世代のモデルがその周りでトレーニングされるにつれて、さらなるパフォーマンス向上が期待できる機能セットを提供します。
その核となる部分で、Prime Agentはプログラム的なツールおよびサブエージェント呼び出しを中心に設計されています。Prime Agentのモデルは、唯一のツールとして永続的なIPythonカーネルを使用します。他の標準的なハーネス機能は、カーネル内で関数として呼び出されます。これにはサブエージェントも含まれ、それぞれが別のprime-agentインスタンスとして実装されています。
Prime Agentのアーキテクチャ
RLMと継続的ハーネスが2つのコア抽象化です。サブエージェントのCRUDとAgent2Agentメッセージングが、それらをオーケストレーションに構成します。
バックグラウンドデーモンとエージェントビュー。
デフォルトビューは、他のコーディングエージェントハーネスに似たテキストユーザーインターフェース(TUI)です。デフォルトでは、エージェントによって行われたIPythonアクションは簡潔にするために圧縮されますが、ハーネスによって行われたアクションを表示するために展開できます。REPLで起動されたサブエージェントは、ユーザーチャットボックスの下からもアクセスできます。
Prime Agentは、ローカルソケット経由ですべてのライブエージェントセッションを所有するバックグラウンドデーモンを実行します。基盤となるエージェントループに影響を与えることなく、セッションにアタッチおよびデタッチできます。各ルートセッションツリーは、リカバリ可能なワーカープロセスで実行されます。ワーカーがクラッシュした場合、デーモンはセッションJSONLとカーネル状態のスナップショットからそれをリカバリします。
エージェントビューを使用すると、デーモンから他のライブセッションを表示および選択できます。これは、空のプロンプトで左矢印キー(←)を押すことで開くことができ、現在実行中のセッション、デーモンがまだアクティブなアイドルセッション、および現在メモリにロードされていない非アクティブなセッションのリストが表示されます。これらのチャットのいずれかにすぐにアクセスして対話でき、スペースキーを押すと、ユーザーは任意の状態のセッションとチャットでき、/compactのようなプロンプトやコマンドのステアリングやキューイングも含まれます。
エージェントビューは、エージェントとサブエージェント間の中心的な接続ポイントとして、再帰的に構築されます。あらゆるエージェントは、エージェントビューで検出可能です。ユーザーは、エージェントビューからエージェントのチャットに入り、次にそのサブエージェントのエージェントビューに入り、サブエージェントのチャットに入り、というようにナビゲートします。サブエージェントはルートエージェントと同じ実行中-アイドル-非アクティブ状態マシンを共有するため、30分間非アクティブな後にメモリから削除される可能性があり、ユーザーまたはエージェントがそれらのいずれかにアクセスした瞬間にディスクからリロードされます。深くネストされたチャットでは、これにより多くのメモリを節約できます。
セッションとコンテキスト管理。
エージェントのセッション履歴全体は、ディスク上の追記専用JSONLファイルとして保存されます。各行はJSONエントリであり、メッセージ、モデル切り替え、圧縮サマリー、または拡張エントリを含めることができます。ブランチング、フォーク、クローニングはすべて、リーフポインタを移動することで同じファイル内で行われます。完全な履歴は、/treeを介して常にリカバリ可能です。
コンテキストがしきい値に達したとき、またはエージェントがREPLでcompact.run()を直接呼び出したときに、コンパクションが発生します。コンパクションは主にエージェントのメインコンテキストをクリーンアップするために使用されますが、過去のコンパクションを含む完全な履歴は、必要に応じてIPythonカーネルでプログラム的にアクセスできます。
REPLの導入には、IPython状態を管理するための追加作業が必要です。IPythonカーネルを同時に非同期にコンパクションおよびクリーンアップし、ガベージコレクタとして機能するスポーンされたエージェントを使用します。これは、各エージェントのためにREPLメモリが蓄積されるのを避けるために必要です。
RLMとプログラム的ツール呼び出し(PTC)
Prime Agentは、セッション全体で永続するREPLとしてIPythonカーネルに依存しており、それを各ターンで呼び出すことができます。初期化時に、カーネルは、再帰的なプログラム的サブエージェント呼び出しのためのrlmを含む、各スキル/ツールをモジュールとしてプリインポートします。
rlmは非同期関数であり、モデルがコード内でサブエージェント呼び出しを自由に呼び出し、並列化できることを意味します。サブエージェントを起動する(例: await rlm("sub-task"))と、独自のモデル、IPythonカーネル、セッションツリー、および会話履歴を持つ完全なセッションが起動します。後続のすべてのエージェント間通信は、agent_message.send(...)ツールを介して行われるため、すぐに返されます。
Prime Agentがこのように起動できる便利なプリミティブがいくつかあります。例えば、サブエージェントを並列にファンアウトしたり、バックグラウンド作業を起動したりすることです。
# 並列ファンアウト — rlm()はタスクアドミッション時に子ハンドルを返しますが、
# 子の回答は返しません。結果はagent_messageの返信として到着します。
auth = await rlm("Summarize the authentication flow in auth/. Reply to me when done.", name="auth-expert")
api = await rlm("Summarize the updated HTTP API layer in src/. Reply to me when done.", name="http-expert")
# ...独立した作業を続行します。各子は完了時に
# agent_message.send(..., receiver_role="parent")を介して返信します...
# 子を飛行中にステアリングまたは拡張する(ロール+名前による)
await agent_message.send( "Also cover middleware error handling.", receiver_role="child", receiver_name=api.name, )
モデルが改善を続けるにつれて、ツール呼び出しやサブエージェントに対する新しい呼び出しパターンが出現するでしょう。私たちは、将来の世代のモデルは、手作業で指示されたプロンプトに依存するよりも、この種の直接的でプログラム的な制御に依存するようになると予想しています。
オーケストレーションとマルチエージェント通信
バックグラウンドデーモンは、すべてのライブPrime Agentセッションを管理します。Prime Agentは、デーモンを介したエージェント間(A2A)メッセージングも可能にし、サブエージェントに永続的なメッセージを送信するのと同じメカニズムを使用して、任意のPrime Agentセッションが他のPrime Agentセッションにメッセージを送信できるようにします。これにより、サブエージェントのスワームの進行状況や、影響を受けるエージェント間で直接共有リソースに関する通信を管理するための簡単なオーケストレーションが可能になります。独立したセッション間での望ましくない通信を防ぐために、マルチa