跳到正文
LangChain Blog·· 2026-08-26精选AI 评分60

LangChain 为 Deep Agents 推出 Rubrics 自评机制

Introducing Rubrics: Build Agents that Evaluate and Correct Their Work

AI 导读

LangChain 在 Deep Agents 中加入 RubricMiddleware,开发者定义 rubric 后由独立的 grader 子智能体按条目评分,未通过则把逐条反馈注入对话让智能体重跑,直到满足全部标准或达到 max_iterations。

推荐理由

原文给出了评分循环的配置方式与一次代码生成实测,读者可据此判断自评机制能否降低重跑成本。

正文 · AI 翻译

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:用于生成解决方案的 LLM
  • system_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