在一家媒体公司,一篇稿件要想见报,必须经过「总编审批」。编辑把初稿写好,送到总编办公室;总编可能直接签字放行,也可能写上修改意见打回。被打回的稿件回到编辑手里重新修改,修改后再送审……直到总编点头,稿件才最终归档发布。这个「送审—打回—再送审」的循环,看似简单,却是 LangGraph 里最强大也最实用的人机协同模式。 LangGraph 把 AI 工作流建模成一张有向图:节点是“编辑干活”,边是“稿件流向”。你可以专门画一个「人工审批节点」,让流程跑到这里就停下来,等一个真实的人拍板;批语如果是不通过,一条「循环边」就把流程送回上游重新处理。这套机制被称为 human-in-the-loop(人在回路)——AI 不再是全程无人驾驶,而是在关键关口请人把关。 这篇文章会把这张「送审图」拆开看:循环边到底是什么、人工审批节点怎么设计、流程怎么暂停等待输入、被打回之后又如何从断点恢复,以及把这些能力串起来时最好的工程实践。读完你会明白,AI 从“一个人闷头干完所有事”走向“人和 AI 打配合”,靠的就是这一圈小小的循环。

岗位关联

学完本节,你将掌握在 LangGraph 中通过循环边实现人机协同的核心套路,能独立设计出带人工审批、暂停恢复的 Agent 工作流——这是生产级 Agent 的标配能力。

目录
  1. 可视化演示
  2. 循环边原理
  3. 人工审批节点
  4. 暂停等待输入
  5. 中断恢复机制
  6. 人机协同最佳实践
  7. 应用场景案例
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示LangGraph循环边(Cycle)实现的人机协同工作流:Agent→人工审批→执行→反馈→循环,含暂停恢复与状态持久化。

本节配有交互动效(进入视口后自动加载,约 3KB)。

循环边人机协同 开始→Agent→人工→审批→执行→反馈→(循环回Agent),人工节点可暂停等待审批 Workflow = Nodes + CycleEdges + HumanPause 循环边实现来回流转,人工审批节点支持暂停恢复

循环边原理

在媒体公司的制度里,“打回修改”不会让人慌乱,因为它是流程设计的一部分,而不是事故。编辑把初稿送到总编室,总编写上“结构太散,重点不突出”打回去,编辑修改后再次送审——这个闭环天天在发生。LangGraph 里的循环边(Cycle Edge),正是程序世界里的这条“打回”箭头。

大多数刚接触流程建模的开发者,习惯把工作流画成一条从上到下的直线:开始 → 起草 → 校对 → 发布。这种图叫有向无环图(DAG),它假设每个步骤只走一次。但真实业务几乎都带着“复查、返工、重试”的迭代属性,DAG 表达不了“再来一遍”。LangGraph 的 StateGraph 允许一条边的终点指向更早的节点甚至自身,于是整个图可以被反复执行,直到某个条件被满足。

在图中,条件边(Conditional Edge)负责决定下一跳:“如果状态里人工审批意见为通过,走向结束;否则回到起草节点。”每次循环都会把节点返回值合并进全局状态,下一次迭代能看到上一轮的产出物和批语。这就让 Agent 能够“根据反馈迭代产出”,和编辑照着批语改稿是同一件事。

所以“循环边”并非不受控的死循环。它像一条有护栏的返工通道:只要你把“出口条件”定义清楚——总编签字即放行——那这条通道就能让 Agent 多次修改,直到达到人类认定的质量线。对任何一个需要人工把关的生产流程,这条打回通道都是不可或缺的骨架。

