直接回答

企业 AI Agent 是一个在委托权限下使用模型和工具、追求受限业务结果的软件主体。从试点进入生产,不能只升级模型;团队必须先筛选工作流,再固定身份与权限、持久化状态、让副作用可幂等重试、评测完整轨迹、核算人力和事故成本,并通过可回退阶段逐步开放权限。

真正持久的问题不是“Agent 有多自主”,而是“它代表谁、可以为哪个结果使用哪些权限、依据什么证据行动,以及组织如何停止或撤销它”。

如何理解企业采用数据

企业试验范围很广,但完全自治和治理成熟度仍然有限。Gartner 对 360 名 IT 应用负责人的调查显示:75% 的受访者正在试点、部署或已经部署某种 AI Agent,但只有 15% 正在考虑、试点或部署无需人工监督的完全自治 Agent;仅 13% 强烈认同组织已具备适当治理结构。该结果来自 2025 年 5 至 6 月的特定样本,不能当作全球生产采用率。

可长期保留的结论是:Agent 覆盖的系统差异极大,试点数量不能证明安全业务执行。只读研究助手、需要审批的退款 Agent 和自动付款流程不能共享一个“已落地”标签。

治理框架本身也需要版本控制。NIST 当前明确说明 AI RMF 1.0 正在修订,面向关键基础设施的可信 AI Profile 仍处于 Concept Note 阶段。应把框架名称、Profile、Revision 与组织采纳决策写入发布证据;一句“符合 NIST”不足以成为生产控制。

先筛选工作流,而不是先选框架

只有当价值、验收证据、权限与恢复路径都能明确时,工作流才适合进入 Agent 试点。

问题 资格证据 出现以下情况应拒绝或重构
哪个结果发生变化? 当前基线与已验收结果定义 成功标准只是“看起来有帮助”
完成状态能否独立验证? 测试、业务系统状态或评审量表 只有 Agent 自己判断成功
Agent 可读写什么? 资源与动作矩阵 必须持有宽泛凭证
最大损失是多少? 单次及累计影响上限 爆炸半径未知
副作用能否撤销? 补偿动作及负责人 高影响操作不可逆
是否必须动态规划? 固定逻辑失效的真实案例 状态机已经足够

Anthropic 将 Agentic System 区分为两类:工作流由代码确定路径,Agent 则由模型动态决定步骤与工具。其工程建议是,只有复杂度能证明改善结果时才增加复杂度。对于分支已知、操作稳定的业务,确定性编排更容易测试、恢复和审计。

flowchart LR A["候选工作流"] --> B{"结果可机器验收?"} B -- 否 --> X["不自动化"] B -- 是 --> C{"执行路径已知?"} C -- 是 --> D["确定性工作流"] C -- 否 --> E{"权限与恢复可收敛?"} E -- 否 --> Y["重构业务边界"] E -- 是 --> F["受限 Agent 试点"]

用发布契约固定业务意图

Agent 发布契约是业务目标与运行权限之间不可变、可版本化的协议,不应与 Prompt 或模型配置混在一起。

go
package main

import (
	"errors"
	"fmt"
)

type Action struct {
	Name                string
	Mode                string
	IdempotencyRequired bool
	CompensatingAction  string
}

type Release struct {
	AgentID            string
	Revision           string
	Owner              string
	Approver           string
	RollbackRevision   string
	PolicyRevision     string
	EvaluationRevision string
	CostCurrency       string
	MaxSteps           int
	MaxCost            float64
	TerminalStates     []string
	Actions            []Action
}

func makeSet(values []string) (map[string]struct{}, error) {
	result := make(map[string]struct{}, len(values))
	for _, value := range values {
		if value == "" {
			return nil, errors.New("empty value")
		}
		if _, exists := result[value]; exists {
			return nil, fmt.Errorf("duplicate value %q", value)
		}
		result[value] = struct{}{}
	}
	return result, nil
}

