LangChain Blog更新日

Deep Agents におけるスキルの刷新

主なポイント スキルにツールをバインドできるようになりました。 ツールのスキーマは、エージェントがそのバインド先のスキルを読み込むまでコンテキストから除外され、会話の途中で新しいツールを受け入れられるモデルでは、追加してもプロンプトキャッシュが維持されます。 アプリは実行時にスキルをピン留めできます。これにより、最初のモデル呼び出しの前に指示がコンテキストに入り、 read_file ラウンドトリ

Only a skill's name and description are always in context. The agent reads the instructions on demand, and loads scripts, references, and assets only when needed.
画像の出典 · LangChain Blog

主なポイント

  • スキルにツールをバインドできるようになりました。 ツールのスキーマは、エージェントがそのバインド先のスキルを読み込むまでコンテキストから除外され、会話の途中で新しいツールを受け入れられるモデルでは、追加してもプロンプトキャッシュが維持されます。
  • アプリは実行時にスキルをピン留めできます。これにより、最初のモデル呼び出しの前に指示がコンテキストに入り、 read_file ラウンドトリップが不要になります。
  • スレッドの途中でスキルを再読み込みできます。これにより、長時間実行されるエージェントが、新しいスレッドを開始することなく、追加・編集・削除されたスキルを取り込めます。

スキルは、エージェントにドメイン知識を与える最良の方法のひとつです。 スキル とは、指示、スクリプト、参照ファイルをまとめたフォルダーで、顧客との打ち合わせの準備や、営業チームと同じ方法での通話トランスクリプトのレビューなど、エージェントにタスクのやり方を教えます。Agent Skills は任意のモデルで動作する オープンスタンダード で、 数十のエージェント製品でサポートされています。また、スキルの作成に技術力は必要ありません。その核心はマークダウンファイルだからです。

スキルが機能するのは、 プログレッシブディスクロージャー(段階的開示)のおかげです。エージェントは最初は各スキルの名前と説明だけを見て、タスクで必要になったときにのみ完全な指示を読み込みます。これによりコンテキストが小さく保たれ、 コンテキストエンジニアリング は効果的なエージェントを構築する鍵となります。

利用が拡大するにつれ、チームがスキルに求めるものは変化しています。企業のスキルレジストリは数千のスキルに成長し、チームやエージェント間で共有されるようになっています。私たちは、よくある要望に応えるために、 Deep Agents のスキルサポート を刷新しました:

  • スキルへのツールのバインド: スキルにバインドされたツールは、エージェントがそのスキルを読み込んだときにのみロードされます。
  • ピン留めされたスキル: ユーザーがスキルを明示的に要求した場合、たとえば /meeting-prepの場合、アプリは次のモデル呼び出しの前にそのスキルをロードできます。
  • スキルの再読み込み: 長時間実行されるスレッドでも、最初からやり直すことなく、新規または変更されたスキルを取り込めます。

スキルの仕組み

スキルは、次の内容を含むディレクトリです: SKILL.md file: YAMLフロントマター with a name および descriptionに続いて、エージェントが従う指示が記述されます。スキルはまた、補助ファイルを以下のパスにまとめてバンドルすることもできます scripts/, references/、また assets/ (仕様).

Only a skill's name and description are always in context. The agent reads the instructions on demand, and loads scripts, references, and assets only when needed.
常にコンテキストに含まれているのはスキルの名前と説明だけです。エージェントは必要に応じて指示を読み込み、スクリプト、参照資料、アセットは必要なときにのみロードします。

この記事全体を通して、次のものを使用します 当社のGTMエージェント 実行例として使用します。これは〜の上に構築されています Deep Agents, さらに50以上のスキルを備えたライブラリは、営業担当者の繰り返し行う業務をカバーしています。例えば meeting-prep, call-transcripts、また competitive-intel-card.

スキルは3つのレベルで読み込まれます:

  1. ディスカバリー。 起動時に、エージェントは各スキルの以下を確認します。 name および description 「システムプロンプト内に。」
  2. アクティベーション。 タスクがスキルに一致すると、エージェントは完全な SKILL.md とともに read_file.
  3. 実行。 エージェントは指示に従い、スクリプトや参照ファイルを必要とされる場合にのみ読み込みます。
