最近在技术社区里,大家讨论 AI 的方式正在悄悄变化。前几年更多是惊喜,是“居然能写成这样”的感叹;今年开始,很多讨论变得不安起来,尤其当各家产品都开始强调“无感”“流畅”“替你完成”的时候。我听到一个相当有代表性的说法:AI 正在带我们走上一条无摩擦的高速路,而路的尽头可能不是一个更好的工作流,而是一堆看不见的坑。
这个说法有点极端,但它戳中了一个真实痛点。作为长期做 AI 应用开发、日常也和不少 Agent 项目打交道的工程师,我越来越确信一个判断:当工具的摩擦越少,使用者的警觉就越容易下降;当流程变得极度顺滑,我们真正需要担心的不是 AI 不够强,而是人在关键节点上放弃了判断。这篇文章不打算写“AI 威胁论”,而是想从一个更实际的角度聊聊:为什么无摩擦的 AI 流程会让工程失控,以及我们如何用制度、技术和设计,主动保留那些必要的“摩擦力”。
1. 先搞清楚一个事实:你要防的不是 AI,而是过度顺滑
在展开之前,先给文章定一个基调。我并不是 AI 保守派。我日常会用 AI 编程助手写代码、用 Agent 处理批量分析任务、也让大模型参与文档生成和代码 review,这里面有大量“真香”场景。但我观察到一个非常典型的心态变化:使用工具越顺手,就越不愿意再检查工具的输出。
这不是某个人的问题,而是交互设计带来的必然结果。当一个系统把输入到输出的延迟降到极低、把界面做得极其友好、把上下文自动补全做得足够聪明时,人的注意力会自然放松。你不再去想“这个函数签名对不对”,而是默认“它应该知道我要什么”。你不再去验证生成代码的边界条件,而是直接跑到测试用例里找 Bug。
1.1 无摩擦不是工程问题,而是认知问题
无摩擦的本质是什么?是系统替你承担了中间步骤。传统软件开发中,从需求到代码,中间隔着设计文档、接口定义、代码评审、测试计划。每一步都有“人必须停下来看一眼”的节点,这些节点很繁琐,但它们是安全网。而现在的 AI 编程工具,把“写代码”这个动作压缩成了一个回车。
一个很典型的例子是生成测试。很多人让 AI 先写业务代码,再让 AI 根据业务代码生成测试用例。表面上看,流程非常顺滑,代码覆盖率也不错。但仔细看测试内容,会发现它只是在验证 AI 自己写的逻辑,而不是验证需求本身。因为人和系统之间缺了一个“停下来确认业务预期”的环节,所以 AI 生成的测试往往只是在自我重复。
这个现象放在 Agent 场景里更明显。当 Agent 拥有工具调用权限时,它可以自主规划步骤、自主调接口、自主处理中间结果。这个链路越顺滑,人参与的节点就越少。一旦某个步骤出现“看起来合理但实际错误”的判断,后面所有步骤都会在这个错误基础上继续放大,最后得到一个表面完整、实际错误的结果。
所以,我倾向于把无摩擦理解成一个工程隐患:它导致人从决策链条中被后置到了末端。等发现问题时,已经是结果层面,而不是过程层面。到这一步,返工成本通常已经是前期介入的很多倍。
1.2 比尔·盖茨那篇长文,其实也在说同一件事
之前看到比尔·盖茨罕见发长文警告人类注意 AI。原文很多媒体都报道了,其中有些观点有点标题党,但有一个点我很认同:AI 带来的真正风险,往往不是某个 AI 系统突然“觉醒”并反叛人类,而是人类逐渐把自己的判断力让渡给自动化,直到有一天,我们已经丧失了干预系统的能力。
这个表述听起来很宏大,但落到工程师日常,是非常具体的:当你长期依赖 AI 补全代码、自动修复、自动生成 commit message、自动处理告警,你慢慢会生疏“如何从零开始做判断”。这不是危言耸听,而是技能退化的典型路径。脑科学里叫“用进废退”,工程管理里叫“技能萎缩”。
所以我这篇文章里想讨论的并不是“要不要用 AI”,而是“如何在用 AI 的过程中保留必要的检查点”。一句话说:主动留下摩擦力,不是和效率作对,而是防止系统在无人看管时跑偏。
2. 为什么单次跑通不等于能稳定批量使用
关于 AI 工具,我见到最多的工程翻车,不是第一次运行就失败,而是第一次跑得太顺,然后直接进入批量场景,最后被各种边缘情况打懵。
有一次我帮朋友排查一个 AI 批量文档处理流程。前期单篇文档测试效果非常好,输入一篇合同,AI 能结构化抽取关键字段,准确率很高。于是他们直接把几千篇文档扔进队列,想一次性跑完。结果发现,大约运行到 500 篇左右,任务开始大量报错。排查下来发现,问题根本不在 AI 模型本身,而是输入文档里混入了几种扫描版 PDF,文字层完全缺失;还有一些文档编码异常,模型收到的是一堆乱码。但最早的 10 篇测试样本没有覆盖这些情况,所以大家误以为“效果已经稳定”。
2.1 单次跑通,只能说明主链路没有断
从工程角度看,单次跑通只验证了“主路径可以工作”,并没有验证“边缘路径会怎样失败”。输入格式变化、上下文长度超限、外部 API 返回异常、资源占用过高等问题,往往要等量级上来后才暴露。
以我用 AI Agent 处理批量任务的习惯来说,会严格分三步验证:
- 第一步:样本验证。选取 5 到 10 个覆盖典型场景的样本,跑通主流程,确认结果格式、内容质量、输出路径都正确。
- 第二步:压力验证。人为混入异常样本,比如空文件、超大文件、超长文本、缺失字段、特殊字符,观察系统的失败模式。这一步不是为了“提高成功率”,而是为了知道“在什么情况下它会挂”。
- 第三步:灰度批量。把任务分成小批,先跑 50 条,核对输出,再跑到 200 条,再核对,确认稳定后才放开完整任务。
很多团队跳过第二步,直接到第三步,甚至直接从第一步跳到“全量开跑”。结果就是,当异常出现时,因为缺少失败模式的预期,处理起来非常被动。
2.2 AI 任务的失败不是二进制的,而是“看似成功实则有误”
传统程序的 Bug 是明确的:功能异常,报错,你可以根据堆栈快速定位。但 AI 任务的失败往往不是直接报错,而是输出看起来可用、但实际上不符合预期。或者,它只是在某个字段上错了,而其他字段全对。这种错误最难发现,也最容易在批处理中被忽略。
我在做数据处理类 Agent 时,特别强调结果结构校验。也就是无论模型输出多“自然语言化”,都要强制要求它按 JSON Schema 输出,并且在后端做严格的字段类型、必填项、取值枚举校验。很多同学不理解为什么不能直接让 AI 输出一段文本,然后人去读。我说,如果一次只处理 10 条,人读没问题;但当任务量是 5000 条时,人不可能逐条读,必须依赖结构化校验。
所以,在“单次跑通”和“稳定批量”之间,至少要补两类工程能力:
- 输入侧:在任务送入模型前,先做格式清洗、编码转换、字段补齐。
- 输出侧:定义清晰的结构化约束,增加规则校验和异常检测。
| 验证阶段 | 核心目标 | 常用手段 | 误区 |
|---|---|---|---|
| 样本验证 | 主流程能通 | 10 条以内小样本 | 以“单次成功”推断整体稳定 |
| 压力验证 | 摸清失败模式 | 混入异常输入、极端输入 | 忽略异常样本,只看正常样本 |
| 灰度批量 | 确认资源和输出稳定 | 50/200 条分批推进 | 直接从样本跳到全量 |
不要一上来就把批量数和并发数拉满,先用一条样例确认输入、输出和日志都正常。这个原则在传统后端开发里是常识,但在 AI 场景里很容易被“工具太顺滑”掩盖掉。
3. 真正要守住的是“人必须参与的节点”
我之前在一次技术分享里问过一个问题:如果你有一个 AI Agent,它能自动筛选简历、自动预约面试、自动给候选人发 offer,你会在哪一个环节停下来亲自检查?
大部分人说会检查 offer,因为那是最终决策;也有人会检查简历筛选,因为那是入口。但很少有人能说清楚:在中间那些自动执行的动作里,哪些节点如果错了,会直接造成不可逆后果。
3.1 找出不可逆动作,至少保留一层人工确认
工程上有一个简单判断标准:如果一个动作执行后难以撤销,或者撤销成本极高,那么这个动作的前一步就必须有人工确认。这个原则和 AI 无关,但在 AI 场景里尤其重要,因为 AI 的执行速度可以非常快,快到你在发现错误之前,它已经连续执行了多个不可逆操作。
举个例子,假设 Agent 可以调用 Git 自动提交并推送代码。如果它在一次重构中误删了一个文件,并且自动提交、自动推送,那么恢复成本就会变得很高,尤其是在开启自动合并且 CI 流程很顺畅的情况下。这时候,负责任的设计不是把“提交”和“推送”都交给 Agent,而是在“推送”前设计一个暂停点,让人去检查 diff。
我比较认可的做法,是把 AI 工作流设计成半自动,而不是全自动。批量任务可以自动执行,但必须在关键节点生成“异常报告”和“变更摘要”,并规定:当异常率超过阈值,或者检测到不可逆操作时,必须停止并通知人来处理。
3.2 可解释性是润滑剂,但也可能是误导
很多 AI 工具为了建立信任,会给每一个决策附上解释,例如“因为你的项目要求 X,所以我选择了方案 Y”。这个功能本意很好,但它会制造一种认知偏差:只要系统给了理由,人就会觉得它可靠。
实际上,很多解释是“事后生成的合理化”,并不能反映模型内部真实的推理过程。你让 AI 写一段代码,它解释成“根据您对性能的偏好,我选择了缓存方案”,听起来很有道理,但这个解释并不一定意味着它真的比较过多种方案。它只是生成了大量合理的文字,填补了你询问的空隙。
所以我在设计系统时,很少依赖模型自己给出的“理由”作为判断依据。我会更看重:
- 输入上下文是否完整:模型有没有看到所有需要的信息。
- 约束条件是否显式化:有没有告诉模型“不能做什么”。
- 输出是否可通过规则校验:是否满足基本业务约束。
只有当这三点都能回答清楚,模型的解释才有额外意义。如果只是让 AI 自己解释自己,它更像是给错误找了一套华丽的包装。
3.3 工程化手段:日志、审计、暂停、审批
给 Agent 留刹车片,一个有效的路线是围绕四个关键词来构建:日志、审计、暂停、审批。
日志,重点是记录思想链和工具调用链,而不只是最终结果。这样一旦出险,才能回溯 Agent 在哪一步拿错了输入、调错了参数。审计,是定期抽查 Agent 的中间决策是否合理,不是只检查最终输出是否好看,而是检查路径是否符合预期。暂停,则是当 Agent 检测到置信度过低、多次重试仍失败、或者输入输出出现格式异常时,必须主动停下来,而不是硬着头皮继续。审批,是把不可逆操作留给人,比如删除、支付、发布、推送,这些动作一定要通过审批接口才能执行。
很多团队在做 Agent 时过度追求“全自主”,总觉得停顿会破坏用户体验。其实用户对“可靠”的需求通常远大于对“自动”的需求。与其让智能体撞了墙以后默默绕路,不如在要撞墙之前,让人决定是不是应该换一条路。
# 一个保留人工确认节点的示例结构 class AgentTask: def execute_with_human_checkpoint(self, task): # 自动执行低风险步骤 result = self.run_model(task) self.log_trace(result) # 风险等级判断:不可逆或高风险时挂起 if self.is_irreversible(task): self.pending_approval(task) return # 等待人工审核 # 风险较低且校验通过,继续执行 if self.validate_output(result): self.commit(task)上面这个结构在实现上非常简单,但它代表的是一个设计原则:不是所有动作都有权自动完成。
4. 从“能跑”到“能持续跑”,差的不是模型而是工程护栏
如果你跟进过一个 AI 功能从原型到生产的全过程,你会发现,模型的精度只是很小的一块拼图。真正决定项目能不能长期稳定运行的,往往是那些听起来特别不性感的工程细节:依赖版本、数据格式、资源配额、失败重试、监控告警、灰度策略。
这里有一个公共背景:最近关于“AI Agent”相关的讨论非常多,从大厂框架到开源项目都在强调 Agent 的自主规划能力。但我接触的很多真实项目,最需要的反而不是更强的规划能力,而是更强的纠错能力。
4.1 流式生成时代,最怕的是“错误被自动放大”
过去的程序,一个错误会在一个明确的位置暴露出来,你看到报错就知道是哪一行出了问题。而 AI 应用不同,特别是 Agent 这种多步骤体系,一个错误可能被后续步骤不断放大:小到一次工具调用参数错了,大到模型在某个分支上产生了幻觉,Agent 却基于这个幻觉继续往下规划,越走越远。
处理这种问题的核心,不是追求模型“永远不做错”,而是构建多层防御,确保任何一层出问题都能被兜住。我在一个 AI Agent 服务里会坚持做这种防护:
- 边界防护:任务在进入 Agent 之前,先由规则引擎做输入检查,非法输入直接拦截,不进模型。
- 过程防护:Agent 每一步工具调用的返回结果,都必须经过一个 schema 校验器,无法解析的返回会触发步骤重试或任务降级。
- 结果防护:在 Agent 最终输出之前,做一次整体合理性检查,例如关键字段是否空、长度是否超限、是否和目标需求匹配。
- 审计防护:对 Agent 的一次完整运行链路,保存全过程 trace,包括每一步的输入、输出、Token 消耗和时间消耗,方便事后复盘。
这个思路并不复杂,但它很吃工程纪律。
4.2 资源与成本,是另一个让人放弃防线的陷阱
很多无摩擦工具之所以吸引人,是因为它把复杂的技术细节都封装了起来,你只需要支付 API 费用,就能获得很不错的效果。这当然是一件好事,但在做工程落地时,如果完全不去理解底层资源消耗,就可能出现“功能很精彩,账单更精彩”的窘境。
成本问题会直接影响你是否有余力去建立防线。举个例子,一个 Agent 在遇到任务失败后会反复重试。如果用户没设置最大重试次数,又或者重试时不区分错误类型,就会把大量 Token 消耗在注定失败的任务上。给 Agent 加上重试上限、退避策略和成本告警,是为了避免发生不可控的成本放大。
另外,模型响应时间也是一个隐藏摩擦。当任务队列很长时,如果 Agent 的串行处理时间太长,用户就会焦虑,就会想加并发,而并发加多了,又可能出现资源抢占、请求超时、上下文错乱等复杂问题。一旦发生这些问题,人为了救火,就更没有时间去做质量检查。于是,整个系统就会进入“越自动化越混乱”的循环。
从工程经验看,一个可持续运行的 AI 服务,不是靠更强的模型来兜底,而是靠更完整的护栏来兜底。模型负责聪明,系统负责控制聪明可能造成的破坏。
| 工程模式 | 解决的问题 | 常见实现要点 |
|---|---|---|
| 输入清洗 | 异常输入导致模型输出失控 | 编码统一、空值补位、超长截断 |
| 步骤校验 | 中间结果异常被后续放大 | JSON Schema 校验、字段范围检查 |
| 失败重试 | 临时错误导致任务中断 | 区分致命错误与可重试错误,配置退避策略 |
| 审批闸口 | 不可逆动作无法追回 | 高风险动作进入审批队列 |
| 全链路审计 | 事后无法定位错误链条 | 保存每次调用的 trace 与 token 消耗 |
4.3 本地部署与远程 API,护栏还真不一样
最近的公共讨论里,“AI 模型部署”和“AI 工程实践”是两个高频主题。这两个词背后其实是一组选型矛盾:你是想快速调用远程大模型 API,还是想在本地/自有环境里部署开源模型?
这个选择直接影响你要建哪类护栏。如果是远程 API,你需要重点考虑的是数据隐私边界、成本控制、限流保护,以及当 API 版本升级时,输出格式是否发生变化。这类问题本质上是你依赖别人的平台,你的可控性比较弱,所以要求在调用层做更厚的封装。
如果是本地部署模型,虽然数据不出内网,隐私性更好,但你要自己处理推理性能、卡显存、多副本调度、模型版本迭代、安全补丁等问题。很多团队低估了开源模型的运维成本,以为部署一次就能一劳永逸。实际上,模型文件的组织、量化算法、推理框架版本、并发访问调度,任何一个环节出了问题,都会直接影响响应时间和生成质量。
一个比较稳妥的思路,是先把任务跑通,再根据业务边界决定采用哪种部署方式。如果业务对数据隐私要求高,早期就优先考虑本地部署;如果只是想快速验证效果,远程 API 更省心。但无论哪种方式,都应该对 API 的输入输出做协议层封装,避免业务代码直接和某个模型供应商深度绑定。这样,以后不管是换模型还是调整部署方式,都只改动适配层即可。
5. 一个更务实的框架:先跑通、再加护栏、再谈自动化
在大量 AI 工程实践中,我逐渐总结出一个三层推进路径。这个框架既适合个人开发者小试牛刀,也适合小团队把 AI 功能推向生产环境。
第一层叫“原型期”。这个阶段的核心目标是快速试错,验证 AI 到底能不能解决业务问题。你可以直接用最顺滑的工具、最高效的 API,不用太在意工程化,但有一点例外:一定要记录输入、输出和失败案例。因为如果没有基线数据,后面任何优化你都说不清是变好还是变坏。
第二层叫“生产期”。这个阶段要考虑从“单次能跑”变成“持续能跑”。你需要补充数据清洗、结果校验、安全审查、成本告警、权限管理、异常处理和任务重试。在这个阶段,不要盲目追求 Agent 完全自主,而是把它设计成一个受限的执行器,每个关键步骤都要有控制点。
第三层叫“自主期”。当你的规则校验、异常处理、审计系统都比较完善之后,再考虑提升自动化程度。比如 Agent 可以在某些低风险场景里自动执行,无需人工确认;只有在高风险场景才回退到审批模式。这个阶段最重要的原则是:自动化程度要跟着信心走,而信心来自前面两个阶段的护栏强度。
这三层推进,每一步都是在增加控制力,不是单纯增加功能。
对于初次尝试的人,我更建议先从最小闭环开始,选一个真实但范围有限的场景,比如自动汇总日报、批量整理公文格式、自动分类工单,然后一步步把输入、输出、校验、告警加进去。这比一开始就追求一个“全自动内容生产线”要靠谱得多。因为你面对的不是“能不能跑通”,而是“能不能长期在无人看管的情况下稳定运行”——后者需要的工程强度远远高于前者。
单次跑通,只是你与 AI 合作的起点;能否有控制地批量使用,才是真正决定生产价值的分水岭。
6. 比起黑盒的“无摩擦”,我更信任有刻度的“半自动”
从开篇到现在,我一直在说“无摩擦”是隐患。但这里得澄清一下:我并不觉得工具做得顺滑是坏事,也不是号召大家回到命令行时代,故意给 AI 工具制造卡顿。真正的问题在于,“摩擦”被谁承担了。
好的摩擦,应该留在系统和流程的边界处,由工程手段来承担;而不是让使用者在每次操作中都陷入迷茫。换句话说,一个成熟的 AI 工作流,应该用自动化的方式把低风险、高频、可校验的环节做得极为顺滑,同时在不可逆、高风险、需要价值判断的环节,留下一道清晰可见的闸门。
为什么说这是“有刻度的半自动”?因为它的自动化和人工介入不是模糊的,而是明确定义在哪里切换。每一步自动执行,都有日志;每一次人工介入,都有上下文;每一次审批,都有依据。这些刻度让系统从“黑盒”变成了“灰盒”——你不必理解模型内部每一条参数如何推理,但你能看到它每一步做了什么、为什么停、停在哪个位置。
这种设计思路对用户是一种保护,对工程师也是一种解放。你不用去思考“如何让 AI 在所有场景里都完美”,你只需要确保“当 AI 不完美时,系统仍然安全”。这个思维转换,是 AI 工程化里最重要的一次成长。
6.1 AI 真正的价值,是把重复劳动变成可以设计的流程
顺滑工具带来的不只是效率,它更重要的贡献,是把一些原来只能靠人工经验的重复劳动,转变成可以被设计、被监控、被优化的流程。举一个简单例子,以前整理会议纪要,每个人风格不同,输出五花八门,很难标准化;有了 AI 以后,你可以规定输出模板、字段结构、甚至后续待办清单的抽取逻辑。这个转变意味着,你的知识工作开始像软件工程一样可迭代。
但这恰恰也是危险的来源:一旦你已经把流程固化到工具里,你在改进问题时会倾向于“调整提示词”,而不是“重新思考流程设计”。而后者往往才更关键。你需要持续追问:哪些环节应该让 AI 做,哪些环节应该留给人,哪些边界需要重新划定。如果一个流程已经完全无摩擦,这类追问的频率就会下降,直到某天出问题才重新想起来。
从这个角度说,摩擦不是敌人,它其实是系统健康的指示器。它告诉你哪里需要人的判断,哪里还不够可靠,哪里的约束还不够清晰。一个合格的 AI 工程项目,指标不应该只有准确率,还应该包含人工介入率、异常捕获数、审批通过率、告警响应时间这类“过程指标”。只有当这些指标都以合理范围运行,你才能对自动化多一点信心。
6.2 对未来的一个预判:工程范式会从“提示词调优”走向“流程治理”
如果继续往远处看,在 AI 应用开发这个领域,我认为很快会经历一次重要转型。前半段大家比拼的是“谁的模型调得好”“谁的提示词更巧妙”,但当 Agent 真正进入生产环境以后,竞争重点会变成“谁的流程更抗风险”。
这个趋势和软件工程发展史是类似的。最早写程序时,大家关注的是语法和算法;后面语言越来越成熟,大家才开始关注版本管理、自动化测试、持续集成、监控告警、故障恢复。AI 工程也一样。初始阶段大家被生成能力震撼,都在追求效果;当生成能力成为默认配置后,稳定、可控、可审计、可回滚,这些传统工程的价值观会重新变成核心。
所以,“AI 的无摩擦之路到底通向何方”,答案取决于工程环境的设计。只顾效率而不顾检查点,路可能通向事故现场;在效率之外保留判断节点,路通向的才是真正可持续的自动化。
关于这个话题,我不打算给出一个绝对结论,因为现在一切都还在快速演进。但我会守住一条底线:凡是系统让我感到“不假思索就可以完成”的时刻,我反而会停下来多想一步。不管这个系统是 AI Agent、自动代码补全还是智能运维平台,这都是一条值得长期保留的习惯。
AI 时代,我们并不需要害怕工具太聪明。真正该警惕的,是人因为工具太顺滑,而渐渐忘记自己在流程中仍然是一个需要负责的角色。保留一点有意识的、有控制的、带日志记录的摩擦,其实是给复杂系统装上仪表盘。摩擦不是阻力,它有时就是握着方向盘时,指腹上那一点微不足道的重量。它提醒你:你还在驾驶,而不是在副驾驶上打瞌睡。