next(s)={END,if approved(s)=1agent,otherwise\displaystyle \text{next}(s) = \begin{cases} \text{END}, & \text{if } \text{approved}(s)=1 \\ \text{agent}, & \text{otherwise} \end{cases}
这条公式描述循环边背后的路由逻辑:状态 s 中若已标记“审批通过”,下一跳就是终点;否则回到 agent 节点继续循环。
  1. 路由函数定义next(s) 表示给定当前状态 s 时,下一步该进入哪个节点。s 是贯穿全流程的状态字典,里面存着草稿、审批意见等字段。
    next(s)\text{next}(s)
  2. 通过条件判断approved(s) 读取状态里的审批意见是否为“通过”,=1 表示已通过。这是循环唯一合法的出口。
    approved(s)=1\text{approved}(s)=1
  3. 两个分支走向若成立则返回 END 终止;否则返回 agent 节点,触发下一轮起草与送审。
    {END,if approved(s)=1agent,otherwise\begin{cases} \text{END}, & \text{if } \text{approved}(s)=1 \\ \text{agent}, & \text{otherwise}\end{cases}

人工审批节点

总编办公室是整张送审图里唯一一个“非 AI”的节点。没有哪个部门会允许 AI 替总编签字——审批这件事,必须由一个真实的人来做。在 LangGraph 中,用来承接人工决策的这个特殊节点,就叫人工审批节点(Human Approval Node)。它的职责有两件事:把待审批的材料呈现给外部的人,把人的意见接收回来写进状态。

技术上,人工审批节点通常是一个普通的 Python 函数,但函数内部调用了 interrupt()。调用 interrupt(payload) 时,图会停下并把 payload(比如草稿全文和审批问题)作为中断结果返回给调用方。调用方在外部拿到这个 __interrupt__ 后,把内容展示给人类用户;用户给出审批意见后,外部再调用 Command(resume=意见) 把意见投递回图中。此时 interrupt() 会带着这个返回值继续执行,节点把这个值存入状态字段。

这个设计把人从“流程实现”中解耦了出来。审批人不需要理解 StateGraph、不需要写代码,只看一眼材料点个按钮即可。而 Agent 开发者要做的工作,就是定义好状态里存意见的字段,并让审批节点读写它。审批意见写入状态后,下游的条件边才有依据决定是放行还是打回。

在真实代码里,审批节点可能只有几行:把 draft 放进 interrupt(),把返回值 action 存进 state["feedback"]。但就是这枚“人的手印”,让整个 Agent 流程从“无人驾驶”变成了“有主心骨”。总编办公室的意义不在于它有多复杂,而在于签字权交给了人。

ah=interrupt(payload),St+1=St∪{feedback:ah}\displaystyle a_h = \text{interrupt}(\text{payload}), \quad S_{t+1} = S_t \cup \{ \text{feedback}: a_h \}
公式表达人工审批节点的核心动作:用中断抛出待审材料,把获得的人工意见并入状态字典。
  1. 向外部抛出材料interrupt(payload) 的 payload 可以是字典,包含草稿、问题说明等内容,外部调用者会把这个值原样读到。
    interrupt(payload)\text{interrupt}(\text{payload})
  2. 接收人工决策a_h 是人工返回的审批意见(如“通过”或“打回:需补充数据”),它成为 interrupt() 的返回值。
    ah=interrupt(payload)a_h = \text{interrupt}(\text{payload})
  3. 意见并入状态S_{t+1} 是更新后的全局状态,∪ 表示把 feedback 字段合并进去,供后续路由读取。
    St+1=St∪{feedback:ah}S_{t+1} = S_t \cup \{ \text{feedback}: a_h \}

暂停等待输入

还记得稿件被送到总编办公室之后的样子吗?它安静地躺在总编桌上,办公流程不会自己往下推进。没有人会以为流程出了故障——大家知道,审批中的稿件就是该这样“悬停”着,等总编回来处理。LangGraph 的暂停机制把这种“悬停”精确复刻进了程序里。

当图执行到调用 interrupt() 的那一行,执行器会立刻暂停,不再执行后续任何节点。这个暂停不是抛异常、不是崩溃,而是 human-in-the-loop 模式刻意设计的“等待点”。在外部调用端,这次 invoke 或 stream 会正常返回,返回结果里带着 __interrupt__ 字段,里面包含 interrupt() 抛出的 payload。开发者的代码拿到这个字段,就知道:图走到审批点了,该请人拍板了。

值得注意的是,暂停期间整个会话仍然存在于后台状态中,并没有被销毁。LangGraph 的检查点机制在每次节点执行后都会保存一份快照,暂停时的快照就是“稿件躺在桌上”那一刻的完整桌面。即使进程重启、换一台服务器,只要快照还在,这张审批单就不会丢。这也是它和普通 while True: input() 之间最大的区别。

从这个角度看,“暂停等待输入”其实是一种非常优雅的异步协作模式:AI 先干它擅长的前期工作,到了必须由人拍板的关口就主动停下来,既不擅作主张,也不催促打扰。等总编批完了,流程再把后续的活儿接起来——这正是人与人协作中最自然的节奏。

pause:St↦(St, awaiting=1)\displaystyle \text{pause}: S_t \mapsto (S_t,\ \text{awaiting}=1)
这条公式把一次中断视为状态上的一个标记:当前状态 S_t 被保留,同时标上“等待人工输入”的标志。
  1. 当前状态映射pause(S_t) 说明中断只作用于状态自身,不对图上其他节点产生影响——这正是单点挂起的含义。
    St↦(St, awaiting=1)S_t \mapsto (S_t,\ \text{awaiting}=1)
  2. 等待标记置位awaiting=1 表示会话处于等待人工输入的可恢复状态,外部通过该标记感知推送时机。
    awaiting=1\text{awaiting}=1
  3. 状态被原样保留S_t 在中断前后保持不变,草稿、历史消息都完好,等待恢复时继续使用。
    (St, awaiting=1)(S_t,\ \text{awaiting}=1)

中断恢复机制

总编出差一周后回到办公室,看到桌上压着的稿件,提笔签字。流程继续往下走时,没有人会要求编辑把稿子从头再写一遍——总编在意的只是签完字之后往后的环节。LangGraph 的中断恢复机制,刻意设计成“从断点续跑”,而不是“从头重跑”。

恢复的关键在于一个被称为 Checkpointer(检查点器)的组件。它会在图的每次节点执行后,把当时的完整状态存到内存或持久化存储中。当外部用 Command(resume=审批意见) 并携带同一个 thread_id(线程标识)发起恢复时,LangGraph 会先从检查点器里读出该线程最后保存的状态,再从这个状态开始继续执行剩余节点。先前已经完成的节点不会重跑,这即是“断点续跑”。

thread_id 在这里相当于纸质流程单上的流水号。同一份稿件对应同一个流水号,恢复操作拿着流水号就能找到正确的“桌面状态”。如果换成一个新的 thread_id,LangGraph 就认为你在发起一个全新的流程,跟原来的审批单没有任何关系。所以在工程实现中,维护好 thread_id 与业务单据的对应关系,是整个审批系统稳定运转的前提。

正因为有了检查点和 thread_id,“打回重改”才能多次成功落地:第一次打回,Agent 修改后再送审;第二次打回,Agent 再修改;直到某次审批通过走到终点。每一次循环都是基于同一个线程的持续演进,而不是推倒重来。总编不必担心签了字流程还要重跑,开发者也不必为“恢复”写一堆复杂的幂等逻辑。

Sr=Checkpointer.load(thread_id),St→resume(ah)St+k\displaystyle S_r = \text{Checkpointer}.\text{load}(\text{thread\_id}), \quad S_t \xrightarrow{\text{resume}(a_h)} S_{t+k}
恢复机制 = 检查点加载旧状态 + 用人工意见驱动继续执行;公式中的 thread_id 是寻找快照的钥匙。
  1. 读取检查点快照Checkpointer.load(thread_id) 从存储中按线程编号取出最近一次保存的状态 S_r。S_r 里包含草稿、历史消息等全部上下文。
    Checkpointer.load(thread_id)\text{Checkpointer}.\text{load}(\text{thread\_id})
  2. 人工意见注入恢复resume(a_h) 表示用人工审批意见作为输入续跑流程,S_t 是暂停前的状态,箭头代表恢复动作。
    St→resume(ah)St+kS_t \xrightarrow{\text{resume}(a_h)} S_{t+k}
  3. 跳过已执行节点S_{t+k} 表示经过 k 步新执行后的状态,k 是从暂停点往后实际还需要跑的节点数,中间不重复执行暂停前已完成的部分。
    St+kS_{t+k}

人机协同最佳实践

再健全的制度也要防呆。一家公司如果审批流程没有时限、没有记录、任何人都能冒充总编签字,那这套制度很快会形同虚设。LangGraph 的人机协同也一样:仅把循环边和中断节点连起来,还远远不够,工程上需要再套上几层“制度护栏”。

第一层是超时兜底。人工审批可能迟迟不来,若业务要求两小时内必须响应,可在外部编排层加一个定时任务,超时后自动按策略处理(如自动打回、升级通知或默认通过)。第二层是决策留痕。在状态里增加 reviewer 和 reviewed_at 字段,记录审批人身份与时间,让每次人工干预都可追溯。第三层是输入校验。从 interrupt() 拿到的 feedback 是外部传入的自由文本,写入状态前应做合法性校验(如白名单、长度限制),防止下游 Agent 被恶意或异常输入带偏。

这三条“护栏”对应的其实就是工程中常说的一致性、可观测性和健壮性。超时兜底避免流程无限挂起,保证系统在真实业务里“不至于卡死”;决策留痕让每一条被中断修改过的路径都有账可查,方便排查问题和事后审计;输入校验则保证从人这个环节流入的数据是可信的。三者缺了任何一条,循环边人机协同都会在生产环境里埋下隐患。

回到我们的比喻:给媒体公司加制度,不是为了给总编添麻烦,而是为了保障流程在真实现场不失控、不扯皮、不背锅。LangGraph 的工程实践也是同样的道理——循环边把人带进了 AI 工作流,而超时、留痕与校验保证了这个人机协作循环能长期健康地转下去。

deadline=t0+Δt,audit(p,t)=(p,t)\displaystyle \text{deadline}=t_0+\Delta t, \quad \text{audit}(p,t)=(p,t)
公式拆解两条关键实践:超时由发起时间 + 预算时间决定;审计则把审批人和时间戳成对地记录进状态。
  1. 确定超时截止点t0 是审批发起时间,Δt 是允许等待的预算时长,二者相加得到 deadline。外部调度器在超过 deadline 后执行兜底策略。
    deadline=t0+Δt\text{deadline}=t_0+\Delta t
  2. 决策留痕audit(p,t) 把审批人 p 和时间 t 打包成一条审计记录。(p,t) 是二元组,代表“谁在什么时候做的决定”。
    audit(p,t)=(p,t)\text{audit}(p,t)=(p,t)
  3. 两则实践互为独立逗号分隔两个表达式,强调超时兜底和决策留痕是各管一摊的独立配置,可同时启用,也可按业务需要单独调整。
    t0+Δt,(p,t)t_0+\Delta t, \quad (p,t)

应用场景案例

掌握了一套机制之后,你会发现它的适用面非常广。不只是媒体公司的稿件审批,任何“AI 先行产出、人来拍板把关”的流程,都可以照搬这套循环边人机协同模式。它最迷人的地方在于:业务差异只体现在节点内部怎么处理文档,而“打回—重写—再送审”的骨架几乎原封不动。

第一个典型场景是审批流程。在政务和企业的 OA 系统中,用 Agent 自动起草通知、报销单据、合同初稿,紧接着接入一个审批节点让负责人审批;审批不通过就自动打回给 Agent 改,通过后推送档案系统存档。第二个典型场景是内容审核。AIGC 批量生成营销文案或播报脚本时,通过人工终审节点把“生成—发布”的链路切断,保证不合格内容不会未经人眼就流向公众。第三个场景是代码审查。开发助手 Agent 生成提测代码后,先进入评审节点由资深工程师审查,不通过则带着评审意见打回去继续修改,通过才进入合并流程。

这些场景共用同一个模式:一个 Agent 生产节点、一个 interrupt() 审批节点、一条条件边路由“通过/打回”。从产品视角看,这就是“AI 干粗活、人做决策”的人机分工;从技术视角看,它就是一张带循环和断点的状态图。无论业务领域是公文、内容还是代码,图的拓扑结构都能复用,真正需要定制的,只是每个节点内部的领域逻辑。

你会发现,这套公式几乎刻画了所有“审批类 Agent”的共同形态。媒体总编的签字、OA 里的一键驳回、内容平台的合规终审,本质上都是同一个 pass(h(x)) 函数在不同领域的实例。理解了循环边和人工审批节点的组合,你就握住了一张能把“人机协同”落到任何业务里的通用图纸。

W(x)={END(archive),if pass(h(x))loop→agent,otherwise\displaystyle W(x) = \begin{cases} \text{END}(\text{archive}), & \text{if } \text{pass}(h(x)) \\ \text{loop}\to\text{agent}, & \text{otherwise} \end{cases}
这条公式概括了通用工作流的骨架:产出物 x 经人工审核函数 h 判断后,要么归档,要么进入循环让 Agent 重做。
  1. 领域产出物变量 x 是 Agent 生成的产物,比如公文正文、营销文案或一段代码,它在循环中不断被修订。
    W(x)W(x)
  2. 人工审核函数pass(h(x)) 表示审核函数 h 作用于产物,得出是否放行的结论。x 越接近质量线,pass 为真的概率越高。
    pass(h(x))\text{pass}(h(x))
  3. 两种流出方向放行则 END(archive) 归档,否则 loop→agent 进入循环边送回 Agent 重写。
    {END(archive),if pass(h(x))loop→agent,otherwise\begin{cases} \text{END}(\text{archive}), & \text{if } \text{pass}(h(x)) \\ \text{loop}\to\text{agent}, & \text{otherwise} \end{cases}

AI 应用场景

公文审批流

阶段:Agent 起草 + 人工审批 + 循环打回

解决的问题:部门 OA 中通知、请示、合同初稿由 Agent 起草,但完全自动发出有风险。过去人工复制粘贴草稿、再用邮件来回修改,效率低;现在把“打回—修改”沉淀为图上的循环边,让 Agent 和审批人在同一套状态流里来回协作。

具体案例:某政务 OA 接入 LangGraph,Agent 读取会议信息自动生成《会议通知》初稿,进入审批节点由办公室主任审核。不通过则打回并附意见“补充会场联系人”,Agent 自动修订后再次送审,通过后直接归档到办文系统。

内容审核工作流

阶段:AIGC 内容生成 + 人工终审把关

解决的问题:电商运营每天要生成几十条商品文案,如果全交给 LLM 自动发布,存在虚假宣传风险。需要一个“线下的人”审核把关,同时保留人机协同的可追溯性。

具体案例:某 MCN 公司用 LangGraph 部署“文案生成 Agent”,在输出与发布之间增加审核节点。审核员在后台看到草稿,选择“通过”或“打回并附修改建议”。打回后 Agent 按建议修改,循环至通过后再进入发布队列。每次审核人、审核时间、修改意见都记录在状态中,满足审计要求。

Python 演示

python64 行
# -*- coding: utf-8 -*-"""LangGraph 循环边 + 人工审批节点 的完整可运行示例流程: agent 起草 -> review 人工审批 -> 打回收回 / 通过归档"""from typing import TypedDictfrom langgraph.graph import StateGraph, START, ENDfrom langgraph.checkpoint.memory import InMemorySaverfrom langgraph.types import Command, interrupt  class AgentState(TypedDict):    task: str          # 任务说明    draft: str         # 当前草稿    feedback: str      # 人工审批意见  def agent_node(state: AgentState) -> dict:    """Agent 节点: 第一次生成初稿, 之后按意见修订"""    if not state["draft"]:        draft = "[初稿] 关于「%s」的新闻稿已拟好。" % state["task"]    else:        draft = "[二稿] 已按意见「%s」完成修订。" % state["feedback"]    return {"draft": draft, "feedback": ""}  def review_node(state: AgentState) -> dict:    """人工审批节点: 展示草稿并暂停等待人工输入"""    action = interrupt({"draft": state["draft"], "question": "请审批: 通过 / 打回"})    return {"feedback": action}  def route_after_review(state: AgentState) -> str:    """条件边: 通过则走向 END, 否则循环回 agent"""    if state["feedback"] == "通过":        return "end"    return "agent"  # 构建状态图: 含一条「审批打回」的循环边builder = StateGraph(AgentState)builder.add_node("agent", agent_node)builder.add_node("review", review_node)builder.add_edge(START, "agent")builder.add_edge("agent", "review")builder.add_conditional_edges(    "review", route_after_review, {"agent": "agent", "end": END})app = builder.compile(checkpointer=InMemorySaver()) thread = {"configurable": {"thread_id": "review-demo-001"}} if __name__ == "__main__":    # 第一轮: 起草后进入审批节点, 被 interrupt 暂停    snap = app.invoke({"task": "新品发布会", "draft": "", "feedback": ""}, thread)    print("等待审批:", snap["__interrupt__"][0].value)     # 人工打回: 触发循环边, 流程回到 agent 节点重写    snap = app.invoke(Command(resume="打回: 缺少时间地点"), thread)    print("等待二审:", snap["__interrupt__"][0].value)     # 人工通过: 沿条件边走向 END, 流程结束    result = app.invoke(Command(resume="通过"), thread)    print("最终定稿:", result["draft"])
目的:演示一个带人工审批节点的 LangGraph 图——interrupt() 让流程在审批节点暂停,Command(resume=...) 恢复执行,条件边根据审批意见选择打回循环或通过归档。
  1. builder.add_conditional_edges("review", route_after_review, {"agent": "agent", "end": END})给审批节点接上分叉路:意见非“通过”就送回 agent,等于在图上画出一条「打回」循环边。
  2. action = interrupt({"draft": state["draft"], "question": "请审批: 通过 / 打回"})把草稿作为中断载荷抛出,外部拿到 __interrupt__ 后能向用户展示审批材料。
  3. snap["__interrupt__"][0].value读取中断载荷的标准入口,代码据此判断当前处在哪个待审点上。
  4. app.invoke(Command(resume="打回: 缺少时间地点"), thread)用 Command(resume=...) 把人工意见注入图,流程从暂停节点恢复。
  5. builder.compile(checkpointer=InMemorySaver())挂载检查点器,让中断恢复拥有状态快照,是恢复机制的必要底座。
  6. thread = {"configurable": {"thread_id": "review-demo-001"}}线程 ID 相当于流程单编号,同一线程内多次恢复共享同一份快照。

常见误区

误区我调用 `invoke` 时流程突然停下来,还看到 `__interrupt__` 字段,以为它抛异常了,赶紧抓错误、清理现场。

正解interrupt() 是 human-in-the-loop 的刻意暂停点,不是异常。执行器正常返回,外部只需读取 __interrupt__ 里的载荷,等人工输入后调用 Command(resume=...) 恢复。把中断当错误处理,会误杀掉整个审批流程。

为何常见:大多数编程训练里“程序停下 = 异常”,很少见到“流程暂停等人”这种一等公民机制,所以第一反应就是报错。

误区人工审批通过后,我以为要重新调用 `invoke(原始输入)` 把整个流程重新执行,结果发现前面节点又跑了一次,状态还乱套了。

正解LangGraph 的恢复是“从检查点续跑”。只要携带相同的 thread_id 并传入 Command(resume=...),图会从上次中断的节点继续,先前完成的节点不会重跑。重新执行整图既浪费算力,又可能重复产生副作用。

为何常见:普通函数的执行路径是“从头到尾”,没有“暂停在哪就接着跑”的概念,所以很容易想成重新调用。

误区既然 Agent 这么能打,直接让 LLM 自己读草稿、自己判断通过还是不通过,不就行了吗?还省了开发审批节点。

正解那就不叫 human-in-the-loop 了。人工审批存在的意义恰恰是引入一个不受 AI 幻觉影响的决策权威。审批节点必须借助 interrupt() 把材料交给真实的人,让人的意见成为状态的组成部分。用 LLM 自评,等于把把关权又交还给了模型。

为何常见:Agent 开发者习惯“一切判断交给模型”,忽略了合规、责任归属等真实业务中必须由人来拍的板。

误区看到图上有边指回之前的节点,我立刻担心 Agent 会无限次重新起草,于是尽量不用循环边,所有流程都设计成一条直线。

正解循环边配上条件终止判断就是可控迭代,比如“通过 → END、打回 → agent”。真正无限循环的根因是出口条件没写对或状态没更新,与循环边本身无关。编辑改稿也不会无限修改——总编总有签字放行的那一天。

为何常见:经典编程里 while True 缺少 break 的恐惧感被平移到了图中,却没有看到条件边天然扮演着 break 的角色。

误区我想实现人机协同,就写一个 `while True: input()` 去轮询等待人工输入,再把结果塞给 LLM 重跑一次。

正解直接在业务层写 while 循环,等于放弃了检查点、恢复、线程隔离这些核心能力。LangGraph 的中断恢复是图执行器层面的原语,中断时全图暂停、恢复时自动续跑,并且天然支持多线程会话并存。这才叫把人机协同做成了可维护的工程结构。

为何常见:CLI 时代处理交互输入的习惯是“轮询等待”,很难意识到异步、可恢复、多会话这些状态图模型带来的额外价值。

面试题

Q1. LangGraph 中循环边的核心价值是什么?

单选题 · easy

  • A.让整个流程自动跳过错
  • B.允许流程做打回重试← 正确答案
  • C.可以直接省去结束节点
  • D.并行执行多个业务任务

答案:B。循环边让流程可以回到之前的节点形成回路,本质是“打回重做”能力。A 是跳过并非循环;C 选项错误,任何图仍然需要明确的终点;并行执行靠的是并行分支而不是循环边。

Q2. interrupt() 在人工审批节点中的作用是?

单选题 · easy

  • A.暂停图并抛出审批材料← 正确答案
  • B.删除流程的全部历史记录
  • C.让流程跳过人工审批环节
  • D.替代 LLM 完成自动决策

答案:A。interrupt() 是 human-in-the-loop 的挂起点:它把待审批的材料作为 __interrupt__ 载荷抛给外部,同时让图暂停执行。其他选项都违背了“等人审批”的设计意图。

Q3. 恢复中断的图执行,正确方法是?

单选题 · mid

  • A.用新的线程编号重新调用
  • B.使用同一个线程加续跑指令← 正确答案
  • C.传入原始输入再次完整执行
  • D.重建图表后从头执行一次

答案:B。恢复必须用同一个 thread_id 配合 Command(resume=...),让检查点器找到快照并从断点续跑。换新线程等于开新流程;重新从头执行则违背了中断恢复的初衷。

Q4. 中断时流程的状态存放在哪里?

单选题 · mid

  • A.直接缓存在操作系统的内存
  • B.由检查点器保存成状态快照← 正确答案
  • C.由人工审批节点本地备份
  • D.中断之后状态自动清空

答案:B。Checkpointer(检查点器)在节点执行后保存完整状态快照,中断暂停时这张快照就代表“稿件躺在桌上”的现场。A 依赖 OS 无关;C 是误解,审批节点不负责持久化;D 会让恢复无从谈起。

Q5. 实现“打回重写”的循环需要哪些要素?

多选题 · mid

  • A.一条从审批回到生产的边← 正确答案
  • B.一个读取审批意见的条件← 正确答案
  • C.完全隐藏审批过程的记录
  • D.状态中保存每次审批结果← 正确答案

答案:ABD。打回循环至少需要三样:循环边把流程送回 Agent、条件边读取审批意见决定去向、状态字段保存审批结果。C 恰恰是反面做法——隐藏审批记录会损害可审计性。

Q6. 人工审批意见打回后应由谁处理?

单选题 · mid

  • A.交给下游归档节点存档
  • B.交给上游 Agent 节点重写← 正确答案
  • C.交给条件边自行丢弃
  • D.交给中断机制直接忽略

答案:B。打回意味着产出物不达标,应当把批语作为反馈交给上游 Agent 节点重新生成。直接归档、丢弃或忽略都会让打回失去意义,流程也无法形成有效的迭代闭环。

Q7. 人机协同工程中哪些做法正确?

多选题 · hard

  • A.为审批设置超时兜底策略← 正确答案
  • B.记录审批人身份与时间← 正确答案
  • C.对人工输入不加任何校验
  • D.用线程编号隔离多个会话← 正确答案

答案:ABD。超时兜底防止流程无限挂起,决策留痕满足审计要求,thread_id 隔离多个审批会话保证互不干扰。C 是危险做法,外部输入不校验容易污染下游 Agent 的状态。

Q8. 关于 thread_id 说法正确的是?

单选题 · hard

  • A.每个流程运行使用不同编号
  • B.用于定位检查点上的会话← 正确答案
  • C.决定节点内部算法逻辑
  • D.代替人工审批意见使用

答案:B。thread_id 是恢复时的定位钥匙:检查点器按它找到对应会话的快照,从而续跑同一份流程任务。它不参与算法逻辑,也不能替代审批意见,正确选项是 B。

Q9. human-in-the-loop 中最关键的设计是什么?

单选题 · hard

  • A.让人类参与关键决策← 正确答案
  • B.把循环次数降到最低
  • C.让 LLM 更快生成内容
  • D.省掉所有人工确认环节

答案:A。人在回路的本质就是把关键决策权留给人类,AI 负责前期产出和后续执行。降低循环次数、提升生成速度是优化目标但非本质;省掉人工确认等于完全去掉了“人”这个环节。

Q10. 下列哪些场景适合使用循环边人机协同?

多选题 · hard

  • A.人工审批合同初稿← 正确答案
  • B.自动内容流程终审← 正确答案
  • C.安全人员代码审查← 正确答案
  • D.完全自动的定时任务

答案:ABC。合同审批、内容终审、代码审查都属于“AI 产出、人工把关”的典型场景,非常适合循环边打回机制。D 是完全自动化流程,不需要人类介入,也就用不上 human-in-the-loop。