过去一年里,我见过太多号称"AI应用"的项目,本质上是老系统打了个AI补丁:数据库表结构照旧,业务流程照旧,只是在某个角落塞了一个LLM接口,生成一段文字或做一次意图分类。这种方案不能说没用,但它永远是"加在后面的东西"。agent-native(智能体原生)这个概念,逼着你换个顺序思考——先把"一个会自主行动的智能体"放进架构图的核心位置,再来设计数据、权限、审计和交互。它的适用对象不是跟风做Demo的人,而是真正想把Agent放进生产流程、让系统自己拆目标、选工具、执行动作、承担结果的人。
要理解agent-native,最反直觉的一点是:它不是某种技术框架,而是一套应用形态的设计默认值。系统里有一等公民叫Agent,它有目标、有短期和长期记忆、能调用工具、能根据执行结果修正下一步。用户的角色也因此从"操作者"变成了"下发目标和审批结果的人"。这篇内容会从概念演进讲到手写骨架,再给一个真实重构案例和边界思考,全是我自己在项目里真正跑过的路线。
1. 从API-native到agent-native:应用架构的一次位移
1.1 三代应用的定位差异:操作员、插件与决策主体
在Agent概念爆火之前,行业里先经历了一轮API-native的洗礼。所谓API-native,指的是系统从设计之初就假设"调用方不一定是人,可能是另一台服务器",所以接口可以按机器可读的规范(OpenAPI、GraphQL Schema)暴露,鉴权、限流、幂等全部围绕程序化调用设计。没有这轮铺垫,今天Agent调用外部工具的技术土壤根本不存在。
传统应用是"人操作,机器记录",API把操作权交给了机器,而LLM应用则试图把"判断权"也交给机器。我习惯把这三代划分成:
- 传统应用:流程写死在代码里,用户是操作员,系统是执行器。设计核心是"页面里的每个按钮必须有一个确定触发时机"。
- AI增强应用:保留原有业务骨架,在局部(客服、写作、分类、检索)接一个LLM接口。设计核心是"给某个人类操作环节配一个参谋",但不改变所有权和责任归属。
- agent-native应用:把Agent当作与数据库、消息队列同级的一等公民。系统先假设"有一个智能体要自主完成目标",再去设计记忆、状态、工具权限和人工审批点。设计核心从"操作界面"变成了"行为轨迹"。
这三者之间没有绝对的高下之分,但很多团队走错了地方:明明业务流程极其稳定,却硬要套上Agent外壳;明明目标开放、需要动态规划,却只用一个"LLM分类器+规则"的薄层糊弄。先把应用形态定位清楚,再谈技术选型,是agent-native落地最重要的一步。
1.2 agent-native的"三个默认":自主、不确定、可委托
agent-native之所以难落地,是因为它有三个和传统架构冲突的默认值。我做过的项目里,每次架构被推翻重来,几乎都是因为团队没提前接受这三个默认值。
第一个是默认自主。传统架构默认"每件事都要人来触发",agent-native反过来,默认智能体可以自主走完整个链路:读取上下文、拆解目标、调用工具、根据结果修正计划。但"默认自主"不等于"完全放权",而是说约束必须显式写出来。比如一个退款Agent,系统默认它可以完成"查询订单、评估条件、发起退款"整条链路,但"金额超过500元必须人工审批"是一个显式的约束。约束写不写、写在哪一层,直接决定这套系统是shi山还是可控工具。
第二个是默认不确定。传统接口输入输出是确定的,你传一个订单号,返回订单数据,一次不差。LLM不是,同样的用户问题,温度调到0也可能给出不同方案。agent-native要求你在架构层面接受概率性,并为这种不确定性准备护栏:超时、最大重试轮数、白名单动作、失败降级、强制人工接管。
第三个是默认可委托。用户的角色变了,从"亲手点击按钮"变成"下发目标、审批关键动作、处理异常例外"。这意味着权限模型必须支持"操作者不是人"的场景:Agent要能调用工具,但调用范围和额度必须可审计、可单次吊销。没有委托设计,Agent做得再好也只能停留在"建议",落不了地。
1.3 一个常见误判:装了Agent框架不等于agent-native
我见过一个很典型的现象:团队引了LangGraph、搭了几个节点,就在汇报里写"我们落地了agent-native架构"。但你把他们的流程图拉出来看,一半的节点是规则引擎和if-else判断,LLM只是被当成分类器用。这就叫"用了Agent框架,但不是agent-native"。
判断标准其实很朴素:如果把所有LLM调用都抽掉,换成一组确定性规则,这套系统的核心架构还"站得住"吗?如果站得住,那它本质上是一个规则系统加几个AI节点,不是agent-native;如果站不住——因为系统的核心逻辑就是围绕"一个能感知状态、挑选工具、执行动作并自我修正的智能体"来设计的——那才是agent-native。
另一个反向误判是"agent-native等于一个Agent干所有事"。不是。agent-native应用里完全可以没有"Agent"这个实体,只要系统是为"主体性行为"设计的。比如可观测性基础设施、工具注册与权限中间件、记忆服务,这些组件本身不是Agent,但它们是agent-native架构的基础设施。判断一个系统是不是agent-native,看的是它把"自主智能体"当作核心设计约束,而不是看它有没有Agent这个词。
2. 撑起agent-native的四根梁柱:记忆、工具、编排与评估
2.1 记忆:三层分离,别把向量库当唯一答案
没有记忆的Agent不是Agent,顶多是一个带参数的prompt模板。我在实践中把记忆拆成三层,每一层解决不同问题:
工作记忆就是当前会话的上下文和显式状态。它最朴素也最重要,很多人忽略的是"显式状态"要优先于"上下文"。比如客服Agent里"用户是否已经同意退款"这件事,应该是一个状态字段,而不是靠大模型去上下文里推断。状态机里的每一个转移条件都应该是确定性的显式字段,LLM只负责"从自然语言里抽取意图并映射到状态变化",而不是替状态背锅。
长期记忆解决的是跨会话的知识沉淀,实践中约80%的需求用外置DB做结构化存取就够了,剩下20%才需要考虑向量检索。我见过太多团队一上来就搭向量库,结果召回一堆语义相近但业务无用的内容。设计原则是:能存字段就别存向量,能SQL检索就别做embedding。比如"用户VIP等级"这种信息,直接放结构化存储里,Agent需要时按用户ID精确读取。向量检索只适合那些确实无法结构化的内容,比如历史对话片段、产品手册片段。
情景记忆是Agent的"自我回顾能力",记录它做过的每一步动作和观察到的结果。这一层直接决定了后面要讲的"可观测性"。没有情景记忆,Agent做错了一步,你完全无法回溯它为什么做出这个决定。
三层记忆合在一起,Agent才有"连续性"。每次用户回来说"上次那个事怎么样了",Agent不是靠运气理解,而是凭情景记忆把上次的轨迹拉出来,结合长期记忆里的用户画像定位上下文。这才是agent-native该有的体验。
2.2 工具即契约:模型靠"描述"理解边界
Agent要落地,离不开工具调用。但很多人把"工具"理解成"老接口的HTTP封装",这是错位。在agent-native系统里,工具是模型决策的延伸,模型的判断质量从很大程度上取决于工具描述的质量。
一个合格的agent工具必须包含四部分:功能说明(这个工具是干什么的)、参数Schema(JSON Schema格式,模型据此生成入参)、副作用声明(是只读还是写入,是否涉及资金/权限)、错误模式(什么情况下会抛错,模型拿到错误后该怎么应对)。多数系统只做了前两项,导致模型在错误边缘反复试探。
我最想分享的一条经验是:在描述里写"什么时候该用我,什么时候不该用我",效果立竿见影。举个例子,订单查询工具,初始描述只写了"获取订单信息",模型在用户问物流时也会调它。把描述改成"仅当用户询问订单金额、商品明细、订单状态时调用。物流问题请使用query_logistics工具",误用率立刻降下来了。模型的工具选择能力本质上是一个阅读理解任务,你给它的说明书越接近真实业务场景,它的选择就越准。
工具数量超过15到20个之后,模型的选择精度会肉眼可见地下降。那时候需要引入工具路由层:先通过规则或一次轻量LLM调用缩小候选工具范围,再让主Agent做精细选择。否则Agent会频繁选错工具,返工成本远超你省下的那点API费用。
2.3 编排:最小闭环与反思循环的成本
agent-native系统不是只有一个Agent在前台孤军奋战,它背后有一套编排逻辑。所有编排模式里,我认为第一个要跑通的是plan-act-observe-reflect这个最小闭环。Agent拿到目标后先形成计划(哪怕只是几条粗糙步骤),然后执行工具调用,观察执行结果,如果失败就反思原因并调整下一步。这个闭环越早跑通,越能为后续复杂编排打底。
单Agent优先是我反复强调的原则。多Agent协作在工程上的复杂度是几何级上升的:通信用什么契约?谁的结论优先?如何避免上下文互相污染?我建议除非业务场景天然就是多角色博弈(比如甲方乙方谈判模拟),否则先尝试压缩成单Agent加若干个工具,跑不动了再拆。
反思循环的成本要精打细算。一次"反思-重试"消耗的不是一次LLM调用,而是两到三次:读轨迹、生成新计划、重新决策。如果每次失败都无条件反思,成本会翻倍。我的做法是:前两次失败允许反思,第三次失败直接降级给人工或走兜底规则。反思的前提是"失败原因可以被判断为可修复",如果底层的工具本身报500错,反思十次也没用。
2.4 可观测性:agent-native的第一公民
传统应用出了问题,翻日志就行;agent-native应用出了问题,你要翻的是"思维日志"——模型看到了什么上下文、为什么选择了这个工具、工具返回了什么、它下一步打算怎么办。这套轨迹数据在agent-native系统里不是辅助,而是基础设施。
我要求每个Agent动作都落到结构化Trace里,字段至少包含:Agent输入、决策输出、选中工具、工具入参、工具结果、耗时、置信度。这套Trace有几个用途:故障回放、提炼回归测试集、人工审计、成本核算。尤其是"从事故中提炼测试集"这件事,几乎重塑了我们的测试体系。
传统自动化测试在agent-native面前会失效,因为LLM的输出是概率性的,你没法断言"这句话一定出现"。所以需要引入轨迹评估:给定输入场景,验证Agent是否做出了正确的工具选择、是否在错误发生时有合理的补救行为、最终结果是否达到业务目标。这些评估集不是凭空造的,就是靠Trace从真实线上行为里提炼的。先有Trace,再谈Eval,顺序不能反。
3. 手写一个agent-native骨架:不依赖重量级框架的落地路径
3.1 选型判断:框架、工作流还是裸状态机
拿我自己早期项目举例,当时市面上Agent框架已经不少,但每个框架都在强行给业务定编排模式。包括LangGraph、LlamaIndex Workflows,各有优势,但也各有约束。最终做选型时,我列了一张权衡表给自己团队看:
| 方案 | 优势 | 劣势 | 适用场景 |
|---|---|---|---|
| 通用Agent框架 | 生态成熟、组件齐全 | 抽象层级高,出了怪问题难排查 | 快速原型、流程偏固定的场景 |
| Workflow引擎 | 状态转移可视化、确定性可控 | 灵活性受限,不适合动态规划 | 流程可预先穷举的复杂业务 |
| 裸状态机+工具注册表 | 完全可控、易于审计和扩展 | 需要自己维护基础能力 | 生产级、需要深度定制的agent-native系统 |
我的倾向不是否定框架,而是建议第一版用裸实现搭出最小骨架,哪怕只有两三百行,跑通了再决定要不要上框架。为什么?因为框架会把"状态管理""工具调用""记忆接口"这些核心组件的所有权拿走,一旦出问题,排查成本很高。而agent-native系统最基本的状态流转,自己维护一个dataclass反而更透明可靠。
3.2 骨架代码:状态、注册表、循环与Trace
先定义一个最核心的状态对象:
from dataclasses import dataclass, field @dataclass class AgentState: goal: str tool_calls: list[dict] = field(default_factory=list) observations: list[str] = field(default_factory=list) plan: list[str] | None = None status: str = "running" # running / done / failed / needs_human round: int = 0然后是工具注册表。每个工具除了实现函数本体,还必须带上完整的机器可读描述:
TOOLS = { "search_kb": { "description": "检索知识库获取标准答案。仅当用户问题属于常见流程类问题时调用;涉及具体订单数据请先使用query_order。", "parameters": { "type": "object", "properties": {"query": {"type": "string"}}, "required": ["query"], }, "action": search_kb_impl, # 真实执行函数 "side_effect": "read_only", }, "issue_refund": { "description": "执行退款操作。需用户明确表达退款诉求且金额在限额内才可调用;金额超过500元时禁止直接调用,必须先请求审批。", "parameters": { "type": "object", "properties": { "order_id": {"type": "string"}, "amount": {"type": "number"}, }, "required": ["order_id", "amount"], }, "action": issue_refund_impl, "side_effect": "write_money", }, }主循环是骨架的心脏。它的职责是让模型决策、工具执行、结果观察、状态更新形成一个闭环:
MAX_ROUNDS = 6 def run_agent(initial_state: AgentState, planner_fn): state = initial_state for _ in range(MAX_ROUNDS): if state.status != "running": break decision = planner_fn(state, TOOLS) state.tool_calls.append(decision) if decision["action"] == "finish": state.status = "done" break if decision["action"] not in TOOLS: state.status = "failed" break try: result = TOOLS[decision["action"]]["action"](**decision["arguments"]) state.observations.append(f"{decision['action']} -> {result}") except Exception as exc: state.observations.append(f"{decision['action']} ERROR -> {exc}") state.round += 1 write_trace(state) return state这段代码看起来简单,但它把agent-native系统最重要的几个决策都显式化了:最大轮数(防止死循环)、状态流转(每个动作都更新观察)、Trace落盘(每一个路由备查)。把这段骨架跑通,才谈得上替换成任何重量级框架。planner_fn本质上是一次LLM调用,你把当前状态和工具描述拼进Prompt,让它输出结构化JSON。这里的关键是"决策结果必须是一个可校验的JSON动作",而不是自由文本。
3.3 把不确定性关进笼子:超时、断言与人工审批
骨架跑通后,第一件要做的事不是加新工具,而是加约束。我总结的"不确定性三层防护"是:
- 动作级防护:每个工具调用设定超时上限,超时就整体降级;工具执行前用JSON Schema严格校验参数,模型少传了字段就自己提示错误,而不是发起一个异常请求。
- 循环级防护:上面代码里的MAX_ROUNDS只是一个维度,还要设定"最大反思次数"和"失败重试上限"。我的经验是总轮数不超过8轮、同一工具连续失败不超过2次,超过直接标记需要人工介入。
- 人类监督分级:把所有工具按风险分等级。只读类和低风险写入可以自动执行;中风险要二次确认;像退款这种高风险动作,必须由人工审批。不要让Agent自己决定"我是否要审批",由架构提前声明,Agent没有跨域权限。
我见过很多团队在demo阶段跑得非常顺,一上生产就事故频出。绝大多数原因不是模型不够聪明,而是约束没加够。让Agent自主不难,难的是在每一层都留一个"人还能插得上手"的口子。这个口子就是审批、审计和降级,不是模型能力问题,是工程问题。
4. 重构实录:一个售后工单助手从"LLM补丁"变成"工单执行体"
4.1 前传:加一个"AI建议"按钮为什么别扭
我们团队做过一个售后工单助手,早期方案很朴素:在现有工单系统旁边塞一个"AI建议"按钮,点击之后LLM基于当前工单生成一段回复建议或退款建议。上线后有两个数据让我们警觉:一是建议被采纳率不到一半,二是客服mark"建议不可用"时,理由高度集中在"它不清楚上下文"。
当时的痛点很典型。第一,上下文不连贯:工单里用户可能先说"我要退货",后面又说"算了还是换货吧",AI建议按钮只看到当前这一屏,前面所有对话它都没访问,给出的建议自然驴唇不对马嘴。第二,跨系统操作没法落地:查订单、查物流、查历史退款记录都在不同后台,AI建议只能输出一段文本,无法真正执行。第三,任务做到一半等于没做:需要连续动作的流程,比如先查历史退款再判断风险等级,AI建议每次都要重新走一遍,没有"做到哪一步了"的状态概念。
这些问题叠加起来,让我认识到这不是prompt工程可以解决的,而是应用形态选错了。该给一个"AI按钮"的地方是"AI增强应用";当业务流程需要连续决策、跨系统执行、逐步纠偏时,它就该是agent-native。
4.2 重构Key Design:工单状态即环境状态
重构后的系统做了一个关键决定:让工单本身成为Agent的环境状态。每个工单在Agent视角里就是一个可读取、可写回的联合体——工单内容、用户历史、订单数据、物流轨迹、Agent自己的处理进度,全部绑定在一起。
Agent的执行流程大概是:收到新工单时,先主动调用query_order、query_user_history、query_logistics,把所有关键信息读进工作记忆;然后它会在自己的计划区里写一个处理计划,比如"先确认用户诉求是否为退款,再校验订单是否在退款期内,如果满足条件生成退款建议并提交审批";接着按计划逐步执行。每一步执行结果都会写回工单状态,用户再次追问时,Agent能准确知道"这事已经做到哪一步了"。
工具集被重新设计成六类:
| 工具 | 作用 | 风险等级 | 是否需要审批 |
|---|---|---|---|
| query_order | 查询订单详情 | 只读 | 否 |
| search_kb | 检索知识库 | 只读 | 否 |
| query_user_history | 查询用户历史工单/退款记录 | 只读 | 否 |
| append_note | 在工单上追加处理备注 | 低风险写入 | 否 |
| generate_reply | 生成给用户的回复草稿 | 低风险写入 | 否 |
| issue_refund | 执行退款(有金额阈值) | 高风险写入 | 金额超500元需审批 |
这个重构最核心的变化在于,Agent不再是被动响应按钮的"建议机",而是能够在工单生命周期里主动执行、跟踪、收尾的"执行体"。用户要做的只是下目标和在关键节点审批。
4.3 受限自主:先做观测,再放开权限
这个项目还有一个我特别想强调的经验:自主性不是一步放到位的,而是用"观测-模拟-渐进放开"三步走跑出来的。
第一步是纯观测模式。Agent上线后只做决策和生成建议,但所有动作都不实际执行,只落Trace和模拟结果。我们用这个模式在真实工单流里跑了一周,收集了大量"Agent认为该做什么"的记录,再和人工实际处理做对比,发现它建议质量的准确率已经可以接受,这才进入第二步。
第二步是"建议-审批"模式。Agent自动执行只读工具,高风险工具生成建议,由人工一键确认。这个阶段,客服不再是从零打字,而是审单员,效率提升明显。关键的是,这一步让我们收集到了足够多的"人类修正轨迹"——Agent说该退款,人工驳回了,为什么驳回?是金额判断有误还是风险偏好不同?这些修正轨迹又反哺了评测集和prompt迭代。
第三步才在特定低风险场景放开全自动。比如设定仅当订单金额小于200元且用户明确表达退换货诉求时,Agent可以自动执行退款并发送通知。高风险的退款场景仍然走人工审批。上线后的效果数据是本团队实测值:首轮解决率从重构前的34%升至52%,平均处理时长比纯人工路径压减约40%,人工介入率维持在30%左右——这30%主要就是超限额退款和负面情绪升级场景。数据算不上顶尖,但我认为是"受控自主"里比较稳健的状态。
5. agent-native的代价与边界:什么时候不该用
5.1 三类典型的不适配场景
聊agent-native聊得多了,我发现一个规律:越是技术驱动的人,越容易把整个公司所有系统都往Agent上套。但冷静下来看,至少有三类场景明显不该走agent-native。
第一类是延迟敏感或时序极关键的系统。Agent的决策链路是"LLM推理 + 工具调用 + 反思",延迟天然不可控。支付风控、高频交易这类系统,一个决策要在一百毫秒内完成,你让模型在链路里走一轮plan-act-observe,黄花菜都凉了。这类系统应该用确定性规则和专用模型,Agent最多在后端拿到最终结果后做总结汇报。
第二类是责任边界无法划清的场景。Agent本质是概率性决策系统,它一定会犯错。如果业务场景不允许出现"这个错误由谁负责"的灰色地带,你就得想清楚人工兜底机制。比如医疗诊断建议、涉及法律的合同修改,技术上可以做到,但责任归属如果不先谈清楚,上线就是给自己埋雷。
第三类是流程高度固定、条件可穷举的场景。用户提交表单、系统校验、走审批流、归档——这种场景用规则引擎和工作流引擎就足够,成本和稳定性都远优于Agent。强行套agent-native,等于开着航母去菜市场买菜。
5.2 成本结构的位移:token只是冰山一角
agent-native的成本结构很骗人。很多老板一问"这个Agent要花多少钱",听到token单价觉得便宜,就批准立项。实际上,token费在整个TCO里占比通常只有两到四成,真正烧钱的是另外三块。
第一块是纠错成本。Agent每做错一个决定,都需要人工介入修正。这个成本不体现在API账单上,但体现在客服和运营的工时里。而且Agent做得越自主,纠错的单位成本越高——出了问题不只是改一段话,可能要改状态、撤操作、给用户道歉。
第二块是审计成本。因为系统是概率性决策,每一单都不能盲信Agent,需要轨迹审计或抽检。抽检比例越高,人力成本越大;抽检太低,风险又会积累。怎么平衡,只能靠业务对风险的承受力来定价。
第三块是开发链路变长。agent-native系统要搭Trace、Eval、护栏、审批流,这些在传统规则系统里都不存在。前期基建成本比想象中高得多。我见过不少团队demo只用了一周,但把护栏和评测做到能上生产的程度,整整花了一个月。
控制成本的思路不是节流,而是分流。把简单请求先经由规则或轻量模型处理,只有需要动态规划的复杂任务才进入完整的Agent链路。这相当于给Agent前加了一道"筛选漏斗",让它只在真正需要"智能"的地方工作。
5.3 一张决策清单及其背后的判断逻辑
这几轮项目做下来,我给自己沉淀了一张决策清单,每次被问"我这个系统要不要做agent-native"时,我都会按顺序过一遍:
- 任务是否可以穷举为if-else规则?是,则不要用Agent。规则系统更便宜、更稳定、更容易审计。
- 任务是否可以分解为固定的DAG工作流?是,则用Workflow引擎,而不是让Agent做动态规划。固定的DAG意味着编排逻辑可以在编码期确定,不需要运行时决策。
- 是否需要动态规划、多步推理、工具选择空间大?是,这才是agent-native的主场。Agent的价值恰恰体现在目标和路径不是提前写死的地方。
- 是否能接受一定的失败率,并有人工兜底机制?否,则建议缓行。Agent一定会犯错,没有兜底就上线,信任会被一次事故清零。
- 是否已有Trace和Eval基础?否,则先补观测,再谈自主。没有观测数据,你连Agent错在哪、为什么错都不知道,讨论任何优化都无从谈起。
这套清单看似朴素,但几乎挡掉了一半以上的"伪需求"。很多团队的场景,真正需要的其实只是"AI增强",即一个轻量LLM节点加规则,连Agent骨架都不用搭。
最后再分享一点个人体会。我最初做agent-native时,也犯过"大而全"的毛病,想让Agent处理尽可能多的任务,结果系统变得极其难维护——每个边缘case都要在prompt里打补丁,越补越乱。后来把Agent的行为边界收缩到"工具契约能清楚描述的范围"内,反而质量稳定了很多。"自主"的真正含义,不是让系统无限全能,而是让每一个自主动作都显式可见、可审计、可干预。如果要给刚踏上这条路的团队一个建议,我会说:先给现在的系统写一周的Trace日志,再决定要不要把控制权交给智能体。观察先于自主,是agent-native落地最不容易被绕过的一课。