Agent 架构师与传统架构师的设计对象不同。后者的产出是服务边界和接口契约;前者的产出是Agent 拓扑、委派边界与信任层级,其关键判断从“哪些服务需要分离”变为“哪些任务可以交给概率性规划,哪些必须由确定性代码强制”。企业级 Agent 的失败很少因为模型不够强,而是因为架构师没有在概率性智能外面钉下足够多的确定性支点。
自由 ReAct 循环的根本缺陷是不可恢复:while not finished 的中间状态随进程消失。LangGraph 的 checkpointer 提供了可复用的模式:每一步将图状态持久化为 checkpoint,用 thread_id 标识一次执行,中断或崩溃后从精确断点恢复,而不是重新推理。生产环境必须使用持久化后端——InMemorySaver 在进程重启后丢失一切,PostgresSaver 才是可用的执行契约。
from langgraph.checkpoint.postgres import PostgresSaver
from langgraph.types import interrupt, Command
def approval_node(state: RunState):
decision = interrupt({"order_id": state["order_id"],
"trace": state["trace"]}) # 完整上下文随暂停保留
return {"approved": decision["approved"]}
with PostgresSaver.from_conn_string(DB_URL) as saver:
graph = builder.compile(checkpointer=saver)
config = {"configurable": {"thread_id": f"order-{oid}"}}
graph.invoke({"order_id": oid}, config) # 执行至审批节点暂停
graph.invoke(Command(resume={"approved": True}), config) # 审批后精确续跑架构师在这里的决策不是“用不用 checkpointer”,而是哪些节点是合法的暂停点。审批、人工复核、高风险转账必须设计为 interrupt 节点,模型无权绕过;而纯查询类步骤不应引入不必要的暂停开销。状态机负责流程边界,节点内部的 LLM 继续自由规划——确定性的骨架,包住概率性的智能。
提示词和 System Message 不是权限边界。企业级架构必须在每一次工具调用之前放置策略执行点(PEP),由独立的策略决策点(PDP) 做出确定性裁决。PDP 的关键设计是默认拒绝:未匹配任何规则时落到 ask 而非 allow,同时维护会话污点——一旦读取过不可信内容,后续外向操作自动升级或拒绝,阻断“只读工具 + 外发工具”的组合攻击链。
class PolicyEngine: # PDP:策略即数据,可热加载
def evaluate(self, tool, params, ctx):
hits = [r for r in self.rules if r.matches(tool, params, ctx)]
verdict = max(hits, key=lambda r: _RANK[r.decision]).decision if hits else self.default
if ctx.get("session_tainted") and ctx.get("tool_is_egress") and verdict != "deny":
return Decision("deny", "会话已读取不可信数据,外向操作被信息流策略拒绝")
return Decision(verdict)
class PolicyPEP: # PEP:执行点,失败关闭
def pre_tool_use(self, name, params, ctx):
d = self.pdp.evaluate(name, params, ctx)
if d.verdict == "allow": return HookDecision("allow")
if d.verdict == "deny": return HookDecision("deny", reason=d.reason)
approved = self.confirmer.ask(intent=ctx["intent"],
operation=render(name, params), impact=ctx["effect"],
timeout_seconds=600)
return HookDecision("allow") if approved else HookDecision("deny")default 显式声明而非隐式放行,session_tainted 在会话层面阻断逐工具合规但组合危险的路径,超时驳回走 fail-closed。PEP 放在模型外部,策略变更一次生效,整个 Agent 舰队立即继承。
传统软件有编译期检查和单元测试作为安全网,Agent 什么都没有:改一行 prompt,影响的是整条轨迹。Agent 输出不确定,“断言输出等于期望”不适用,因此评估必须是轨迹基线而非答案比对。Golden Dataset 的三要素缺一不可:输入、期望轨迹(调用了哪些工具、顺序如何)、期望输出。只测答案会放过“该拦住却发了”的轨迹错误,只测轨迹会放过“收件人搞错”的事实错误。
def gate(results, baseline, threshold=0.90):
passed = sum(1 for r in results if r.trajectory_matches(baseline)
and r.output_covers(baseline))
rate = passed / len(baseline)
if rate < threshold:
raise SystemExit(f"gate failed: {rate:.1%} < {threshold:.0%}") # 阻断合并门禁的价值不在阈值本身,而在于每一次生产失败都转化为一条 golden case,回归套件随事故增长而增厚。没有这条闭环,Agent 的迭代只是盲目的版本滚动。
三个支点指向同一原则:架构师不替模型做决策,而是让决策的边界不可绕过、状态不可丢失、退化不可静默发布。Checkpoint 守住执行连续性,PEP 守住权限边界,评估门禁守住演进方向。缺任何一层,企业级 Agent 都只是“能演示”,而非“敢托管”。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。