func validateRelease(release Release) error {
	if release.AgentID == "" || release.Revision == "" || release.Owner == "" ||
		release.PolicyRevision == "" || release.EvaluationRevision == "" ||
		release.CostCurrency == "" {
		return errors.New("release, policy, evaluation, cost, and owner identity are required")
	}
	if release.Approver == "" || release.Approver == release.Owner {
		return errors.New("approver must be independent from owner")
	}
	if release.RollbackRevision == "" ||
		release.RollbackRevision == release.Revision {
		return errors.New("independent rollback revision is required")
	}
	if release.MaxSteps <= 0 || release.MaxCost <= 0 {
		return errors.New("positive step and cost limits are required")
	}
	if len(release.Actions) == 0 {
		return errors.New("at least one bounded action is required")
	}

	states, err := makeSet(release.TerminalStates)
	if err != nil {
		return fmt.Errorf("terminal states: %w", err)
	}
	for _, required := range []string{"accepted", "escalated", "blocked", "budget_exhausted"} {
		if _, exists := states[required]; !exists {
			return fmt.Errorf("missing terminal state %q", required)
		}
	}

	names := map[string]struct{}{}
	for _, action := range release.Actions {
		if action.Name == "" {
			return errors.New("action name is required")
		}
		if _, exists := names[action.Name]; exists {
			return fmt.Errorf("duplicate action %q", action.Name)
		}
		names[action.Name] = struct{}{}

		switch action.Mode {
		case "read":
		case "auto", "approval":
			if !action.IdempotencyRequired {
				return fmt.Errorf("%s must require an idempotency key", action.Name)
			}
			if action.CompensatingAction == "" {
				return fmt.Errorf("%s must define compensation", action.Name)
			}
		default:
			return fmt.Errorf("%s has unknown mode %q", action.Name, action.Mode)
		}
	}
	return nil
}

func main() {
	release := Release{
		AgentID:            "refund-triage",
		Revision:           "2026-08-09.1",
		Owner:              "customer-operations",
		Approver:           "finance-control",
		RollbackRevision:   "2026-08-01.3",
		PolicyRevision:     "refund-policy/42",
		EvaluationRevision: "refund-eval/17",
		CostCurrency:       "USD",
		MaxSteps:           12,
		MaxCost:            1.50,
		TerminalStates: []string{
			"accepted", "rejected", "escalated", "blocked", "budget_exhausted",
		},
		Actions: []Action{
			{Name: "customer_profile:read", Mode: "read"},
			{Name: "order:read", Mode: "read"},
			{
				Name:                "refund_draft:create",
				Mode:                "auto",
				IdempotencyRequired: true,
				CompensatingAction:  "refund_draft:delete",
			},
			{
				Name:                "refund:execute",
				Mode:                "approval",
				IdempotencyRequired: true,
				CompensatingAction:  "refund:reverse",
			},
		},
	}

	valid := validateRelease(release) == nil
	invalid := release
	invalid.Approver = invalid.Owner
	selfApprovalRejected := validateRelease(invalid) != nil
	fmt.Printf(
		"release=%s/%s valid=%t self_approval_rejected=%t\n",
		release.AgentID,
		release.Revision,
		valid,
		selfApprovalRejected,
	)
}

预期输出:

text
release=refund-triage/2026-08-09.1 valid=true self_approval_rejected=true

该门禁会拒绝缺失归属、自审批、不可独立回退、重复动作、无上限执行,以及没有幂等或补偿要求的写操作。它仍不能证明审批人真实存在、Digest 可信或下游资源确实执行了声明策略;这些事实必须再向可信身份、制品与授权系统核验。

不要把权限藏在 System Prompt 中。Prompt 是给模型的输入,认证与授权必须由代码和下游业务系统强制执行。

围绕委托授权设计运行时

每个生产 Agent 都需要独立身份,并在每个资源边界执行最小权限。Agent 代表用户行动,不等于它应继承用户全部权限。

flowchart LR U["已认证用户或事件"] --> P["策略判定"] P --> R["Agent 运行时"] R --> T["类型化工具网关"] T --> S["业务事实系统"] R --> Q["持久状态"] R --> O["轨迹与成本账本"] T --> A{"高影响操作?"} A -- 是 --> H["人工审批"] H --> S A -- 否 --> S

工具网关应强制校验身份、租户和对象范围、输入 Schema、限流、幂等键、确认规则与结果大小。MCP 可以传输能力描述和调用,但服务端元数据属于不可信输入,绝不能作为授权证据。

区分状态、记忆与证据

状态是任务的权威进度;记忆是供未来决策选择性读取的上下文;证据是复现、评审或调查结果所需的留存记录。

数据类别 示例 必要性质
工作流状态 approval_pending 持久、版本化、可回放
业务状态 ERP 中的退款状态 由事实系统掌握真值
工作上下文 检索出的政策片段 来源与新鲜度可追踪
记忆 用户偏好摘要 同意、过期、纠正机制
审计证据 工具请求、策略判定、审批人 完整性、访问控制、保留策略

不要把聊天历史变成影子数据库。稳定业务事实应写回受治理系统;运行时只检索当前权限内的必要上下文,并分别定义轨迹与记忆的保留和删除规则。

让每个副作用都能安全重试

Agent 运行时会超时、重启并重复调用,因此写操作必须携带幂等键、前置条件、有限重试策略和补偿动作。

