在一家媒体公司,一篇稿件要想见报,必须经过「总编审批」。编辑把初稿写好,送到总编办公室;总编可能直接签字放行,也可能写上修改意见打回。被打回的稿件回到编辑手里重新修改,修改后再送审……直到总编点头,稿件才最终归档发布。这个「送审—打回—再送审」的循环,看似简单,却是 LangGraph 里最强大也最实用的人机协同模式。 LangGraph 把 AI 工作流建模成一张有向图:节点是“编辑干活”,边是“稿件流向”。你可以专门画一个「人工审批节点」,让流程跑到这里就停下来,等一个真实的人拍板;批语如果是不通过,一条「循环边」就把流程送回上游重新处理。这套机制被称为 human-in-the-loop(人在回路)——AI 不再是全程无人驾驶,而是在关键关口请人把关。 这篇文章会把这张「送审图」拆开看:循环边到底是什么、人工审批节点怎么设计、流程怎么暂停等待输入、被打回之后又如何从断点恢复,以及把这些能力串起来时最好的工程实践。读完你会明白,AI 从“一个人闷头干完所有事”走向“人和 AI 打配合”,靠的就是这一圈小小的循环。
学完本节,你将掌握在 LangGraph 中通过循环边实现人机协同的核心套路,能独立设计出带人工审批、暂停恢复的 Agent 工作流——这是生产级 Agent 的标配能力。
可视化演示
展示LangGraph循环边(Cycle)实现的人机协同工作流:Agent→人工审批→执行→反馈→循环,含暂停恢复与状态持久化。
本节配有交互动效(进入视口后自动加载,约 3KB)。
循环边人机协同 开始→Agent→人工→审批→执行→反馈→(循环回Agent),人工节点可暂停等待审批 Workflow = Nodes + CycleEdges + HumanPause 循环边实现来回流转,人工审批节点支持暂停恢复
循环边原理
在媒体公司的制度里,“打回修改”不会让人慌乱,因为它是流程设计的一部分,而不是事故。编辑把初稿送到总编室,总编写上“结构太散,重点不突出”打回去,编辑修改后再次送审——这个闭环天天在发生。LangGraph 里的循环边(Cycle Edge),正是程序世界里的这条“打回”箭头。
大多数刚接触流程建模的开发者,习惯把工作流画成一条从上到下的直线:开始 → 起草 → 校对 → 发布。这种图叫有向无环图(DAG),它假设每个步骤只走一次。但真实业务几乎都带着“复查、返工、重试”的迭代属性,DAG 表达不了“再来一遍”。LangGraph 的 StateGraph 允许一条边的终点指向更早的节点甚至自身,于是整个图可以被反复执行,直到某个条件被满足。
在图中,条件边(Conditional Edge)负责决定下一跳:“如果状态里人工审批意见为通过,走向结束;否则回到起草节点。”每次循环都会把节点返回值合并进全局状态,下一次迭代能看到上一轮的产出物和批语。这就让 Agent 能够“根据反馈迭代产出”,和编辑照着批语改稿是同一件事。
所以“循环边”并非不受控的死循环。它像一条有护栏的返工通道:只要你把“出口条件”定义清楚——总编签字即放行——那这条通道就能让 Agent 多次修改,直到达到人类认定的质量线。对任何一个需要人工把关的生产流程,这条打回通道都是不可或缺的骨架。
s 中若已标记“审批通过”,下一跳就是终点;否则回到 agent 节点继续循环。- 路由函数定义
next(s)表示给定当前状态s时,下一步该进入哪个节点。s是贯穿全流程的状态字典,里面存着草稿、审批意见等字段。 - 通过条件判断
approved(s)读取状态里的审批意见是否为“通过”,=1表示已通过。这是循环唯一合法的出口。 - 两个分支走向若成立则返回
END终止;否则返回agent节点,触发下一轮起草与送审。
人工审批节点
总编办公室是整张送审图里唯一一个“非 AI”的节点。没有哪个部门会允许 AI 替总编签字——审批这件事,必须由一个真实的人来做。在 LangGraph 中,用来承接人工决策的这个特殊节点,就叫人工审批节点(Human Approval Node)。它的职责有两件事:把待审批的材料呈现给外部的人,把人的意见接收回来写进状态。
技术上,人工审批节点通常是一个普通的 Python 函数,但函数内部调用了 interrupt()。调用 interrupt(payload) 时,图会停下并把 payload(比如草稿全文和审批问题)作为中断结果返回给调用方。调用方在外部拿到这个 __interrupt__ 后,把内容展示给人类用户;用户给出审批意见后,外部再调用 Command(resume=意见) 把意见投递回图中。此时 interrupt() 会带着这个返回值继续执行,节点把这个值存入状态字段。
这个设计把人从“流程实现”中解耦了出来。审批人不需要理解 StateGraph、不需要写代码,只看一眼材料点个按钮即可。而 Agent 开发者要做的工作,就是定义好状态里存意见的字段,并让审批节点读写它。审批意见写入状态后,下游的条件边才有依据决定是放行还是打回。
在真实代码里,审批节点可能只有几行:把 draft 放进 interrupt(),把返回值 action 存进 state["feedback"]。但就是这枚“人的手印”,让整个 Agent 流程从“无人驾驶”变成了“有主心骨”。总编办公室的意义不在于它有多复杂,而在于签字权交给了人。
- 向外部抛出材料
interrupt(payload)的payload可以是字典,包含草稿、问题说明等内容,外部调用者会把这个值原样读到。 - 接收人工决策
a_h是人工返回的审批意见(如“通过”或“打回:需补充数据”),它成为interrupt()的返回值。 - 意见并入状态
S_{t+1}是更新后的全局状态,∪表示把feedback字段合并进去,供后续路由读取。
暂停等待输入
还记得稿件被送到总编办公室之后的样子吗?它安静地躺在总编桌上,办公流程不会自己往下推进。没有人会以为流程出了故障——大家知道,审批中的稿件就是该这样“悬停”着,等总编回来处理。LangGraph 的暂停机制把这种“悬停”精确复刻进了程序里。
当图执行到调用 interrupt() 的那一行,执行器会立刻暂停,不再执行后续任何节点。这个暂停不是抛异常、不是崩溃,而是 human-in-the-loop 模式刻意设计的“等待点”。在外部调用端,这次 invoke 或 stream 会正常返回,返回结果里带着 __interrupt__ 字段,里面包含 interrupt() 抛出的 payload。开发者的代码拿到这个字段,就知道:图走到审批点了,该请人拍板了。
值得注意的是,暂停期间整个会话仍然存在于后台状态中,并没有被销毁。LangGraph 的检查点机制在每次节点执行后都会保存一份快照,暂停时的快照就是“稿件躺在桌上”那一刻的完整桌面。即使进程重启、换一台服务器,只要快照还在,这张审批单就不会丢。这也是它和普通 while True: input() 之间最大的区别。
从这个角度看,“暂停等待输入”其实是一种非常优雅的异步协作模式:AI 先干它擅长的前期工作,到了必须由人拍板的关口就主动停下来,既不擅作主张,也不催促打扰。等总编批完了,流程再把后续的活儿接起来——这正是人与人协作中最自然的节奏。
S_t 被保留,同时标上“等待人工输入”的标志。- 当前状态映射
pause(S_t)说明中断只作用于状态自身,不对图上其他节点产生影响——这正是单点挂起的含义。 - 等待标记置位
awaiting=1表示会话处于等待人工输入的可恢复状态,外部通过该标记感知推送时机。 - 状态被原样保留
S_t在中断前后保持不变,草稿、历史消息都完好,等待恢复时继续使用。
中断恢复机制
总编出差一周后回到办公室,看到桌上压着的稿件,提笔签字。流程继续往下走时,没有人会要求编辑把稿子从头再写一遍——总编在意的只是签完字之后往后的环节。LangGraph 的中断恢复机制,刻意设计成“从断点续跑”,而不是“从头重跑”。
恢复的关键在于一个被称为 Checkpointer(检查点器)的组件。它会在图的每次节点执行后,把当时的完整状态存到内存或持久化存储中。当外部用 Command(resume=审批意见) 并携带同一个 thread_id(线程标识)发起恢复时,LangGraph 会先从检查点器里读出该线程最后保存的状态,再从这个状态开始继续执行剩余节点。先前已经完成的节点不会重跑,这即是“断点续跑”。
thread_id 在这里相当于纸质流程单上的流水号。同一份稿件对应同一个流水号,恢复操作拿着流水号就能找到正确的“桌面状态”。如果换成一个新的 thread_id,LangGraph 就认为你在发起一个全新的流程,跟原来的审批单没有任何关系。所以在工程实现中,维护好 thread_id 与业务单据的对应关系,是整个审批系统稳定运转的前提。
正因为有了检查点和 thread_id,“打回重改”才能多次成功落地:第一次打回,Agent 修改后再送审;第二次打回,Agent 再修改;直到某次审批通过走到终点。每一次循环都是基于同一个线程的持续演进,而不是推倒重来。总编不必担心签了字流程还要重跑,开发者也不必为“恢复”写一堆复杂的幂等逻辑。
thread_id 是寻找快照的钥匙。- 读取检查点快照
Checkpointer.load(thread_id)从存储中按线程编号取出最近一次保存的状态S_r。S_r里包含草稿、历史消息等全部上下文。 - 人工意见注入恢复
resume(a_h)表示用人工审批意见作为输入续跑流程,S_t是暂停前的状态,箭头代表恢复动作。 - 跳过已执行节点
S_{t+k}表示经过k步新执行后的状态,k是从暂停点往后实际还需要跑的节点数,中间不重复执行暂停前已完成的部分。
人机协同最佳实践
再健全的制度也要防呆。一家公司如果审批流程没有时限、没有记录、任何人都能冒充总编签字,那这套制度很快会形同虚设。LangGraph 的人机协同也一样:仅把循环边和中断节点连起来,还远远不够,工程上需要再套上几层“制度护栏”。
第一层是超时兜底。人工审批可能迟迟不来,若业务要求两小时内必须响应,可在外部编排层加一个定时任务,超时后自动按策略处理(如自动打回、升级通知或默认通过)。第二层是决策留痕。在状态里增加 reviewer 和 reviewed_at 字段,记录审批人身份与时间,让每次人工干预都可追溯。第三层是输入校验。从 interrupt() 拿到的 feedback 是外部传入的自由文本,写入状态前应做合法性校验(如白名单、长度限制),防止下游 Agent 被恶意或异常输入带偏。
这三条“护栏”对应的其实就是工程中常说的一致性、可观测性和健壮性。超时兜底避免流程无限挂起,保证系统在真实业务里“不至于卡死”;决策留痕让每一条被中断修改过的路径都有账可查,方便排查问题和事后审计;输入校验则保证从人这个环节流入的数据是可信的。三者缺了任何一条,循环边人机协同都会在生产环境里埋下隐患。
回到我们的比喻:给媒体公司加制度,不是为了给总编添麻烦,而是为了保障流程在真实现场不失控、不扯皮、不背锅。LangGraph 的工程实践也是同样的道理——循环边把人带进了 AI 工作流,而超时、留痕与校验保证了这个人机协作循环能长期健康地转下去。
- 确定超时截止点
t0是审批发起时间,Δt是允许等待的预算时长,二者相加得到deadline。外部调度器在超过deadline后执行兜底策略。 - 决策留痕
audit(p,t)把审批人p和时间t打包成一条审计记录。(p,t)是二元组,代表“谁在什么时候做的决定”。 - 两则实践互为独立逗号分隔两个表达式,强调超时兜底和决策留痕是各管一摊的独立配置,可同时启用,也可按业务需要单独调整。
应用场景案例
掌握了一套机制之后,你会发现它的适用面非常广。不只是媒体公司的稿件审批,任何“AI 先行产出、人来拍板把关”的流程,都可以照搬这套循环边人机协同模式。它最迷人的地方在于:业务差异只体现在节点内部怎么处理文档,而“打回—重写—再送审”的骨架几乎原封不动。
第一个典型场景是审批流程。在政务和企业的 OA 系统中,用 Agent 自动起草通知、报销单据、合同初稿,紧接着接入一个审批节点让负责人审批;审批不通过就自动打回给 Agent 改,通过后推送档案系统存档。第二个典型场景是内容审核。AIGC 批量生成营销文案或播报脚本时,通过人工终审节点把“生成—发布”的链路切断,保证不合格内容不会未经人眼就流向公众。第三个场景是代码审查。开发助手 Agent 生成提测代码后,先进入评审节点由资深工程师审查,不通过则带着评审意见打回去继续修改,通过才进入合并流程。
这些场景共用同一个模式:一个 Agent 生产节点、一个 interrupt() 审批节点、一条条件边路由“通过/打回”。从产品视角看,这就是“AI 干粗活、人做决策”的人机分工;从技术视角看,它就是一张带循环和断点的状态图。无论业务领域是公文、内容还是代码,图的拓扑结构都能复用,真正需要定制的,只是每个节点内部的领域逻辑。
你会发现,这套公式几乎刻画了所有“审批类 Agent”的共同形态。媒体总编的签字、OA 里的一键驳回、内容平台的合规终审,本质上都是同一个 pass(h(x)) 函数在不同领域的实例。理解了循环边和人工审批节点的组合,你就握住了一张能把“人机协同”落到任何业务里的通用图纸。
x 经人工审核函数 h 判断后,要么归档,要么进入循环让 Agent 重做。- 领域产出物变量
x是 Agent 生成的产物,比如公文正文、营销文案或一段代码,它在循环中不断被修订。 - 人工审核函数
pass(h(x))表示审核函数h作用于产物,得出是否放行的结论。x越接近质量线,pass为真的概率越高。 - 两种流出方向放行则
END(archive)归档,否则loop→agent进入循环边送回 Agent 重写。
AI 应用场景
公文审批流
阶段:Agent 起草 + 人工审批 + 循环打回
解决的问题:部门 OA 中通知、请示、合同初稿由 Agent 起草,但完全自动发出有风险。过去人工复制粘贴草稿、再用邮件来回修改,效率低;现在把“打回—修改”沉淀为图上的循环边,让 Agent 和审批人在同一套状态流里来回协作。
具体案例:某政务 OA 接入 LangGraph,Agent 读取会议信息自动生成《会议通知》初稿,进入审批节点由办公室主任审核。不通过则打回并附意见“补充会场联系人”,Agent 自动修订后再次送审,通过后直接归档到办文系统。
内容审核工作流
阶段:AIGC 内容生成 + 人工终审把关
解决的问题:电商运营每天要生成几十条商品文案,如果全交给 LLM 自动发布,存在虚假宣传风险。需要一个“线下的人”审核把关,同时保留人机协同的可追溯性。
具体案例:某 MCN 公司用 LangGraph 部署“文案生成 Agent”,在输出与发布之间增加审核节点。审核员在后台看到草稿,选择“通过”或“打回并附修改建议”。打回后 Agent 按建议修改,循环至通过后再进入发布队列。每次审核人、审核时间、修改意见都记录在状态中,满足审计要求。
Python 演示
# -*- 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"])
interrupt() 让流程在审批节点暂停,Command(resume=...) 恢复执行,条件边根据审批意见选择打回循环或通过归档。builder.add_conditional_edges("review", route_after_review, {"agent": "agent", "end": END})给审批节点接上分叉路:意见非“通过”就送回 agent,等于在图上画出一条「打回」循环边。action = interrupt({"draft": state["draft"], "question": "请审批: 通过 / 打回"})把草稿作为中断载荷抛出,外部拿到__interrupt__后能向用户展示审批材料。snap["__interrupt__"][0].value读取中断载荷的标准入口,代码据此判断当前处在哪个待审点上。app.invoke(Command(resume="打回: 缺少时间地点"), thread)用Command(resume=...)把人工意见注入图,流程从暂停节点恢复。builder.compile(checkpointer=InMemorySaver())挂载检查点器,让中断恢复拥有状态快照,是恢复机制的必要底座。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 中循环边的核心价值是什么?
- A.让整个流程自动跳过错
- B.允许流程做打回重试← 正确答案
- C.可以直接省去结束节点
- D.并行执行多个业务任务
答案:B。循环边让流程可以回到之前的节点形成回路,本质是“打回重做”能力。A 是跳过并非循环;C 选项错误,任何图仍然需要明确的终点;并行执行靠的是并行分支而不是循环边。
Q2. interrupt() 在人工审批节点中的作用是?
- A.暂停图并抛出审批材料← 正确答案
- B.删除流程的全部历史记录
- C.让流程跳过人工审批环节
- D.替代 LLM 完成自动决策
答案:A。interrupt() 是 human-in-the-loop 的挂起点:它把待审批的材料作为 __interrupt__ 载荷抛给外部,同时让图暂停执行。其他选项都违背了“等人审批”的设计意图。
Q3. 恢复中断的图执行,正确方法是?
- A.用新的线程编号重新调用
- B.使用同一个线程加续跑指令← 正确答案
- C.传入原始输入再次完整执行
- D.重建图表后从头执行一次
答案:B。恢复必须用同一个 thread_id 配合 Command(resume=...),让检查点器找到快照并从断点续跑。换新线程等于开新流程;重新从头执行则违背了中断恢复的初衷。
Q4. 中断时流程的状态存放在哪里?
- A.直接缓存在操作系统的内存
- B.由检查点器保存成状态快照← 正确答案
- C.由人工审批节点本地备份
- D.中断之后状态自动清空
答案:B。Checkpointer(检查点器)在节点执行后保存完整状态快照,中断暂停时这张快照就代表“稿件躺在桌上”的现场。A 依赖 OS 无关;C 是误解,审批节点不负责持久化;D 会让恢复无从谈起。
Q5. 实现“打回重写”的循环需要哪些要素?
- A.一条从审批回到生产的边← 正确答案
- B.一个读取审批意见的条件← 正确答案
- C.完全隐藏审批过程的记录
- D.状态中保存每次审批结果← 正确答案
答案:ABD。打回循环至少需要三样:循环边把流程送回 Agent、条件边读取审批意见决定去向、状态字段保存审批结果。C 恰恰是反面做法——隐藏审批记录会损害可审计性。
Q6. 人工审批意见打回后应由谁处理?
- A.交给下游归档节点存档
- B.交给上游 Agent 节点重写← 正确答案
- C.交给条件边自行丢弃
- D.交给中断机制直接忽略
答案:B。打回意味着产出物不达标,应当把批语作为反馈交给上游 Agent 节点重新生成。直接归档、丢弃或忽略都会让打回失去意义,流程也无法形成有效的迭代闭环。
Q7. 人机协同工程中哪些做法正确?
- A.为审批设置超时兜底策略← 正确答案
- B.记录审批人身份与时间← 正确答案
- C.对人工输入不加任何校验
- D.用线程编号隔离多个会话← 正确答案
答案:ABD。超时兜底防止流程无限挂起,决策留痕满足审计要求,thread_id 隔离多个审批会话保证互不干扰。C 是危险做法,外部输入不校验容易污染下游 Agent 的状态。
Q8. 关于 thread_id 说法正确的是?
- A.每个流程运行使用不同编号
- B.用于定位检查点上的会话← 正确答案
- C.决定节点内部算法逻辑
- D.代替人工审批意见使用
答案:B。thread_id 是恢复时的定位钥匙:检查点器按它找到对应会话的快照,从而续跑同一份流程任务。它不参与算法逻辑,也不能替代审批意见,正确选项是 B。
Q9. human-in-the-loop 中最关键的设计是什么?
- A.让人类参与关键决策← 正确答案
- B.把循环次数降到最低
- C.让 LLM 更快生成内容
- D.省掉所有人工确认环节
答案:A。人在回路的本质就是把关键决策权留给人类,AI 负责前期产出和后续执行。降低循环次数、提升生成速度是优化目标但非本质;省掉人工确认等于完全去掉了“人”这个环节。
Q10. 下列哪些场景适合使用循环边人机协同?
- A.人工审批合同初稿← 正确答案
- B.自动内容流程终审← 正确答案
- C.安全人员代码审查← 正确答案
- D.完全自动的定时任务
答案:ABC。合同审批、内容终审、代码审查都属于“AI 产出、人工把关”的典型场景,非常适合循环边打回机制。D 是完全自动化流程,不需要人类介入,也就用不上 human-in-the-loop。