本記事は以下の内容をLLMで翻訳したものです。
https://www.langchain.com/blog/introducing-rubrics-for-deepagents
ルブリックの紹介:自らの作業を評価・修正するエージェントを構築
主なポイント
- エージェントは、しばしば正しい方向に向かって出力を生成するが、最初の試行では手応えが十分でないことがよくある。
-
RubricMiddlewareとは、エージェントに「完了」とは何かを教える方法であり、目標に達するまで継続して反復させる仕組みである。 - テストの合格、禁止されたパターンの回避、必要なセクションのカバーなど、明確で検証可能な成功基準があるタスクに最も効果的。
エージェントはこれまで以上に複雑なタスクを担っています。もっとも頻繁に、エージェントはゴールに到達できずに終わってしまいます。そこで、我々はこの問題を解決するために、Deep Agents に RubricMiddleware を追加しました:あなたはルブリックを定義し、エージェントは自らを評価し、すべての基準を満たすまで繰り返し修正します。または、設定された上限に達するまで繰り返します。
あなたが Claude Code や Codex の /goal に精通しているなら、これは同様のパターンです。この実装は、評価を専用の採点サブエージェントが処理することで、ツールを呼び出し、議論全体を考慮して、基準ごとのフィードバックを返却するといった柔軟性を高めています。
問題点
一部のエージェントタスクには、「完了」の明確な定義があります。コードのリファクタリングは、テストスイートが成功したら完了です。レポートは、すべての必須セクションがカバーされれば完成です。
しかし、エージェントは常に最初の試行でその目標に到達できるとは限りません。コンテキストが大きくなるにつれて、曖昧な指示、ツールの誤用、非決定論的なエラーが累積し、出力品質は低下し、開発者は手動でタスクを診断し再実行する必要があります。
動作方法
エージェントの実行が終了する前に、別個の採点サブエージェントがルブリックに基づいてレビューを行います。すべての基準が満たされていれば、実行は終了します。何らかの基準が満たされていない場合は、採点者の基準ごとのフィードバックが会話に注入され、エージェントが再実行されます。このループは、ルブリックが満たされた場合、または設定された反復回数の上限に達した場合に終了します。
このループは、satisfied(満たされた)、max_iterations_reached(最大反復回数に達した)、failed(失敗した)、または grader_error(採点エラー)のいずれかで終了します。
準備
以下に最小構成の手順を示します。重要なアイデアは、RubricMiddleware を一度だけ定義し、ディープエージェントにアタッチした上で、呼び出し時に rubric 文字列を渡すことです。(rubric が指定されていない場合、ミドルウェアは何も行いません。)
1) RubricMiddleware を定義する
このミドルウェアは、基本エージェントの上に採点ループ を追加します。採点者は以下のように設定されます:
-
model:採点に使用されるLLM(通常はメインエージェントモデルよりも小さな、安価なモデル) -
system_prompt:採点者の役割と「良い」とは何かを定義する指示 -
tools:採点者が証拠を収集するためのオプションのツール(例:テスト実行、lintチェック、出力検証) -
max_iterations:実行が停止するまでの最大の修正 → 再採点ループ数
from deepagents import RubricMiddleware
rubric_middleware = RubricMiddleware(
model="anthropic:claude-haiku-4-5",
system_prompt="あなたは、ルブリックに基づいて生成されたコードを評価するコードレビュアーです。",
tools=[run_test_suite],
max_iterations=5,
)
2) ディープエージェントに渡す
あなたのディープエージェント自身も「操作指示」を持つべきです。エージェントの system_prompt は、作業を「どのように行うか」を指示し、ルブリックは採点者が「作業をどのように評価するか」を定義します。
以下のスニペットでは:
-
model:ソリューションを生成するために使用されるLLM -
system_prompt:エージェントのコーディング規約と制約条件 -
middleware:エージェントが反復的に修正可能になるようにrubric_middlewareをアタッチ
from deepagents import create_deep_agent
agent = create_deep_agent(
model="anthropic:claude-sonnet-4-6",
system_prompt=(
"あなたは丁寧なPythonエンジニアです。正確で読みやすく、明確なコードを書いてください。"
"ユーザーの指示を正確に従ってください。"
),
middleware=[rubric_middleware],
)
3) 人間のメッセージとルブリックを指定して呼び出す
呼び出し時に、以下を提供します:
-
messages:人間のリクエスト(および必要に応じて以前のやり取り) -
rubric:採点者が満たさなければならない、改行区切りのチェックリスト
from langchain.messages import HumanMessage
result = agent.invoke(
{
"messages": [
HumanMessage(
content=(
"Pythonの関数 `find_duplicates(lst)` を記述してください。これは入力リスト内で2回以上登場するすべての要素を、"
"初めて登場した順にリストとして返すものです。"
)
)
],
"rubric": (
"- run_test_suite ですべてのテストが合格する\n"
"- 関数名は `find_duplicates` で、単一のリスト引数を受け入れる\n"
),
},
config={"configurable": {"thread_id": "code-generation-session"}}
)
print(result["messages"][-1].text)
採点者が正確性について抽象的に推論する代わりに、run_test_suite ツールを提供して、行動を直接検証させます。採点者は、判断を下す前にツールを呼び出して硬的な証拠を収集でき、ツールが提供されていない場合は、トレースから推論します。
実際の使用例
上のコード生成例では、エージェントの最初の試行は正しく見えるものの、1つのテストに失敗しました。採点者は次のように返しました:
"1つのテストに失敗しています:test_unhashable。入力リストにリストなどのハッシュ不能な型が含まれた場合、関数はTypeErrorでクラッシュします。"
エージェントは実装を修正し、2番目の反復ですべてのテストに合格しました。フィードバックは「もう一度やってみて」のような一般的なものではなく、各基準ごとに独自の判定が与えられるため、エージェントは正確に何を修正すべきかを把握できます。
完全な例は このトレース でご確認ください。
なぜ重要か
エージェントの出力は確率的です:同じプロンプトであっても、1回の実行では成功し、別の実行では失敗することがあります。RubricMiddleware はそのような変動を検出する負担を、開発者からシステムへと移行します。
出力を手動で検査して失敗したタスクを再実行する代わりに、「完了」とは何かを一度定義すれば、ループが残りを処理します。どの再試行も、採点者が正確に何が間違っているかを特定し、ターゲットを絞った基準ごとのフィードバックを提供することで、知識に基づいています。
その結果:正確性が重要なタスクにおいて、より信頼性の高いエージェントが実現します。
詳しく学ぶ
RubricMiddleware はベータ版であり、API が変更される可能性があります。設定、観測可能性、ルブリックの永続化を含む完全なチュートリアルは、ドキュメントをご覧ください。