The agent's context grows only by what the task needs: every skill's name and description at startup, then one skill's instructions, then one reference file.
エージェントのコンテキストは、タスクに必要な分だけ増加します。起動時には全スキルの名前と説明、次に1つのスキルの指示、そして1つの参照ファイルのみが読み込まれます。

スキルは使用されるまでシステムプロンプト内で1行しか占めないため、ライブラリはコンテキストを圧迫することなく、膨大な数のスキルへの参照を保持できます。それでは、Deep Agents で行った拡張機能を見ていきましょう。

スキルへのツールのバインド

スキルはエージェントに特定のツールの使い方を指示することが多く、一部のツールはエージェントがその説明を読んで初めて正しく機能します。これまで、スキルとツールは別々に開示されていました。ツールのスキーマをコンテキストから外しておくには ツール検索しかし、ツールと、そのツールを説明するスキルを結び付ける仕組みは何もありませんでした。エージェントはスキルを読まずにツールを見つけて呼び出すことができ、逆にスキルを読んでも、対応するツールを探さなければならないという状態でした。

今すぐできるようになりました スキルにツールをバインドするそのため、スキルとそのツールは一緒に公開されます。バインドされたツールは、エージェントがそのスキルを読むまでコンテキストに追加されず、それより前に呼び出そうとすると不明なツールとして失敗します。これによりコンテキストが薄く保たれ、エージェントはツールを呼び出せるようになる前にその使い方を読んでいることになります。弊社の GTMエージェント, call-transcripts 通話の検索方法と文字起こしの読み方を説明しているので、それらのツールをバインドするには自然な場所です。

スキルのfrontmatter内のツールを次の下に列挙してください metadata.include_tools:

call-transcripts SKILL.md frontmatter listing include_tools: search_calls get_transcript

それらのツールを SkillsMiddleware の代わりにエージェントへ渡します:

Python: create_deep_agent with SkillsMiddleware(tools=[search_calls, get_transcript])
Reading call-transcripts unlocks search_calls and get_transcript. They arrive in a new system message, so the cached prefix above it stays unchanged.
call-transcripts を読み込むと、search_calls と get_transcript がアンロックされます。これらは新しい system メッセージとして届くため、その上のキャッシュ済みプレフィックスは変更されません。

会話の途中でツールを追加するということは、従来はリクエストのツールリストを編集することを意味し、これはプロンプトキャッシュを無効化していました。 Anthropic と OpenAI は現在、新しいモデルで会話の途中のツール受け入れを可能にしているため、これらのモデルでは、Deep Agents はスキルが読み込まれた直後にそのスキルにバインドされたツールを追加し、キャッシュ済みプレフィックスはそのまま維持されます(Anthropic および OpenAI の統合ドキュメント参照)。他のモデルでは、ツールは従来どおりリクエストに追加されます。

リストでほとんどのスキルをカバーできます。より細かい制御のために、スキルはツール名の代わりにラベルを列挙でき、 SkillsMiddleware に渡す関数が各ラベルをツールに変換します。これにより次のことが可能になります:

  • ツールグループ全体を、MCP サーバー上のすべてのツールのように、1 つの名前で開示でき、スキルに各ツールを列挙する必要がありませんMCPサーバー上の他のツールと同様に、スキル内で各ツールを列挙することなく、1つの名前の下で。
  • 実行時の権限に基づいてツールをゲートする。 この関数はグラフの runtime を受け取るため、ユーザーが誰であるかを確認し、そのユーザーが使用を許可されているツールのみを返すことができます。

ここでは、 call-transcripts は calls MCP サーバー上のすべてのツールを取得し、 pipeline-forecast は CRM ツールを取得しますが、マネージャーのみが forecast を更新できます:

SKILL.md frontmatter for call-transcripts (include_tools: call_tools) and pipeline-forecast (include_tools: crm_tools)
Python: resolve_skill_tools returns every calls MCP tool for call_tools, and update_forecast only for managers

詳細については、 スキルへのツール追加 を参照してください。

ピン留めされたスキル

