[開発者向け]LangChain Deep AgentsでNVIDIA Nemotron 3 Ultraの性能を引き出す「ハーネスプロファイル」実装ガイド

目次

はじめに

 NVIDIAは2026年7月8日、公式Developer Blogで、LangChain Deep AgentsとNVIDIA Nemotron 3 Ultraを組み合わせ、ファインチューニングを行わずにエージェントの精度を高める「ハーネスプロファイル」の作り方を解説する記事を公開しました。本稿では、失敗の特定から修正、検証、そして改善ループの自動化までの具体的な手順を紹介します。

参考記事

関連記事

あわせて読みたい
[開発者向け]Cursorが語るエージェントハーネスの進化——コンテキスト設計・評価・劣化対策の全貌 はじめに  Cursorが2026年4月30日に公開したブログ記事で、AIコーディングエージェントの品質を左右する「エージェントハーネス」の継続的改善プロセスを詳しく解説し...
あわせて読みたい
[ビジネスマン向け]NVIDIAが「Nemotron 3 Nano Omni」を発表——視覚・音声・言語を統合しAIエージェン... はじめに  NVIDIAは2026年5月12日、視覚・音声・言語の処理を1つのモデルに統合したオープンなマルチモーダルAI「Nemotron 3 Nano Omni」を発表しました。本稿では、こ...

要点

  • ハーネスプロファイルは、LangChain Deep Agentsがモデルごとにプロンプトやツール構成を調整できる拡張ポイントであり、ファインチューニングをせずにエージェントの精度を改善できる仕組みである
  • NVIDIA Nemotron 3 Ultraはread_file(ファイルを読み込むツール)のページネーション処理で失敗が確認されたが、専用ミドルウェアを追加したことで評価ベンチマークのスコアが127点中94点から96点に向上した
  • ハーネス改善は、ベンチマーク実行、失敗分析、修正提案、再検証というループとして自動化でき、LangChainはこの仕組みを「LangSmith Engine」として提供している
  • 改善ループでは、変更を複数回連続で検証すること、失敗時にプロファイルを元の状態へ戻すこと、全体のベンチマークを再実行して副作用を確認することが重要とされている
  • 同様の自動化ループはLangChain Deep Agents以外のエージェントフレームワークにも応用できる

詳細解説

ハーネスプロファイルとは何か

 エージェントの性能は、モデル単体の能力だけでなく、プロンプトやツール構成、ミドルウェアといった「ハーネス(エージェントを動かす土台となる仕組み)」との組み合わせで決まります。LangChain Deep Agentsは、モデルごとにハーネスの挙動を調整できる「Agent Harness Profile」という拡張ポイントを提供しており、プロンプトの変更、不要なツールの除外、追加のミドルウェアやサブエージェントの導入といった調整が可能です。

 従来、モデル固有の弱点を補うにはファインチューニング(追加データでモデル自体を再学習させる手法)が使われてきましたが、専門知識や学習・ホスティング用のハードウェアが必要でした。ハーネスプロファイルによる調整は、モデル自体を変更せずに済むため、より手軽に精度改善へ取り組める点が特徴だと考えられます。

前提条件・環境構成

 本チュートリアルを進めるには、以下の環境が必要です。

  1. Python環境にLangChain Deep Agentsをインストール済みであること
  2. NVIDIA Nemotron 3 Ultraを利用するためのAPIキー(検証用にはbuild.nvidia.comの無料アクセスを利用可能。本番運用ではBaseten、Crusoe、Fireworks、Nebius、Together AIなどNVIDIA Cloud Providersのエンドポイントを推奨)
  3. (推奨)エージェントの実行履歴を収集するLangSmithアカウント

評価ループの実行と失敗の特定

 まず、ハーネスプロファイルを適用しない状態でNVIDIA Nemotron 3 Ultraの評価ベンチマークを実行し、ベースラインを確立します。LangChainは、Deep Agents向けのオープンソース評価ベンチマークを公開しており、これを使って失敗を洗い出します。

 この記事では、ファイルを読み込むread_fileツールに関するテストで失敗が確認されました。

Failing test: tests/evals/test_file_operations.py::test_read_file_truncation_recovery_with_pagination[nvidiahub:ultra-tme]

Failure:
success check failed: Expected final text to contain 'opal-fox-91', got: 'x'

Trajectory:
  step 1:
    - read_file {'file_path': '/big.txt'}
  step 2:
    text: x

 このテストは、ファイル内の最後の空でない行を答える課題です。read_fileツールは1回の呼び出しでファイルの一部(1ページ分)しか返さない仕様になっており、Nemotron 3 Ultraは最初のページに含まれるxという値だけを見て、続きを読まずに回答してしまったことが失敗の原因でした。

ミドルウェアによる修正実装

 この失敗に対して、read_fileの結果がページの上限(limit)まで達している場合、続きがある可能性をモデルに伝えるミドルウェアを追加します。

