LangChain 为 Deep Agents 推出 Rubrics 自评机制
Introducing Rubrics: Build Agents that Evaluate and Correct Their Work
LangChain 在 Deep Agents 中加入 RubricMiddleware,开发者定义 rubric 后由独立的 grader 子智能体按条目评分,未通过则把逐条反馈注入对话让智能体重跑,直到满足全部标准或达到 max_iterations。
原文给出了评分循环的配置方式与一次代码生成实测,读者可据此判断自评机制能否降低重跑成本。
Agent 正在承担比以往更复杂的任务。但很多时候,它们都无法坚持到终点。我们在 Deep Agents 中加入了 RubricMiddleware 来解决这个问题:你定义一套评分标准,Agent 会自我评估并不断迭代,直到满足每一条标准,或达到配置的上限。
如果你熟悉 Claude Code 或 Codex 中的 /goal,这是一种类似的模式。这个实现更灵活一些,因为评估由一个专门的评分器 sub-agent 负责,它可以调用工具、对完整对话记录进行推理,并返回逐条标准的反馈。
问题所在
有些 Agent 任务对“完成”有清晰的定义。代码重构在测试套件通过时就完成了。报告在涵盖所有必需章节时就完成了。
但 Agent 并不总能一次就做到。随着上下文越来越大,模糊的指令、工具误用和非确定性错误都会叠加——输出质量下降,开发者只能手动诊断并重新运行任务。
工作原理
在 Agent 运行结束之前,一个独立的评分器 sub-agent 会依据评分标准对其进行审查。如果全部通过,运行就结束。如果有任何不达标之处,评分器的逐条反馈会被注入回对话中,Agent 会再次运行。当评分标准被满足,或达到配置的迭代上限时,循环终止。
循环在 satisfied、max_iterations_reached、failed 或 grader_error. 时终止
接入方式
下面是最小化的设置,分为几个步骤。核心思路:定义一次 RubricMiddleware,将其附加到一个 deep agent 上,然后在调用时传入一个 rubric 字符串。(如果缺少 rubric,该中间件不会做任何事。)
1) 定义 RubricMiddleware
这个 middleware 在基础 Agent 之上添加了一个评分器循环。评分器配置如下:
model:用于评分的 LLM(通常比你的主 Agent 模型更小、更便宜)system_prompt:定义评分器角色以及“好”的标准的指令tools:评分器可调用的可选工具,用于收集证据(例如运行测试、lint、验证输出)max_iterations:运行停止前修复 → 重新评分的最大循环次数
from deepagents import RubricMiddleware
rubric_middleware = RubricMiddleware(
model="anthropic:claude-haiku-4-5",
system_prompt="You are a code reviewer grading generated code against a rubric.",
tools=[run_test_suite],
max_iterations=5,
)2) 将其传给 deep agent
你的 deep agent 也应该有自己的“操作指令”。Agent 的 system_prompt 告诉它如何完成工作,而评分标准告诉评分器如何评判工作。
在下面的代码片段中:
model:用于生成解决方案的 LLMsystem_prompt:Agent 的编码约定 + 约束middleware:附加rubric_middleware,以便 Agent 可以被迭代纠正
from deepagents import create_deep_agent
agent = create_deep_agent(
model="anthropic:claude-sonnet-4-6",
system_prompt=(
"You are a careful Python engineer. Write correct, readable code. "
"Follow the user’s instructions exactly."
),
middleware=[rubric_middleware],
)3) 使用人类消息 + 评分标准进行调用
在调用时,你提供:
messages:人类请求(以及可选的先前轮次)rubric:一个以换行符分隔的检查清单,评分器必须将其标记为已满足
from langchain.messages import HumanMessage
result = agent.invoke(
{
"messages": [
HumanMessage(
content=(
"Write a Python function `find_duplicates(lst)` that returns a list of "
"all elements that appear more than once in the input list, in the order "
"they first appear."
)
)
],
"rubric": (
"- All tests pass in run_test_suite\n"
"- The function is named `find_duplicates` and accepts a single list argument\n"
),
},
config={"configurable": {"thread_id": "code-generation-session"}},
)
print(result["messages"][-1].text)我们没有要求评分器抽象地推理正确性,而是给它一个 run_test_suite 工具来直接验证行为。评分器可以在给出结论之前调用工具收集确凿证据——当没有提供工具时,则回退到基于对话记录进行推理。
实践中的效果
在上面的代码生成示例中,Agent 的第一次尝试看起来是正确的,但有一个测试失败了。评分器返回:
“一个测试失败:test_unhashable。当输入列表中遇到列表等不可哈希类型时,该函数会抛出 TypeError 崩溃。”
该 agent 修改了其实现,并在第二次迭代中通过了所有测试。反馈不是笼统的“再试一次”——每条标准都会得到各自的判定,因此 agent 能确切知道需要修复什么。
在此 trace 中查看完整示例。
为什么这很重要
Agent 的输出具有概率性:同一个提示词可能一次运行成功,下一次却达不到要求。RubricMiddleware 将捕捉这种波动的负担从开发者转移到了系统上。
无需手动检查输出并重新运行失败的任务,你只需定义一次“完成”的标准,循环会处理其余的事情。每次重试都是有依据的——评分器会准确指出问题所在,并生成针对每条标准的有针对性反馈。
结果是:在正确性至关重要的任务上,agent 更加可靠。
了解更多
RubricMiddleware 处于 beta 阶段,API 可能会发生变化。如需包括配置、可观测性和评分标准持久化在内的完整演练,请参阅文档。
来源:LangChain Blog · langchain.com