text
规划 -> 授权 -> 准备 -> 必要时审批
     -> 携带幂等键执行 -> 回读业务事实系统
     -> 提交终态或补偿 -> 写入证据

“模型声称成功”不是验证。执行后必须回读权威业务状态;结果不确定时,应停止并进入对账,而不是盲目重试不可逆操作。

同时评测业务结果与完整轨迹

只看最终答案,会遗漏越权读取、多余工具调用、过期政策和重复副作用。生产评测必须覆盖整条轨迹。

层级 示例指标
业务结果 符合资格案件中的已验收结果
正确性 与规则及事实系统的一致率
权限 越权读写次数
副作用 重复、部分完成与未对账操作
恢复 中断续跑与补偿成功率
人工负载 审批、升级与返工分钟数
可靠性 按任务切片与依赖状态统计完成率
经济性 每个已验收结果的总成本

评测集应同时包含代表任务、对抗任务和事故回放,并按风险、歧义、语言、客户分层、工具故障与政策版本切片。失败和主动弃权必须保留,否则会虚增 Goodput。

text
已验收 Goodput
  = 受限运营周期内的已验收业务结果数

每个已验收结果成本
  = (模型 + 基础设施 + 集成摊销
     + 操作 + 审批 + 返工 + 事故 + 撤销成本)
    / 已验收业务结果数

建立 Agent 控制面

Microsoft Agent 365 已把控制面模式具体化为注册表、Agent Map、Analytics、受控接入、集成访问、生命周期策略、审计、身份与数据控制。它是厂商实现,不是行业标准;但「机群清单、运行时强制、证据和业务监督相分离」的设计同样适用于非 Microsoft 环境。

最低配置包括:

  • Agent 注册表:负责人、用途、发布版本、运行位置、数据和工具范围;
  • 独立身份、凭证轮换与撤销;
  • 数据和动作的 Policy as Code;
  • 轨迹、成本、质量、漂移和事故信号;
  • 模型、Prompt、工具、策略、评测集和依赖版本;
  • 保留、删除和 Legal Hold 行为;
  • 紧急停机、流量回滚与凭证轮换。

NIST AI RMF 是自愿且与具体场景无关的风险管理框架。其 Govern、Map、Measure、Manage 可以组织责任和证据,但通过内部清单不等于已证明法律合规。

通过可逆阶段逐步开放权限

生产发布应在上一阶段证据通过后才扩大权限。

flowchart LR A["离线回放"] --> B["隔离沙箱"] B --> C["影子运行"] C --> D["只读试点"] D --> E["审批后执行"] E --> F["窄范围灰度"] F --> G["受控扩量"] G --> H["持续复核"] B -. 失败 .-> R["修复或回滚"] D -. 回归 .-> R F -. 事故 .-> R G -. 漂移 .-> R

每个阶段都需要准入门槛、退出门槛、负责人、最大暴露范围和回滚目标。回滚对象必须是完整 Release Manifest,而非只切换模型;Prompt、工具、策略、检索索引、运行时和评测假设都可能造成回归。

明确停止条件

出现以下情况,应停止、缩小范围或退回确定性软件:

  • 结果无法独立验收;
  • 权限无法收窄到当前任务;
  • 不可逆操作没有审批和补偿;
  • Agent 需要无限制数据或网络访问;
  • 审批和事故成本抵消预期价值;
  • 关键任务切片性能崩溃;
  • 已验收结果成本高于现有流程;
  • 更简单的工作流达到同等结果。

停止试点不是失败,而是防止 Demo 变成无边界生产负债的必要控制。

常见问题

私有化部署是否足以保证企业 Agent 安全?

不够。部署位置无法解决权限过宽、提示词注入、不安全工具、跨租户访问、无上限副作用、保留策略和事故响应缺失。部署拓扑只是完整威胁模型与数据流模型的一个输入。

每个企业 Agent 都需要人工审批吗?

不需要。审批强度应跟随后果、不确定性和可逆性。只读检索可自动执行;资金、删除、对外发布、权限变更和外部承诺通常需要更强控制。

Agent 是否应该从每次任务中自动学习?

不应该。自动写记忆可能永久保存错误、敏感数据或恶意指令。只有通过来源、校验、归属、过期和删除规则后,信息才能进入长期记忆。

企业部署多少个 Agent 才算成熟?

不存在成熟度数量目标。应统计受治理的业务能力,而不是 Agent 人设。一个边界清晰的运行时通常比多个依赖自然语言协作的 Agent 更可靠。

什么证据能证明企业 Agent 已具备生产条件?

目标工作流中的真实证据:已验收结果、受控违规、恢复测试、人工负载、运营成本、事故演练和成功回滚。框架 Demo 或公开榜单无法证明这些条件。

相关资源

一手资料