class ReadFileContinuationNoticeMiddleware(AgentMiddleware):
    """Tell the model when a read_file result probably continues."""
    name = "ReadFileContinuationNoticeMiddleware"
    def wrap_tool_call(self, request, handler):
        return self._annotate(request, handler(request))

    @staticmethod
    def _annotate(request, result):
        if not isinstance(result, ToolMessage):
            return result

        if request.tool_call.get("name") != "read_file":
            return result

        content = str(result.text)

        args = request.tool_call.get("args", {}) or {}
        offset = int(args.get("offset", 0))
        limit = int(args.get("limit", 100))

        n_lines = sum(
            1
            for row in content.split("\n")
            if "\t" in row and row.split("\t", 1)[0].strip().isdigit()
        )

        if n_lines < limit:
            return result

        notice = (
            f"\n\n[read_file returned {limit} lines starting at offset {offset}, "
            f"the per-read limit. The file likely continues past this window. "
            f"To read further, call read_file again with offset={offset + limit}. "
            f"Do not assume you have seen the end of the file.]"
        )

        return result.model_copy(update={"content": content + notice})

 n_lines(返却された行数)が上限のlimitに達している場合にのみ、続きがあることを示す注意書き(notice)を結果に追加している点がポイントです。作成したミドルウェアは、以下のようにハーネスプロファイルへ登録します。

profile = HarnessProfile(
    extra_middleware=[
        ReadFileContinuationNoticeMiddleware(),
    ]
)

register_harness_profile("nvidia:nemotron-ultra", profile)

実行・動作確認

 修正後のプロファイルを使って、失敗していたテストを再実行します。

uv run pytest \

  tests/evals/test_file_operations.py \

  --model nvidia:nemotron-utlra \

  --harness-profile nemotron-ultra

 注意: ベンチマークやテストの実行結果は確率的(同じ入力でも毎回同じ結果になるとは限らない)であるため、ベースラインと修正後の両方を複数回実行して比較することが推奨されています。

 個別のテストが通ったあとは、他のテストへの悪影響(リグレッション)がないかを確認するため、ベンチマーク全体を再実行します。

プロファイルread_fileテスト評価ベンチマーク
ベースライン0 / 3平均94 / 127
read_fileミドルウェア適用後3 / 3平均96 / 127

 この結果から、read_fileのページネーションに関する3件のテストがすべて通過し、評価ベンチマーク全体のスコアも94点から96点(127点満点)に向上したと報告されています。

 なお、記事では過剰適合(オーバーフィッティング)への注意も示されています。今回のようにツールの呼び出し方を教える機械的な修正は問題になりにくい一方、たとえば「インシデントアラート」と「インシデントトリアージ」という用語の違いをハーネスに直接教え込むような修正は、特定のテストにしか通用しない可能性が高く、避けるべきだと考えられます。

自動化ループとその仕組み

 ベンチマーク実行、失敗分析、修正、再検証という一連の流れは、繰り返し作業であるためエージェントによる自動化に向いています。この手法は、開発者のGeoffrey Huntley氏が提唱する「ralphループ」(モデルが現在の状態を読み込み、1つの変更を加え、会話ではなくファイルシステムを記憶として使う手法)と同じ構造だと紹介されています。

 自動化ループを安全に運用するうえで、記事は以下の4点を重視しています。

  • 検証してから信じる: 修正が複数回連続でテストに通過した場合のみ、その修正を採用する
  • 状態を保存し、必要ならロールバックする: 各試行の前にプロファイルを保存しておき、改善につながらなかった場合は元に戻す
  • 前回の試行から学ぶ: 失敗した場合、次の試行には前回の内容と失敗理由をそのまま引き継ぐ
  • 全体を再チェックする: 修正が入るたびに、直したテストだけでなくベンチマーク全体を再実行し、リグレッションを確認する

 NVIDIAとLangChainは、この改善ループを実際に動かすリファレンス実装をNemoClaw communityリポジトリで公開しています。記事内では、このループを使ってread_fileの失敗を1回目の試行で修正し、ベンチマーク結果が「20件通過・1件失敗」から「21件通過・0件失敗」に改善した実行例も紹介されています。

他のフレームワークへの応用

 この自動化ループの仕組みは、LangChain Deep Agentsに限定されたものではないと説明されています。テスト結果と実行履歴を出力できる評価の仕組み、プログラムから編集・検証できるプロファイルやコンフィグファイル、そして修正案を提示できる高性能なモデルの3つがあれば、同じループを他のエージェントフレームワークにも適用できると考えられます。

 この点は、Cursorが公開したエージェントハーネス改善の知見とも通じるところがあり、モデルの性能を引き出すうえで評価とハーネス調整を組み合わせる考え方は、業界全体で広がりつつあるのではないでしょうか。

まとめ

 本稿では、ファインチューニングをせずにハーネスプロファイルを調整することで、NVIDIA Nemotron 3 Ultraの精度を高める手法と、その改善ループを自動化する仕組みを紹介しました。エージェント開発におけるCursorのハーネス改善の知見もあわせてご覧いただければと思います。

この記事が気に入ったら
フォローしてね!

  • URLをコピーしました!
  • URLをコピーしました!
目次