reduce 与 check_stop 之间,为你提供了一个结构化的钩子,可以审查智能体的最新决策及其结果、分配质量评分,并在必要时强制重试或终止执行。
本教程涵盖完整的 Critic API:CriticResult 契约、内置 Critic、@critic 装饰器、指令补丁与状态补丁,以及组合多个 Critic 的方式。
Step 1: CriticResult 契约
每个 Critic 都返回一个CriticResult——一个告知 Engine 下一步操作的数据类。
三种 action 控制循环行为:
"continue"——正常进入下一步。"stop"——立即终止 Engine。状态的停止原因会被设为StopReason.CRITIC_STOP。"retry"——丢弃当前步骤并重新运行decide。任何instruction_patch或state_patch会在重试前应用。
Step 2: 使用内置 Critic
QitOS 在qitos.kit.critic 中提供了开箱即用的 Critic。
PassThroughCritic
最简单的 Critic——始终以满分继续。SelfReflectionCritic
检查工具结果中是否包含错误,并在可配置的重试上限内自动重试。- 如果任何工具结果包含
{"error": ...}键且重试次数未耗尽,返回action="retry"、score=0.2。 - 如果错误持续超过
max_retries,返回action="stop"、score=0.0。 - 如果没有发现错误,返回
action="continue"、score=1.0。
ReActSelfReflectionCritic
专为 ReAct 智能体设计的增强版本。遇到错误时,它会构建一条结构化的反思笔记,描述失败的动作与观察到的错误,并将其追加到状态的 metadata 中,以便 LLM 在下次重试时能够从失败中学习。函数式等价物
每个内置 Critic 都同时提供了装饰器函数版本:Step 3: 使用 @critic 装饰器编写自定义 Critic
@critic 装饰器可将任意普通函数转换为 Critic 实例。该函数接收 (state, decision, results) 参数,可返回简写形式或完整的 CriticResult。
无参数装饰器:
score 参数将用作默认值。在上面的示例中,"continue" 返回会获得 score=0.8,而非通常的 1.0。
将 Critic 接入 Engine:
Step 4: 带指令补丁和状态补丁的 Critic
当 Critic 返回action="retry" 时,可以通过两种方式指导下一次迭代:
instruction_patch——追加到智能体系统提示词末尾的字符串,为 LLM 提供额外指导。state_patch——一个字典,其键值通过setattr合并到智能体的状态对象中。
decide 之前就已应用,因此当重试开始时,LLM 和状态都已经更新完毕。
state_patch 注入追踪数据:
Step 5: 组合多个 Critic
Engine 接受一个 Critic 列表。它们按顺序求值,第一个非 continue 的结果生效。这让你可以从最严格到最宽松地堆叠 Critic。- 如果
safety_gate返回"stop",Engine 立即终止。后续 Critic 不会被调用。 - 如果
safety_gate返回"continue"但format_check返回"retry",Engine 带着指令补丁重试。 - 如果两者都返回
"continue",SelfReflectionCritic有机会捕获工具错误。
Hooks 生命周期
了解 Critic 参与的完整 Engine 事件生命周期。
Agent Module
深入了解 Critic 审查的 AgentModule 接口。
Critic 与停止条件
了解 Critic 如何与停止条件和重试预算交互。
