简介:本文系统梳理Agent开发与传统软件工程在确定性假设、工程重心、交付形态、任务执行模式与研发方法论五个维度的本质差异,帮助开发者理解Agent开发“接受不确定性、构建护栏体系”的核心逻辑,掌握从页面式软件到对话式智能体的思维转变路径。
Agent(智能体)是以大语言模型(LLM)为决策核心的软件系统:它接收用户的目标描述,自主理解意图、规划任务步骤,调用预先封装好的技能(Skill)或API完成执行,并根据执行反馈与环境变化动态调整后续行为。所谓Agent开发,就是围绕这类系统开展需求定义、能力封装、护栏建设、评测与验收的完整工程实践。
传统软件工程则是面向确定性逻辑的开发范式:开发者把业务规则翻译为精确的代码分支与数据流,给定输入即可推导输出,程序行为在理论上完全可预测、可复现。测试、灰度、回归验证等一整套质量保障手段,都建立在“行为可穷举验证”这一前提之上。
两者的分水岭在于决策权的归属:传统软件把所有决策固化在人类编写的代码里;Agent则把部分决策权交给概率性的模型,由模型在运行时动态生成执行路径。这一根本差异,向下衍生出工程方法、交付形态、任务模式等一系列具体区别。
一个常见误区是把Agent开发看作传统开发的“升级插件”,沿用旧思维即可平滑过渡。事实上,转变必须从思想层面开始。
需要接受的现实是:传统软件即便做了充分的测试验证,线上依然会出现Bug甚至故障。但传统软件的缺陷来源于代码逻辑,属于可定位、可修复的收敛型问题。而Agent引入LLM之后,不确定性成为系统的内生属性——模型输出具有概率性,同一输入可能产生不同的执行路径,无法通过穷举测试完全覆盖。除非完全不使用LLM,否则这种不确定性无法规避,只能管理。
因此,Agent开发的核心命题从“消灭不确定性”转变为“把不确定性约束在人类可接受的范围内”。理解了这一点,Agent开发中的各种工程手段——护栏、评测、人工介入点——才有了统一的解释框架。
传统软件是面向确定性编程,程序员基本能精准把控任务执行过程,代码即流程,流程即行为。开发者的思维模式是:把每种情况都枚举清楚,写进分支逻辑。
Agent开发则要求思维反转:程序中存在不确定性是常态而非例外,工程师的任务不是消除它,而是为它划定边界。具体的思维转变包括:
传统软件的质量保障主力是测试体系;Agent开发的重心则转向构建护栏体系,也就是当前行业讨论非常激烈的Harness(执行框架)方向。其要点在于:不是让大模型自由发挥,而是提前建好各类保障手段,尽量把Bug或故障降到可接受范围。
一套完整的护栏体系通常覆盖三个层面:
此外,在关键节点保留人工介入点,允许人审核、打断并纠正Agent的行为,是护栏体系的重要组成部分。
传统软件交付给用户的产物是页面:表单、列表、看板、流程编排界面,交互的载体是UI组件,用户的每个操作都有明确的界面入口。
Agent的产品形态往往就是一个对话框。用户通过自然语言触发Agent内部的流程,背后可能是各种封装好的Skill,也可能是直接的API调用;执行过程与结果则以轻量级交互方式呈现,例如卡片、图表、结构化摘要等。交互重心从“界面承载流程”变为“语言承载意图”,界面从流程的主导者退化为结果的展示层。
传统软件中,用户需要在不同的页面之间自己串流程。做得好一点的软件,会把领域专家的经验沉淀为SOP(标准作业流程),本质是软件替用户把页面串到一起,用户一步一步点过去就完成了任务。流程的编排者是软件设计者,用户是执行者。
Agent则讲究自主规划:用户只需定义目标与验收标准,至于如何完成是Agent自己的事。Agent会输出思考过程供用户审视;如果用户认为思路不对,可以随时打断,补充背景知识——本质上是补充上下文信息,Agent再据此调整任务规划。用户角色从“流程执行者”反转为“规划验收者”。
| 维度 | 传统软件(SOP模式) | Agent(自主规划模式) |
|---|---|---|
| 用户输入 | 按步骤操作页面 | 描述目标与验收标准 |
| 流程控制 | 预先固化在代码中 | 运行时动态生成、可调整 |
| 例外处理 | 重新设计并开发流程 | 补充上下文后重新规划 |
| 用户角色 | 执行者 | 验收者与纠偏者 |
值得注意的是,传统软件的方法论并没有被全部推翻。2025年前后重新被广泛提及的SDD(Spec-Driven Development,规约驱动开发),其流程与传统的瀑布模式高度相似:先定范围、写文档,然后再编码,编码时间占比很小,可能不到20%。
AI时代的SDD做了关键改进:
这体现了一种辩证关系:为了控制模型的不确定性,Agent开发反而回归了“先文档后编码”的严谨流程,用规约的确定性去对冲模型的不确定性。
可以用一个简化的执行循环描述Agent的运行方式:
# Agent 执行循环(示意性伪代码)goal, accept_criteria = 解析用户输入()plan = LLM(生成任务规划 | 上下文包含 goal、可用技能列表)while not 达成验收标准(执行结果):if 命中过程护栏(plan.next_step): # 护栏拦截执行人工介入或兜底流程else:result = 调用技能或API(plan.next_step)if 校验失败(result): # 输出校验plan = LLM(基于反馈反思并重新规划)# 用户可在此打断并补充上下文呈现结果(卡片 / 图表 / 结构化摘要)
可以看到,与传统的顺序执行不同,Agent的运行是“规划—执行—校验—再规划”的闭环,模型在闭环中持续承担决策职责,而护栏决定闭环能否安全地转下去。
反过来,强合规强审计的固定流程、对延迟与确定性要求极高的实时系统,仍然应优先采用传统软件工程。
Agent开发与传统软件工程的本质区别,在于前者必须与不确定性共生。传统软件面向确定性编程,靠测试验证消灭缺陷;Agent开发接受模型输出的概率性,靠护栏体系(Harness)把风险压到人类可接受的范围内。交付形态从页面变为对话框,任务模式从用户按SOP执行反转为Agent自主规划、用户验收纠偏;方法论上,SDD等“规约先行”的方式正以AI主导的新形态回归。传统软件的能力积累并未作废,而是需要在新的确定性边界内重新定位。理解这套差异,是从传统开发者转型为Agent开发者的第一课,也是评估Agent适用场景、避免盲目上项目的基本前提。