想象你是一位音乐厅的常客。昨晚你听了一场顶级的交响乐演出,指挥家拿着总谱,八十位乐手各司其职:第一乐章快板、第二乐章行板、第三乐章回旋曲,每一个音符都在谱面上写得分明。今晚上你又来听同一首曲子——同样的指挥、同样的乐谱、同样的乐手,你期待听到几乎一模一样的演奏。你当然信任乐手们的即兴发挥,但在一场标准交响乐里,“即兴”反而是灾难。 这就是确定性编排的哲学:AI Agent 协作的舞台上,我们需要一位拿着总谱的“指挥家”,而不是一群自由即兴的“爵士乐手”。Bernstein 正是 Oracle 开源的这样一个“指挥家”——它用状态机把多 Agent 协作的每个环节钉在乐谱上,让每个步骤的推进、每次错误的重试、每段执行的轨迹,都可预测、可回放、可审计。而与之相对的 ReAct 式自由循环 Agent,则像是即兴爵士——每次演出都不一样,好听,但无法复刻。
对 AI Agent 架构师而言,掌握确定性编排意味着你能把“演示级 Agent”升级为“生产级系统”——当金融、医疗、政务客户要求“每次运行结果可解释、能审计、能重放”时,你手中的乐谱就是入场券。
可视化演示
动态演示Bernstein的核心机制,通过概览/流程/对比/趋势四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
Bernstein:Bern Bernstein确定性编排总 状态机驱动的工作流引擎设计 核心机制可视化 Bernstein整体架构与关键组件
确定性设计理念
交响乐演出之前,指挥家要做的第一件事不是举起指挥棒,而是翻开总谱。总谱写着“哪一段由小提琴主奏、哪一段由铜管进入、哪一段全体休止”——每一个节拍都有归属,每一次推进都有依据。没有这份确定性,八十位乐手各拉各的,再好的乐手也会把音乐会变成噪音。确定性设计理念要回答的正是这个问题:多 Agent 协作时,谁来保证“下一拍该谁上”?
把这个理念搬到 AI 世界,你会看到两种截然不同的组织方式。一种是把任务交给一个 Agent,让它自由地思考、调用工具、再看结果、再思考(这就是后文会讲的 ReAct 循环);另一种是把任务拆成明确的步骤,每一步由哪个 Agent 执行、什么条件触发下一步、失败了往哪里走,全部在运行前写清楚。Bernstein 属于后者。作为 Oracle 开源的确定性 Agent 编排引擎,它把“编排”这件事从“靠模型临场发挥”变成了“靠规则精确调度”。
这里的“确定性”需要精确理解:它不是要求大模型每次吐出的每个 token 都一模一样,而是要求工作流的结构确定——状态如何流转、事件如何触发、错误如何分发,这些由引擎和状态机说了算,而不是由模型情绪说了算。数学上,确定性系统可以描述为:相同的输入经过系统,必然得到相同的输出。
回到乐团的比喻:指挥家不需要每次演出都重新发明总谱,他需要的是严格执行总谱。Bernstein 就是这样一位“照谱指挥”的指挥家——它把“谁来演、什么时候进、演砸了怎么补救”全部固化下来,让企业敢把 AI Agent 放进生产环境,因为每一次演出都有据可查、有谱可依。
- 函数 \( f \) 与定义域 \( X \)、值域 \( Y \)把系统看成一个函数机器,输入集合 \( X \) 是“喂给系统的任务”,输出集合 \( Y \) 是“系统交出的结果”。
- 任意两个元素 \( x_1, x_2 \)无论你从输入集合里取出哪两个样本进行比较,它们都满足后面的规则。
- 前提条件 \( x_1 = x_2 \)只要这两个输入在事实上完全相同——就像同一份乐谱、同一组乐手、同一个指挥。
- 结论 \( f(x_1) = f(x_2) \)那么系统的输出必然相等。这就是确定性编排承诺给企业客户的最硬核保证:同样的任务跑十次,十次的流程轨迹完全一致。
状态机驱动核心
总谱怎么记录一次演出?它把乐曲切成乐章,每个乐章里有小节,小节里有明确的演奏记号:这一段是行板,下一段转快板,第三段回到主题。状态机就是软件世界的“总谱”。在 Bernstein 中,一个 Agent 任务的整个生命周期被建模为一张有限状态机(FSM)——状态就是乐章的段落标记,事件就是指挥家的手势,而状态转移规则就是谱面上的演奏记号。
一个典型的状态机包含五个核心要素,Bernstein 的 Agent 生命周期也正好对应“五个状态”:CREATED(创作完毕,等待入场)、RUNNING(正在演奏)、COMPLETED(顺利收尾)、ERROR(演砸了)、CANCELLED(被指挥叫停)。这些状态之间不是随便连的:只有满足显式转移条件,事件才会推动状态变化。比如“校验通过”这个事件,才能让一个 Agent 从 CREATED 走进 RUNNING。
形式化地看,任何有限状态机都可以用一个五元组表达,这也是 Bernstein 底层执行引擎的核心抽象:
在 Bernstein 中,定义这些状态和转移不需要写繁琐的命令式代码,而是通过声明式 API(比如 aexp、sexp 这样的表达式)一次性描述整张“乐谱”。执行引擎拿到乐谱后,会忠实地替你完成调度:状态落在哪个节点,就调用对应的 Agent 去演奏;事件返回后,引擎查表决定下一个状态。这就是“状态机驱动”的含义——流程的节奏由状态机把持,而不是由某个 Agent 的随心所欲把持。指挥家手里的总谱越清晰,乐手们的配合就越默契。
- 状态集合 \( Q \)所有可能状态的集合,对应 Bernstein 的五个生命周期状态,相当于乐曲中所有段落标记的集合。
- 事件集合 \( \Sigma \)能够触发状态变化的输入符号集合,比如“校验通过”“支付成功”“超时”这些来自外部或 Agent 自身的事件。
- 转移函数 \( \delta \)它回答“当前状态遇到某个事件时,下一步去哪”,Bernstein 正是靠一张张这样的转移规则表来驱动 Agent 前进的。
- 初始状态 \( q_0 \)任务刚创建时所在的起点,也就是
CREATED——演出开始前乐手们坐在候场区的那个时刻。 - 终态集合 \( F \)任务被判定为“结束”的状态集合,包括
COMPLETED、ERROR、CANCELLED,到达这里,本次执行的乐章画上句号。
非确定性对比
如果说 Bernstein 是古典交响乐团,那 ReAct 式的 Agent 就是一支即兴爵士乐队。爵士乐手拿到一个主题后,开始自由地独奏轮换:鼓手先来一段,贝斯手接上,键盘手再变奏——没有人知道下一小节谁上场、用什么调式。ReAct 循环的运作方式正是如此:Agent 先推理(Reason),再行动(Act),观察结果后又继续推理,如此循环,直到它自己觉得“该停了”。每一步的推理和行动都由大模型采样决定,而采样天然带有随机性。
这种“即兴”带来了极强的灵活性,但也带来了生产环境的噩梦。你问即兴 Agent 同一个问题十次,它会给你十条不同的处理路径;某次运行中途失败了,你甚至无法准确说清它当时为什么选择了那条路。而非确定性在数学上的表现就是“多值映射”——同一个输入可能落到多个不同的输出上:
不过,请你做一个关键的区分:ReAct 的“非确定性”主要体现在控制流上,而不是大模型本身的可变性。大模型采样确实有随机性,但真正让 ReAct Agent 难以捉摸的,是它把“下一步做什么”也交给了模型。而 Bernstein 的确定性编排把控制流收归状态机,Agent 内部的模型输出可以继续自由发挥——只是它再也不能决定流程的走向了。
这就给了我们清晰的场景选择建议:如果任务是开放探索型的,比如头脑风暴、创意文案、开放式问答,请用 ReAct 式的即兴 Agent,它们能在未知领域打出漂亮的变化球;如果任务是流程固定型的,比如订单履约、金融审批、工单流转,请用 Bernstein 式的确定性编排,让每一条流程轨迹都像古典乐章一样严谨可复现。一个团队里两种“乐队”可以并存,关键是清楚自己现在是在开音乐会,还是在开派对。
- 输出属于一个集合\( f(x) \in \{\ldots\} \) 表示这次的输出不是“一个确定值”,而是一个候选池里的某一位——就像爵士乐手这次选择了降B调,下次可能换成降E调。
- 集合大小至少为 1\( |\{y_i\}| \geq 1 \) 说明虽然结果不确定,但至少会有输出,系统不会凭空消失。
错误处理机制
交响乐演出中最怕什么?不是某一个音拉错,而是拉错之后整个乐队不知道如何继续,导致全场失控。优秀的指挥会在排练时就制定应急预案:独奏破音时,指挥给一个手势,乐队从下一个强拍齐奏切入,把演出拉回正轨。错误处理机制的核心理念就是“预案先行”——错误不是意外,而是状态机里一条提前画好的路径。
在 Bernstein 中,错误处理被设计得异常直白:每个 Agent 都可能失败,失败后事件将状态推进到 ERROR,而不会让整个工作流悬在半空。进入错误状态后,系统可以执行三种典型的补救动作:重试(带着指数退避策略再试一次)、回退(回到上一个可靠状态重新走)、熔断(连续失败就暂停该路径,避免雪崩)。这些策略不是现场拍脑袋,而是在定义状态机时就写进“乐谱”的。
其中最经典的重试策略是指数退避——每次重试的等待时间按指数增长,避免在故障点上反复“撞墙”:
除了重试,状态机还能设计回退路径:比如支付 Agent 失败后,工作流不是停在原地,而是回退到“确认订单”状态,让另一个 Agent 换一种支付渠道重新尝试。故障隔离则保证其中一个 Agent 的连续失败不会拖垮整场演出——其他状态照常推进。这一切之所以可行,是因为确定性编排早就把“演砸了”写进了乐谱:错误不是混乱的开始,而是谱面上一个标注清晰的休止符,休止之后,乐队按预案继续。
- 第 \( n \) 次重试等待时间 \( t_n \)\( n \) 从 0 开始计数,代表这是第几次重试,等待时间随次数增长。
- 初始等待 \( t_{0} \)第一次重试前的基础等待时长,通常设为 1 秒或几百毫秒,是整个退避序列的“起点拍速”。
- 指数增长 \( 2^{\,n} \)每次重试翻倍——1、2、4、8、16 秒,节奏越来越慢,给下游系统喘息恢复的时间。
- 封顶 \( \min(t_{\max}, \cdot) \)等待时间不能无限增长,最多到 \( t_{\max} \) 就封顶,防止重试间隔长得失去意义。
可重复性保障
演出结束后,指挥家会做一件爵士乐队从不做的事:看演出录像。录像里记录了每一个乐手的每一次起弓、每一个节拍的快慢、每一处细微的偏差。正因为有录像,下一场演出若想复现今晚的辉煌,指挥家有据可依;若今晚某个段落出了瑕疵,指挥家也能指着录像说:“问题出在第三乐章第 47 小节。”可重复性保障就是 AI 系统的“演出录像”。
Bernstein 对每次执行都会记录完整的审计日志:谁在什么时间进入了什么状态、由哪个事件触发、Agent 返回了什么结果、最终走向了哪个终态。这些日志不仅用于事后审计,更支持轨迹重放——你可以把某次生产环境的执行轨迹完整地重跑一遍,观察每一步的细节。这就好比把录像倒回去逐帧播放,任何问题都无处遁形。
“可重复”在数学上有一个精确表达:无论系统运行多少次,只要输入相同、初始状态相同,执行轨迹就必然相同。令第 \( i \) 次运行的轨迹为 \( \mathrm{Trace}_i(x) \),那么:
这种全程可观测的确定性,对企业客户的意义怎么强调都不过分。金融场景需要回答监管“为什么给这个人放了贷款”,政府场景需要回答“为什么做出这个审批决定”,医疗场景需要回答“为什么推荐这个方案”——有了轨迹重放,这些回答不再是销售话术,而是可以从日志里直接导出的客观记录。回到乐团比喻:爵士乐手的演出再精彩也无法复刻,而交响乐团的录像可以年复一年地被研究、被复现、被改进。生产级系统需要的不是一次惊艳,而是次次稳定——这正是可重复性保障的价值。
- 轨迹函数 \( \mathrm{Trace}(x) \)把一次完整的执行过程压缩成一个序列 \( (s_0, s_1, \ldots, s_n) \),其中每个 \( s_k \) 是某个时刻的状态快照。
- 任意两次运行 \( \forall i, j \)无论你比较哪两次运行,即使它们在时间上相隔很远、运行环境略有差异。
- 轨迹相等两次运行产生的状态序列完全一致,从而支持逐帧比对、精确审计。
工程实践构建
总谱不是一天写成的。指挥家拿到一首新曲目,会先通读总谱,标记段落结构;然后分声部排练,让每个乐手熟悉自己的部分;最后合奏、打磨、正式演出。构建一个 Bernstein 确定性编排系统,遵循的是完全相同的节奏。作为架构师,你的第一项工作不是写代码,而是识别场景——问自己:这个业务真的需要确定性吗?
如果答案是肯定的,接下来就是状态机建模。画一张纸上的状态图:先列出所有参与者(Agent 角色),比如“订单校验 Agent”“支付 Agent”“库存 Agent”“物流 Agent”;然后为整个流程定义状态——CREATED、RUNNING、COMPLETED、ERROR、CANCELLED;最后用事件把状态连接起来,画出转移表。这张表就是你的“总谱初稿”,评审它时,重点检查两件事:每一个状态是否都有明确的进入和离开条件?每一个错误路径是否都有兜底出口?
完成建模后,进入 Agent 组装阶段。你在状态机的每个节点上挂一个真正的 Agent 实现:它接收上游事件的上下文,执行自己的任务(调用 LLM、工具或外部 API),然后返回一个结构化事件给引擎。Bernstein 的声明式 API 此刻大显身手——你不需要手写一堆 if-else 来维护状态流转,只需要把状态、事件、Agent 的绑定关系声明出来,引擎就能自动执行调度。最后一步是测试验证:不止测“快乐路径”,更要测错误路径——支付失败、超时、模型返回畸形 JSON、下游服务宕机。把所有异常场景都跑一遍,确认错误处理机制如预案般工作,才能发布到生产环境。
这套实践的可靠性可以用一个朴素的成功率指标来衡量,它也是每次发布前的“及格线”:
回顾整场“音乐会”:从一个模糊的业务想法,到一张清晰的状态机总谱,再到各个 Agent 声部依次就位,最后在测试中逐条验证所有乐段——这就是确定性编排的工程全流程。指挥家不会在演出当天才决定节奏,而是在排练厅里把每一个细节都打磨清楚。作为 AI Agent 架构师,你手里的“排练厅”就是状态机设计,“正式演出”就是生产环境。好的编排不是让 Agent 自由生长,而是让每个 Agent 在正确的时间、正确的位置,奏出正确的音符。
- 成功次数 \( N_{\text{success}} \)在测试集或生产监控中,按预期轨迹完整走完不报错的任务数量。
- 总次数 \( N_{\text{total}} \)所有发起的执行总数,包括成功与失败的。
- 比值 \( R \)成功数除以总数得到可靠性比率,是衡量系统健壮性的直观指标,也是上线前的质量门槛。
AI 应用场景
金融信贷审批流
阶段:多 Agent 协作编排
解决的问题:传统信贷审批需要多个系统(征信、收入核验、反欺诈、额度计算)串联,人工协调效率低;自由式 Agent 又无法满足监管“为什么拒绝这笔贷款”的审计要求。Bernstein 将审批流程建模为状态机,每个环节由独立 Agent 执行,全流程轨迹可审计、可重放。
具体案例:某银行线上信贷产品将“资料校验 → 征信查询 → 反欺诈评分 → 额度计算 → 审批决策”五个步骤定义为五个状态。征信 Agent 返回失败时,状态机自动转入重试分支,连续失败 3 次后进入 ERROR 状态并通知人工复核。每次申请的完整状态轨迹存入审计日志,监管问询时可直接导出。
电商订单履约
阶段:跨部门 Agent 调度
解决的问题:订单履约横跨库存、支付、物流、客服多个系统,任何一个环节失败都可能造成“订单悬空”。确定性的状态机编排保证每个订单都有明确的当前状态和下一步动作,杜绝“丢单”。
具体案例:某电商平台用确定性编排处理大促订单:库存 Agent 锁定库存成功 → 支付 Agent 发起扣款 → 物流 Agent 生成运单。若支付 Agent 超时,状态机自动回退到“库存锁定”状态,由客服 Agent 介入与用户确认。整条链路每分钟处理数千订单,状态轨迹全部可回放,故障定位从小时级缩短到分钟级。
企业 IT 工单自动处理
阶段:Agent 协作与错误兜底
解决的问题:企业内部 IT 工单往往经历“分类 → 分诊 → 处理 → 升级”多个环节,传统规则引擎难以处理语义多变的工单描述,纯 LLM 自由处理又可能跑偏。Bernstein 将环节固定为状态机,每个环节的 Agent 拥有 LLM 判断能力,但流程方向由状态机掌控。
具体案例:某大型企业的 IT 服务台部署了确定性编排工单系统:工单创建后由分类 Agent 打标签,分诊 Agent 根据标签指派给网络组或账号组,处理 Agent 执行具体修复。若网络组 Agent 判断超时,状态机自动升级到二线专家队列。整个流程轨迹可回放,用于月度服务质量审计。
Python 演示
"""确定性Agent编排器:用有限状态机驱动Agent工作流。"""from dataclasses import dataclassfrom enum import Enum class AgentState(Enum): CREATED = "created" RUNNING = "running" COMPLETED = "completed" ERROR = "error" CANCELLED = "cancelled" @dataclassclass Transition: event: str source: AgentState target: AgentState class StateMachineOrchestrator: """读取状态表,按事件驱动Agent流转。""" def __init__(self, name): self.name = name self.state = AgentState.CREATED self.rules = [] self.history = [] self.run_count = 0 def add_rule(self, event, source, target): self.rules.append(Transition(event, source, target)) def fire(self, event): if self.state not in (AgentState.COMPLETED, AgentState.CANCELLED): self.run_count += 1 for rule in self.rules: if rule.event == event and rule.source == self.state: print(f"[{self.name}] {self.state.value} --{event}--> {rule.target.value}") self.state = rule.target self.history.append((event, self.state)) return self.state raise ValueError(f"状态 {self.state.value} 下不允许事件 {event}") def replay(self): """审计回放:打印每一次状态转移。""" return list(self.history) if __name__ == "__main__": orch = StateMachineOrchestrator("订单履约") orch.add_rule("validate_ok", AgentState.CREATED, AgentState.RUNNING) orch.add_rule("validate_fail", AgentState.CREATED, AgentState.ERROR) orch.add_rule("payment_ok", AgentState.RUNNING, AgentState.COMPLETED) orch.add_rule("payment_fail", AgentState.RUNNING, AgentState.ERROR) orch.fire("validate_ok") orch.fire("payment_ok") print("执行轨迹:", [s.value for _, s in orch.replay()])
class AgentState(Enum)定义五个生命周期状态,对应 Bernstein 的状态集合。@dataclass class Transition每条转移规则是一个“事件 + 源状态 + 目标状态”的三元组。self.state = AgentState.CREATED所有任务从“创建”状态起步,即状态机的 \( q_0 \)。self.rules = []用一张规则表存放全部状态转移规则,引擎查询这张“总谱”。self.run_count = 0计数器记录已执行的事件数,用于观测运行进度。def add_rule(self, event, source, target)向状态机注册一条转移规则,相当于在总谱上写下一个演奏记号。if rule.event == event and rule.source == self.state核心查表逻辑:只有事件匹配且源状态匹配当前状态时,转移才合法。self.history.append((event, self.state))每次转移都追加到历史列表,这就是最简版的“审计日志”。raise ValueError(...)遇到未定义的事件立即报错,确定性系统拒绝“临场发挥”。def replay(self)返回完整转移历史,支持轨迹重放。
常见误区
误区我以为 Bernstein 的确定性就是把所有大模型的 temperature 设为 0,让每次生成的文本一模一样,否则就不算“确定性”。
正解这是最普遍的误解。Bernstein 的确定性指的是工作流结构的确定性——状态怎么流转、事件怎么触发、错误怎么分发,这些由状态机和引擎决定,与模型采样无关。即使某个 Agent 内部用 temperature=0.7,只要它返回的事件被状态机正确处理,整个编排仍是确定性的。你可以把模型采样看作乐手的个人音色,而确定性编排约束的是乐谱结构——音色可以自由,谱子不能乱改。
为何常见:因为“确定性”这个词太容易让人联想到“输出固定”,而大家平时接触 LLM 时最常调的就是 temperature,两个概念很容易被混为一谈。
误区我担心把 Agent 装进状态机就像给 AI 戴上镣铐,它会变笨,遇到没见过的场景就彻底卡死,还不如让 Agent 自由发挥。
正解确定性编排限制的是“流程方向”,不是“单点能力”。每个状态节点上挂的 Agent 依然是大模型,它照样可以推理、可以调用工具、可以返回丰富的分析结果。区别在于,Agent 的智力被用在“把手头这个状态的任务做好”,而不是“决定整个系统下一步去哪儿”。遇到未预见的场景时,状态机的 ERROR 状态和回退路径恰恰提供了比自由 Agent 更可靠的兜底,而非更差。
为何常见:人们看到“有限状态机”就联想到“呆板”,却忽略了 Agent 本身是智能体——编排管的是协作骨架,智能藏在每个骨架节点里。
误区我以为 Bernstein 就是业务流程管理(BPM)套壳,工作流引擎早就有了,这不就是旧瓶装新酒吗?
正解传统 BPM 面向的是确定性的、人工定义的流程,参与者是系统和人工任务;而 Bernstein 是为 AI Agent 原生设计的:状态的推进由 Agent 返回的事件驱动,转移条件可以用声明式表达式描述,错误处理内建了重试、回退、熔断等弹性策略,并且支持完整的执行轨迹重放。它把 BPM 的严谨性和 Agent 的灵活性结合了起来,这是传统的流程引擎做不到的。
为何常见:因为“状态机”和“工作流”这些词在软件工程里太常见,难免让人产生“又是老一套”的直觉,忽略了 AI 原生编排带来的本质差异。
误区我以为确定性系统要求每个 Agent 必须一次成功,输出必须完美,否则它就不是“可靠”的。
正解恰恰相反,确定性编排的设计前提就是“Agent 会失败”。它把失败当作一等公民来建模:失败时转入 ERROR 状态,重试、回退、熔断都是针对失败设计的标准路径。“确定性”保证的是失败的处理方式也是可预测的,而不是保证“永不失败”。就像优秀的总谱不仅写好了正确的旋律,也写好了破音之后的补救小节。
为何常见:因为人们习惯把“确定性”等同于“绝对正确”,但工程上的确定性实际是“行为可预期”,包括可预期的失败行为。
误区我听说确定性编排很强,那是不是所有流程都可以全自动跑完,完全不用人参与?
正解生产级的确定性编排恰恰非常重视人类介入。当状态机连续重试失败后转入 ERROR,常见的预案不是无限自动重试,而是升级给人类专家——比如 CANCELLED 状态配合人工工单通知。确定性编排把“需要人工介入”也设计成一个显式状态,而不是让系统闷头重复。人机协同不是编排的对立面,而是编排预案中的一环。
为何常见:因为过度宣传让人以为 AI 编排可以取代一切运维和审核,实际上成熟的工程师会把“人工兜底”当作状态机设计的重要一部分。
面试题
Q1. Bernstein 确定性编排的“确定性”主要指什么?
- A.LLM 必须用零温度采样
- B.工作流执行序列完全可预测← 正确答案
- C.要求每个 Agent 输出一致文本
- D.禁止使用大模型做任何推理
答案:B。确定性编排约束的是工作流结构——状态如何流转、事件如何触发,而不是 LLM 的采样温度或输出文本。A/C 混淆了模型采样与流程确定性的概念,D 更是彻底偏离了 Agent 编排的本意。就像交响乐的确定性在于乐谱固定,而不是要求每位乐手的音色都完全一致。
Q2. 主比喻中,Bernstein 编排引擎相当于乐团的哪个角色?
- A.指挥家负责拿稳总谱← 正确答案
- B.首席小提琴领奏
- C.后台调音师校准
- D.乐器管理员的岗位
答案:A。编排(orchestration)一词本就源自管弦乐团。Bernstein 的核心职责是照总谱(状态机)指挥各 Agent(乐手)按序演奏,对应指挥家。首席小提琴是 Solo 角色、调音师负责音准、管理员管乐器,都不负责流程调度。
Q3. 状态机中表示“任务已成功跑完”的状态是?
- A.CREATED 创建完成
- B.RUNNING 正在执行
- C.COMPLETED 已完成← 正确答案
- D.CANCELLED 已被取消
答案:C。COMPLETED 是终态集合中的成功终态,表示任务按预期轨迹完整执行完毕。CREATED 是初始状态,RUNNING 是执行中,CANCELLED 是被主动终止,三者都不是“成功完成”的标记。
Q4. FSM 五元组 \( M=(Q,\Sigma,\delta,q_0,F) \) 中 \( \delta \) 的含义是什么?
- A.状态转移函数的映射关系← 正确答案
- B.初始状态从此结点开始
- C.接受状态表示任务全部完成
- D.输入符号表示所有外部事件
答案:A。\( \delta: Q \times \Sigma \to Q \) 是状态转移函数,描述“当前状态 + 事件 → 下一个状态”。\( q_0 \) 是初始状态,\( F \) 是终态集合,\( \Sigma \) 是事件集合。B/C/D 分别对应五元组中的其他成员。
Q5. 与非确定性 ReAct Agent 相比,确定性编排的最大优势是?
- A.每次执行轨迹可审计可重放← 正确答案
- B.Agent 内部使用更大的模型
- C.可自动生成更长的提示词
- D.对 GPU 显存的需求大幅降低
答案:A。确定性编排的核心卖点是“执行轨迹可预测、可审计、可重放”,这让生产环境的故障定位和合规审计成为可能。模型大小、提示词长度、显存需求都与编排方式没有必然关系。
Q6. Bernstein 中定义状态转移主要使用什么方式?
- A.声明式表达式 API 来编写规则← 正确答案
- B.在 Agent 内部随机选择下一态
- C.让 LLM 输出决定是否切换状态
- D.依靠人工观察后手动切换状态
答案:A。Bernstein 提供声明式 API(如 aexp、sexp)来定义状态转移规则,属于“写谱”阶段的工作。B 是随机系统,C 是 ReAct 式自由循环的做法,D 是人工编排,都不是引擎的声明式设计。
Q7. 关于确定性编排“可重复性”的准确表述是?
- A.相同输入和历史生成相同轨迹← 正确答案
- B.相同输入总能得到相同 Token
- C.不同模型间输出结果完全一致
- D.运行时间每次始终保持完全相等
答案:A。可重复性指的是执行轨迹一致——相同输入、相同初始状态、相同事件序列,则状态序列必然一致。B 混淆了模型采样与流程轨迹,C 与模型选择无关,D 把性能指标与确定性混为一谈。
Q8. 下列哪种场景更适合非确定性 Agent?
- A.开放创意文案的头脑风暴环节← 正确答案
- B.金融交易审批的多级流转处理
- C.电商订单履约的状态机编排
- D.医疗处方合规审查的流程控制
答案:A。开放性创意任务需要探索和变化,适合 ReAct 式自由 Agent。金融审批、订单履约、医疗合规都需要流程可控、轨迹可审计,这三类场景反而是确定性编排的典型适用对象——就像派对需要即兴,音乐会需要总谱。
Q9. 确定性编排相比自由循环的优势有哪些?
- A.支持审计日志与重放调试← 正确答案
- B.出错时可定位到具体状态← 正确答案
- C.执行轨迹具备稳定可预测性← 正确答案
- D.无需设计和定义状态转移
答案:ABC。A、B、C 都是确定性编排的核心优势——日志审计、状态定位、轨迹可预测。D 恰好说反了:确定性编排要求你在运行前仔细设计状态和转移规则,这正是“总谱”的价值所在。
Q10. 确定性编排中的错误处理手段包括哪些?
- A.状态转移到显式错误结点← 正确答案
- B.指数退避策略进行重试← 正确答案
- C.回退到上一个可靠状态← 正确答案
- D.完全忽略错误继续执行
答案:ABC。显式 ERROR 状态、指数退避重试、回退兜底都是 Bernstein 错误处理的标准手段。D 是典型的反面做法——忽略错误只会让故障扩散,确定性编排的哲学恰恰是把错误作为一等公民显式建模。