ユーザーがどのスキルを望んでいるかを既に知っている場合があります。当社の GTM エージェントでは、担当者は /meeting-prep for my Acme call tomorrowと入力できます。ピン留めがない場合、モデルにはスキルの説明しか見えず、スキルを読み込む必要があります。これにより作業開始前に往復が 1 回追加され、しかもモデルが正しいスキルを読み込む保証はありません。 ピン留めされたスキルでは、アプリがメッセージ内のスキル名を見つけ(または UI から解析し)、それを pinned_skillsに渡すと、ミドルウェアが次のモデル呼び出しの前に各スキルの指示を会話に追加します。Deep Agents 自身はメッセージを解析しないため、構文はあなたが選択します:

Typing /meeting-prep names the skill, so the app can pin it for the agent's next model call.
/meeting-prep と入力するとスキルが指定されるため、アプリはエージェントの次のモデル呼び出しのためにそれをピン留めできます。
Python: parse /meeting-prep from the message and pass it as pinned_skills to agent.invoke
A pinned skill's instructions are already in the conversation, so the agent starts the work on model call 1 instead of model call 2.
ピン留めされたスキルの指示は既に会話に含まれているため、エージェントはモデル呼び出し 2 ではなくモデル呼び出し 1 で作業を開始します。

これによりレイテンシが削減され、動作がより予測しやすくなります。命令は確実にコンテキスト内に存在することが保証され、ピン留めされたスキルに紐付いたツールも一緒に提供されます。ピン留めされた各スキルはタグ付きメッセージとして1回だけ追加されるため、以前のメッセージが変更されることはなく、プロンプトキャッシュが有効なまま維持され、チャットUIではスキルの全文の代わりにラベルとして表示できます。

スレッド途中でのスキルの再読み込み

スキルはすべてのスレッドの開始時に読み込まれ、エージェントの状態に保持されるため、それ以降の毎回のターンで同じスキルセットが再利用されます。これにより、次のことが可能になりました。 このリストを無効にする 設定することにより skills_metadata に None エージェントを呼び出す際に。チームメイトが competitive-intel-card スキルをライブラリに追加すると、アプリケーションはスキルのリストを無効化でき、次回の実行ですべてのソースを再スキャンします:

Python: agent.invoke with skills_metadata set to None
Setting skills_metadata to None makes the next run rescan the skill library and pick up a skill added since the last run.
skills_metadata を None に設定すると、次回の実行時にスキルライブラリが再スキャンされ、前回の実行以降に追加されたスキルが取り込まれます。

新しいスキルを見つけてリロードするとシステムプロンプトが変更され、プロンプトキャッシュが無効化されます。アイドル状態で放置されていたスレッドであれば、そのコストは通常すでに支払い済みです。プロバイダーのキャッシュは、通常、数分から1時間の非アクティブ状態で失効するからです(Anthropic, OpenAI)、そのため担当者が戻ってくる頃にはキャッシュはコールドになっています。

リセットは単なる実行入力にすぎないため、制御をユーザーに委ねることもできます。たとえば、 /reload クライアント側で次のコマンドを実行します:

ここからもリセットできます: update_state またはミドルウェアからの呼び出しも可能で、スキルの再読み込みがいつ発生するかをアプリ側で制御できます。詳しくは スキルの再読み込み.

開始する

スキルは、エージェントに体系的なドメイン知識を与えるための業界標準のメカニズムです。今回のアップデートにより、大規模な運用がさらに容易になります。ツールはスキルが必要とするときにのみロードされ、ワークフローに必要なスキルは事前にロードされ、長時間実行されるスレッドはライブラリが変わっても最新の状態を保ちます。さらに、スキルはオープン標準であるため、チームが作成したスキルはモデルやエージェントを越えて機能します。

これらはすべて最新版で利用可能です。 deepagents. 以下をお読みください スキルドキュメント 始めるには、またご感想はこちらからお聞かせください: GitHub issues、その フォーラム、または X.

謝辞

〜のおかげで リッチ・スカロット これらの新機能の開発を主導したことを称え、 ハンター・ラヴェル 機能やブログのレビューに!

原文の出典

LangChain Blog

内容について

原文の公開と権利は出典元に帰属します。

機械翻訳 · 原文をご参照ください