AI工程SynapseB类

从四级到五级:如何设计AI Agent的决策分级体系

将非技术价值判断纳入决策框架的实操方法论

  • L5需要处理非技术价值判断,L4只需确定性规则
  • 决策分级本质是边界条件而非层级数量
  • 业务方需提供"价值偏好函数"而非仅流程图
  • 每个决策点必须标注可回滚范围
  • 反馈机制设计比初期分类更重要

问题背景

上周三凌晨2点,我们的物流调度Agent(L4→L5升级灰度测试)做出了一个让整个团队陷入争议的决策:接受了一条利润率只有3%的订单,理由是"距离仓库15公里内优先级更高"。业务方质问为什么Agent放弃了隔壁城市利润率12%的订单,运维团队查了3小时日志才发现原因是某条规则在凌晨被意外激活。

这不是个例。过去两个月,我们的Agent在L4升级L5的过程中,决策失误率从0.3%飙升到2.1%,影响单量超过4700单,涉及金额超过180万元。问题不在于模型能力不足,而在于我们根本没有为"非技术价值判断"设计可执行的决策框架。

为什么难排查

我们一开始以为L4到L5的差距只是"多了一层判断逻辑",参照现有分级标准增加规则数量就行。但实际上,L4处理的是确定性环境(成本最低、时间最短),L5要处理的是价值判断环境(成本与时效的权重、风险与收益的取舍)。这两个问题的本质完全不同。

更重要的是,我们发现业务方在提需求时普遍使用"优先级"这个模糊概念,但Agent执行时需要的是可量化的"价值函数"。业务方说"优先考虑大客户",实际意思是"利润率高于8%的客户权重+50%",但这个换算过程在过去完全缺失。结果就是业务方觉得Agent"不听话",Agent其实在按字面意思执行一条从未被精确定义过的规则。

根因/核心设计决策

问题的根因在于:L5的决策框架需要同时处理技术约束和非技术价值判断,但我们沿用了L4时代的纯规则引擎架构。

真正的解决方案是引入"价值偏好层",让业务方的价值判断变成可配置参数,而非硬编码规则。以下是我们重构后的决策框架核心代码:

# decision_framework.py
from enum import IntEnum
from dataclasses import dataclass
from typing import Optional, List, Dict, Any

class DecisionLevel(IntEnum):
    L1_EXECUTE = 1   # 完全按指令执行
    L2_VALIDATE = 2  # 执行前校验
    L3_OPTIMIZE = 3  # 同目标内优化
    L4_BOUNDED = 4   # 边界内自主决策
    L5_VALUED = 5    # 价值判断决策

@dataclass
class ValuePreference:
    """业务价值偏好函数"""
    metric: str                    # 指标名称
    weight: float                  # 权重 (0.0-1.0)
    threshold: Optional[float] = None  # 阈值
    direction: str = "higher"      # 优化方向
    
    def evaluate(self, value: float) -> float:
        if self.threshold:
            return self.weight * (1.0 if value >= self.threshold else 0.0)
        return self.weight * value if self.direction == "higher" else self.weight * (1 - value)

class DecisionContext:
    """决策上下文"""
    level: DecisionLevel
    action: str
    options: List[Dict[str, Any]]
    value_preferences: List[ValuePreference]
    rollback_range: Optional[Dict[str, Any]] = None

def evaluate_option(option: Dict[str, Any], 
                   preferences: List[ValuePreference]) -> float:
    """计算单个选项的价值得分"""
    score = 0.0
    for pref in preferences:
        if pref.metric in option:
            score += pref.evaluate(option[pref.metric])
    return score

def make_decision(ctx: DecisionContext) -> Dict[str, Any]:
    """核心决策函数"""
    if ctx.level < DecisionLevel.L5_VALUED:
        # L1-L4: 使用确定性规则(保持原有逻辑)
        return deterministic_select(ctx)
    
    # L5: 价值驱动的决策
    scored_options = []
    for opt in ctx.options:
        score = evaluate_option(opt, ctx.value_preferences)
        scored_options.append((opt, score))
    
    # 按价值得分排序,选择最高分
    best = max(scored_options, key=lambda x: x[1])
    
    # 记录决策轨迹供回滚使用
    return {
        "selected": best[0],
        "score": best[1],
        "alternative": [opt for opt, _ in scored_options if opt != best[0]],
        "rollback_range": ctx.rollback_range
    }

业务方的需求不应该是一张流程图,而是一组ValuePreference对象:metric定义要什么、weight定义多重要、threshold定义可接受的底线。这才是将"模糊的优先级"变成"可执行的价值函数"的正确方式。

可移植的原则

  1. 如果你在设计L5级别Agent,请先问业务方"这个决策的失败成本是多少",而不是"这个决策的优先级是什么"。失败成本决定了rollback_range的宽度。
  2. 如果你在定义决策边界,请确保每个边界条件都有对应的可量化测试用例。边界不是"客户重要性高",而是"利润率≥8%且近30天订单数≥5"。
  3. 如果你在处理多目标冲突,请使用加权和模型而非if-else链。10个if-else覆盖不了10个指标的组合,但加权和可以。
  4. 如果你在写决策日志,请记录每个选项的"未选中原因"。这对事后复盘至关重要,我们就是因为缺少这个字段才查了3小时。

结尾

物流调度Agent的问题在重新定义ValuePreference后72小时内解决:业务方将"优先考虑大客户"表述为"利润率权重0.6、订单量权重0.3、服务时效权重0.1",Agent现在能正确地在不同业务场景下动态调整决策权重。如果你正在经历类似的L4→L5升级困境,建议先从决策日志格式改起——让Agent记录每个选项的未选中原因,比任何架构重构都更直接地暴露问题所在。