很多团队仍然会这样描述一条 AI 管道:
这不是 pipeline,而是跳过难点的捷径。
真正的生产工作流必须在中间回答一连串问题:
所以更好的心智模型不是 “data in, answer out”,而是:
data -> context -> decision -> control -> action -> evidence
如果 control 和 evidence 这两步很弱,甚至缺席,那么这条管道虽然看起来高效,实际上却在悄悄扩大风险面。
更合理的做法,是把每个阶段都当成一个有明确 artifact 的契约,而不是一个模糊的大步骤:
| 阶段 | 主要职责 | 输出 artifact | 一旦边界模糊会出现什么问题 |
|---|---|---|---|
| Ingest | 接收事件、记录、文档或数据流 | 带 source ID 的 event object | 你会基于过期或不完整输入采取行动 |
| Normalize | 把原始输入变成更干净、可处理的形式 | normalized payload | 后续步骤不得不对原始 blob 进行推理 |
| Retrieve | 为任务构造最小必要的 evidence bundle | 带 provenance 的 context bundle | 模型看到的不是噪声就是错误证据 |
| Decide | 提出下一步动作建议 | structured proposal | 模型会越界,或者凭空堆出 confidence |
| Control | 应用 policy、approval 或 confidence gate | allow / block / escalate 决策 | 安全性只靠 prompt 自觉维持 |
| Execute | 执行一个经过批准的动作 | execution result | 弱 action boundary 会制造无法解释的副作用 |
| Audit | 记录发生了什么、为什么发生 | audit event chain | 事故发生后无法重建 |
这种看法有用,是因为它会逼着你回答:每一层到底把什么交给下一层。一旦这个边界被说清楚,调试会容易得多。
当团队说“模型做错了”的时候,底层问题往往更像这样:
这些都是 handoff 问题。
所以,解法通常也不在“再调一轮 prompt”,而在 workflow design 本身。
Anthropic 的 effective context engineering for AI agents 同样强调:关键不只是模型强不强,而是模型在推理时到底看到了哪些信息。对 pipeline 来说,这意味着 retrieval contract 和 context compaction 不是实现细节,而是“可控决策”和“高置信瞎猜”之间的分界线。
一条非常实用的生产规则是:
提出 action 的 step,不应该同时负责最终授权并执行这个 action。
这种分离不一定很重。很多工作流里,一个结构化 proposal 就足够了:
{
"proposal_id": "prop_2198",
"action": "issue_credit",
"reason": "customer qualifies under refund policy",
"confidence": 0.81,
"evidence_bundle_id": "ctx_8842",
"risk_class": "medium"
}
然后由 control layer 决定下一步:
仅仅这一道 seam,就已经能避免很多不必要的损失。同时,operator 看到的也不再是整段 prompt 或 transcript,而是一个可以快速 review 的紧凑对象。
NIST 的 AI Risk Management Framework 也在强调类似原则:真正值得信任的是生命周期控制与治理,而不是模型输出本身的“自我证明”。放到 pipeline 设计里,就是不能把模型自己写出来的文字,当成高风险 action 的唯一控制手段。
只要你的 pipeline 能发送消息、修改记录、触发 job 或变更配置,你就必须明确回答这个问题:
如果同一条 run 被重新播放一次,会发生什么?
一个真正可运维的 state,通常至少要包含:
缺少这些标识符时,一个临时性的 tool failure 就可能在重试时演变成重复 action。
一个示意性的 control loop 可以是这样:
event = ingest()
normalized = normalize(event)
context = retrieve_context(normalized)
proposal = agent.propose(context)
decision = apply_controls(proposal, context)
if decision.status != "approved":
write_audit_log(event, context, proposal, decision)
return decision
result = execute_once(proposal, idempotency_key=proposal["proposal_id"])
write_audit_log(event, context, proposal, result)
return result
这里真正重要的不是代码细节,而是结构本身。workflow 必须清楚区分:哪一部分只是 suggestion,哪一部分是 authorization,哪一部分才是实际改变了外部世界的 action。
很多团队只测 latency 和 failure rate,就觉得自己的管道已经“可观测”了。实际上,那只看到了问题的一半。
你至少需要两种可视性:
只有运行指标时,你最多知道这条管道是快还是慢,但你仍然解释不了它到底安不安全。
你完全可以用相对简单的架构,先做出一个很强的第一版:
trigger:
source: inbound_event
pipeline:
- validate_input
- normalize_payload
- build_context_bundle
- propose_action
- evaluate_policy
- request_approval_if_needed
- execute_one_action
- append_audit_record
controls:
idempotency: required_for_side_effects
policy: runtime_enforced
approvals: risk_based
escalation: on_low_confidence_or_missing_context
这个 blueprint 是故意保守的。而当你的管道开始从“分析”跨向“行动”时,这种保守正是一种优点。
第一阶段的生产目标,不是最大化自动化,而是拿到带有 bounded failure mode 的可靠 action。
很多 AI pipeline workflow 会变脆,是因为 retrieval layer 即兴发挥太多:
如果你想在 ingestion 和 decision-making 之间放一层 governed context layer,puppyone 会很有帮助。尤其是这些场景:
从工程上看,这意味着你不再把 context assembly 当成 retrieval 的即兴副产物,而是把它提升为管道里一个受控 artifact。
用 puppyone 在 agent action 前放好治理后的 contextGet started如果现在已经有东西在跑,优先做这五件事:
这五件事,通常比再打一轮 prompt polish 更能显著提升可靠性。
让同一个 step 同时负责 decision 和 execution,却没有单独的 policy 或 approval boundary。这样一来,原本的 reasoning component 就会变成未经审查的 action surface。
不一定。但所有 AI pipeline 都需要显式控制逻辑。人工 approval 特别适合用于 destructive、external、policy-sensitive 或 low-confidence 的 action。
先记 event ID、evidence bundle ID、暴露出的 tool set、proposed action、control decision 和 final outcome。这就是一条可执行 pipeline 最小可用的 reconstruction trail。