从传统架构到Agent原生应用:大脑、技能与护栏的工程实践
这两年有一个特别明显的趋势曾经我们习以为常的软件开发方式——前端、后端、数据库三层打底接口约定清清爽爽流程图一张画到底——正在被一种新的架构思路顶得摇摇晃晃。朋友圈里到处都在聊通用Agent但大部分讨论要么停留在“AI能帮我写代码”这种工具层面要么上升到“AI要取代程序员”的玄学层面很少有人认真回答一个问题当Agent成为软件的“默认主角”之后旧的软件架构到底哪里不成立了新架构到底是什么样子我的答案其实特别简单就三个词大脑、技能、护栏。未来的软件不管你叫它智能体应用还是Agent原生应用本质上都是一套“一个会思考的核心调度器 一堆可插拔的专业能力模块 一套保护用户和数据的安全边界”这样的结构。这篇文章我就用自己的实际改造经验把这三件事拆开揉碎讲讲为什么传统架构会被替代以及如果你现在手头就有老项目怎么一步步把它改造成Agent架构顺便把我踩过的坑、踩完之后才想明白的道理都交代清楚。1. 传统软件架构的“穷人瓶颈”为什么非改不可先别急着跟着喊口号我们得先把传统架构为什么会被终结这件事讲清楚。我见过太多团队代码写得也很规范架构也很标准但面对新需求的时候依然改不动。问题不一定出在“人不行”而是这套架构本身的假设已经过时了。1.1 传统架构把“流程”写死把“人”留在流程外任何传统软件从订单系统到内容管理后台本质都是这么工作的产品经理把业务规则拆成一条条逻辑开发把这些逻辑变成if-else、状态机、工作流引擎用户通过界面触发这些固定路径。这套东西好用是因为业务边界稳定规则明确输入输出可以提前枚举。但它的“穷人瓶颈”在于所有不确定性都要靠人去兜底。规则覆盖不到的边界情况需要客服人工处理输入稍微一变比如用户上传了一张格式不太规整的表格系统就傻眼了流程中间突然需要新增一个判断维度比如以前只按金额审批现在还要按部门、按风险等级综合审批那就要改代码、发版本、等回归。我把这种架构叫作“穷人的自动化”它用成百上千个死规则去模拟一个智能体本该拥有的判断力。规则写得越多系统越臃肿越难维护。而通用Agent带来的核心变化恰恰是把“判断”从代码里抽出来交给了模型。判断不写死流程就不需要写死架构自然要跟着变。1.2 接口思维与意图思维的本质冲突传统架构还有一个根深蒂固的思维一切交互都是接口调用。前端调后端接口后端调数据库服务之间调API。你要完成一个任务必须由用户一步一步点击系统一步一步响应每一步的参数由人精心准备。Agent架构的处理方式完全不同。用户丢给它的是一句话“帮我查一下上周销售额异常波动的几个商品分析下原因顺便给运营写一封提醒邮件。”这句话里有查询、有分析、有内容生成还要调用邮件系统。在传统架构里这至少要拆成四五个接口再加一个前端页面在Agent架构里大脑负责拆解任务技能负责逐个执行护栏负责检查邮件内容不泄露敏感数据最后把结果交出去。所以传统架构的核心矛盾不是“代码写得不好”而是它把“理解用户意图”这件事排斥在系统之外。通用Agent把这个能力内置进来了架构的重心就从“怎么把接口做得更规范”变成了“怎么让大脑理解得更准、技能执行得更稳、护栏守得更严”。这也是为什么我判断未来三五年里存量系统的改造会是一个巨大的工程需求。不是推翻重写而是把编码在业务逻辑里的“判断”逐步交还给模型让系统重新学会“理解”这件事。2. “大脑技能护栏”到底怎么拆很多朋友听到这三个词第一反应是这不就是Agent的老三样吗ReAct循环加工具调用加系统提示词对也不对。这三个词如果只停留在概念层面确实没什么新鲜的但如果你把它们当作架构设计的三个核心组件去理解每一样背后都有非常具体的落地方法和取舍逻辑。2.1 大脑不是“选个好模型”这么简单大脑是整个Agent系统中负责思考的部分。它的职责是理解目标、拆解任务、决定调用哪些技能、评估中间结果、处理异常。很多人觉得大脑就是大模型选个参数最多的就行了实际操作下来远没那么简单。我现在的做法是把大脑分成两层一个叫“轻量调度层”一个叫“深度推理层”。轻量调度层通常用响应速度快的模型来负责意图识别和任务拆解它的生成内容不需要太长但需要稳定、快速、便宜深度推理层则负责真正复杂的任务比如多步推理、代码生成、长文档分析这部分可以用大参数模型精度优先。这种分层的原因特别现实如果所有请求都丢给最强的模型成本会先把你耗死如果所有请求都用轻量模型遇到复杂任务容易翻车。分层之后调度层先把任务难度分拣一遍只有少数任务能进入深度推理层整体成本和响应速度都会好很多。大脑的另一个关键组件是记忆。没有记忆的Agent每次对话都像第一次见面这在工具调用场景下还能忍在真正的业务系统里完全不可用。记忆我一般分三层短期记忆存当前任务的上下文长期记忆存用户偏好和历史事实工作记忆存的是模型推理过程中的临时结论。前两者可以借助外部的向量库和结构化存储实现工作记忆则依赖提示词设计与模型本身的上下文窗口。还有一个常被忽略的点大脑要会“承认失败”。传统软件里异常分支再复杂也是可枚举的LLM场景下模型完全可能遇到自己搞不定的情况这时候大脑需要具备自动降级和求助机制比如转交人工处理或输出“我能力不足”的明确提示。这一点我后面在护栏部分还会重点展开。2.2 技能把API变成“有手有脚”的能力如果说大脑是决策中枢技能就是Agent的双手双脚。一个技能的本质是一个可以被大脑调用的、可复用的能力模块。它可能是一个Python函数、一个API包装器、一段PowerShell脚本甚至是一个完整的微服务接口。关键不在于它是什么技术形态而在于它如何被描述、被调用、被验证。我在改造老系统的时候发现把现有接口直接暴露给Agent是行不通的。传统接口的设计目标是“给人看的前端调用”参数往往很精简但返回结构复杂错误信息抽象这些对LLM极度不友好。技能化要做三件事第一重新设计“技能描述”。技能描述是大模型判断何时调用该技能的唯一依据必须写清楚能力边界、典型使用场景、所需参数、返回格式、失败条件。我见过很多团队把技能描述写得像接口文档满篇术语模型根本看不懂自然选不对。好的描述是说人话的比如“把订单号列表转换成Excel文件并返回下载链接”而不是“exportOrdersToExcel”。第二为每个技能定义清晰的输入输出Schema。这里不能用开发觉得方便的类型要用模型容易理解的字段命名和约束。参数名避免缩写枚举值的含义要写全复杂的嵌套结构尽量拍平。第三技能要具备自描述的能力。模型调用技能后技能的返回结果最好附带一段机器可读的状态说明比如“查询成功共返回12条记录”“查询失败原因是用户权限不足”。这样大脑不需要靠猜就能决定下一步是继续加工结果、还是更换方案、还是直接终止。在实际落地中技能往往不是一个孤立的函数而是一个技能组。比如“订单查询”技能组下面有按ID查询、按时间范围查询、按用户查询三个子技能。大脑先调“订单查询”得到结果后可能还需要调“订单导出”。技能与技能之间允许编排但编排逻辑尽量放在大脑侧技能本身保持原子化。这样既灵活又容易测试。2.3 护栏从来没这么“性命攸关”过护栏是这三个词里最容易被低估、也最不能省的一环。传统软件的权限控制、参数校验、异常拦截本质上也是一种护栏但Agent时代的护栏要多做几件事防止模型输出有害内容防止模型调用不该调用的工具防止技能执行过程中产生越权行为防止模型在被提示注入时做出危险决策。我把护栏分成三类来落地第一类是输入护栏作用在模型看到任何内容之前。它负责做数据脱敏、敏感信息识别、恶意提示检测。比如用户输入里带了一长串“忽略之前所有指令”的内容输入护栏就要能识别出潜在注入风险并提前阻断或清洗。第二类是决策护栏作用在模型准备调用技能之前。它根据预设的权限矩阵判断该技能是否允许被本次请求调用。决策护栏应该有一套独立的策略库而不是写在提示词里。我用的是Open Policy Agent这类策略引擎把“哪些角色可以调用哪些技能、在什么条件下可以调用”全部外部化成策略文件模型本身只负责发起调用请求最终放不放行由护栏说了算。第三类是行为护栏作用在技能执行中和执行后。它会实时监控执行过程比如爬虫技能抓取频率是否过快、敏感数据是否被写入日志、批量发送技能的目标数量是否越界。一旦发现异常可以中断执行或回滚操作。没有护栏的Agent就像把公司大门钥匙交到一个非常能干但偶尔犯迷糊的实习生手里。他能帮你处理大量工作但一旦被别有用心的人利用或者自己理解偏了造成的损失也是指数级的。我合作过的所有团队凡是Agent项目推进顺利的护栏模块都是最早开始设计的而不是最后补上的。3. 实操把一个旧系统改造成Agent架构说完了抽象的架构理念我来讲讲实际改造怎么做。下面这个案例来自我最近参与的一个模拟项目X是一个传统的信息管理系统里面有用户管理、报表查询、消息通知三个核心模块。业务方给的目标很简单让用户可以用自然语言完成报表查询和通知发送同时保证权限边界不突破。3.1 第一步找出大脑要做的“决策点”而不是重写所有代码很多人一听改造第一反应是把所有模块都用Agent重写一遍。这是一个巨大的坑。老系统里有大量业务逻辑是稳定、明确、高价值的比如数据清洗规则、金额计算逻辑、审批状态机这些不应该交给模型自由发挥盲目替换只会引入不确定性。正确做法是先做“决策点体检”。把系统的每个动作都过一遍问一个问题这个动作的判断逻辑是固定的还是本来就需要人来做灵活判断比如“按权限过滤报表数据”这件事权限判定规则是明确的属于固定逻辑保留原代码“用户可以用什么维度组合来分析运营数据”这件事过去靠UI预设选项本质上是把灵活判断空间压缩到几个固定维度这就是决策点可以把“维度组合”这一步交给大脑。改造的第一个落地动作是在老系统前面加一个“意图网关”。这个网关接收用户的自然语言输入由大脑把输入解析成一个结构化的“任务计划”再按照计划依次调用老系统的接口。老系统依然负责数据存储、权限鉴定、事务处理Agent化部分只负责理解意图和编排调用。这样一来改造范围被控制住了老系统不会被破坏出问题还可以快速回退到传统交互方式。我强烈建议任何团队都不要第一版就搞“全系统接管”先跑通一个高频场景比如报表查询加通知发送验证整个链路再扩大范围。3.2 第二步把老接口包装成“长着说明书”的技能既然老系统不动那核心工作就是把原有的接口改造成Agent能顺畅调用的技能。我通常给这个过程起名叫“技能化包装”。包装不只是加一层函数壳而是要动接口的描述方式、出入参结构和错误返回。举个例子。原系统有一个“获取报表数据”的接口入参是reportId、startDate、endDate、filters其中filters是一长串JSON。对人来说没问题但对模型来说这个JSON结构复杂又抽象模型很容易生成错误参数。改造时我把它拆成了几个技能一个是“按固定报表ID查询数据”入参就三个字段简单明了一个是“按条件创建临时报表”允许模型传入过滤条件但条件只允许白名单字段其他字段过滤直接报错。技能包装有一个关键指标我管它叫“一次调用成功率”。如果模型调用某技能的十次尝试里有八次因参数错误而失败那问题一定不在模型而在技能设计。可能是参数名太抽象、约束没写清楚、或者是描述文档里没有给出调用示例。我把技能描述模板固定成四段式功能摘要、适用场景、参数说明含默认值和约束、调用示例。其中调用示例是我特别强调的实测下来只要描述里带上一个具体示例模型参数生成的正确率能提升一大截这个技巧成本极低但效果显著。3.3 第三步护栏不是后加是同步设计在我参与的改造中护栏是在第一天就进入设计的不是等功能做完再补。具体落地先做了三块身份透传、能力白名单、执行审计。身份透传解决“到底是谁在操作”的问题。老系统的接口大部分通过登录态拿到用户身份Agent调用时不能把身份丢掉。做法是把大脑当做一个中介它要带着原始用户身份去调用技能而不是用自己的服务账号统一调用。否则就会出现用户A通过Agent查到了用户B名下数据的严重越权事故。能力白名单解决“Agent能做什么”的问题。即使大脑有这个意图也不代表可以调用所有技能。比如系统里有一个“批量发送通知”的功能如果Agent可以被任意用户一句话触发群发那后果不堪设想。白名单的策略必须是独立于提示词的可以通过权限面板配置不能只靠模型的系统提示约束因为提示词本质上是一种软约束模型在复杂上下文里很容易忘记或被人误导。执行审计解决“事后怎么追责”的问题。每个Agent执行任务的关键步骤都要记录用户的原始输入、大脑的意图解析结果、每次技能调用的参数和返回、护栏命中情况。这些日志不仅能用来排查线上故障还可以作为数据集去评测和优化系统提示词。实测下来这三块做完我们才敢把Agent能力开放给真实用户。没有护栏的Agent只能在实验室里自娱自乐一旦接入真实业务分分钟出事故。4. 常见问题与排查技巧实录Agent开发踩坑的速度绝对比我预想的快。这个部分我整理了几类高频问题这些问题在网上不一定有标准答案很多是我自己翻车总结出来的。4.1 模型“幻觉”怎么兜底关键操作必须走“代码验证关”最开始我们的Agent可以直接调用“删除用户”这种高危技能的测试时发现模型偶尔会在条件判断不够严谨的情况下多删了不该删的数据。后来我立下一条铁律凡是涉及写操作、敏感操作或资金操作的技能模型执行完之后不能直接返回必须走一道代码验证关。具体做法是在技能层设置一个“预校验”函数。它基于规则去校验模型生成的关键参数比如删除的用户ID是否为空、金额是否超出限额、目标邮件列表是否超过最大允许数量。校验不通过技能的返回值会说明原因并把执行动作取消。这相当于在“大脑的意图”和“物理世界的动作”之间插了道闸门模型可以犯错但错误不会传导成损失。我做过一个统计加上预校验之后高危技能的错误执行率从百分之几降到了千分之零点几代价是每次调用多花几十毫秒的校验时间。这笔账怎么算都划算。4.2 技能之间“耦合”导致大脑乱成一锅粥早期我在设计技能时偏好大而全比如“数据处理”技能既能查询SQL、又能做分析、还能生成图表。结果就是大脑经常搞不清该用哪个技能或者在错误的技能上反复试错上下文给占得满满的。后来我改成“单一职责技能”原则每个技能只做一件事但参数接口一定要做到一致。比如所有查询类技能都用listReq和listResp的统一结构所有导出类技能都返回fileUrl和expireAt所有写操作技能都返回affectedRows和detailId。技能之间不做互相调用只有大脑通过编排来组合它们。这个改动让技能数量增加到原来的三倍但调度成功率上升了40%。模型和开发人员都更轻松了。我强烈建议做Agent架构时技能宁可拆细也不要做成大杂烩。拆细了虽然多几个模块但每个模块都能测试、能复用、能独立升级。拿捏得准的关键技巧是四个字“能力高内聚参数低耦合”。高内聚意思是技能内部逻辑完整一个技能负责一个能力低耦合指技能之间不互相依赖就算把某个技能下线其他技能不受影响。4.3 技能描述与真实行为不一致大模型最容易被骗技能描述是自然语言技能的代码是硬逻辑两者一旦不一致就是事故现场。我碰到过一个案例某技能的描述写的是“校验邮箱格式并发送邮件”但代码里实际还会读取用户手机号用于短信验证结果模型以为这个技能只发邮件于是某些需要纯邮件发送的场景误触发了短信。这个问题不止是描述写得不好更像是“文档与代码脱节”的经典问题在Agent世界的复现。解决办法是把技能描述和技能的自动化测试绑定在一起。每次技能代码有改动对应的描述文档必须同步更新然后跑一遍全部技能评测用例验证描述与实际行为一致。这个流程听起来行政化但确实是最有效的兜底手段。5. 我更愿意把“终结”理解成“接管”现在关于Agent终结软件架构的说法很多我认为与其说终结不如说接管。传统软件里的确定性模块不会被消灭权限系统、事务处理、数据一致性这些东西依然要依赖经典工程方法来实现。但它们会降级为“技能层”的一个个零部件支撑着上方的智能大脑。真正被替代的是那些原本靠界面和流程硬编码起来的“伪智能”。比如用户选了一堆筛选条件生成图表以前这叫图表功能以后这是Agent调用一个数据可视化技能比如系统根据规则给用户推荐内容以前这叫推荐算法以后可能变成大脑综合多种技能后的决策结果。我个人的体会是未来的软件开发者要学会两头作战一头用工程手段把技能做得又稳又准一头用调优手段把大脑的意图理解做深做透。这两头都需要大量的真实业务数据去喂养和验证也是Agent架构真正拉开差距的地方。最后再分享一个小技巧改造老系统时别急着一次性把所有业务流程都Agent化可以先挑一个“频次很高、规则却很零散”的业务比如客服问答、报表解读、告警分析。这类业务恰恰是旧规则系统做得最累、用户体验最差的地方也是Agent价值最容易体现的切入点。先在一个窄场景里跑通“大脑技能护栏”的完整闭环再逐步扩展踩坑成本会低很多。