先说个我最近常遇到的场景。好几个团队跟我聊系统架构时,开口就是“我们要做AI Native改造”,结果翻看他们现有架构,无非是在Spring Cloud微服务上挂了个OpenAI SDK,或者在Web服务里加了个向量检索接口。这其实还处在“AI增强传统系统”的阶段,离真正的AI Native差着不小的距离。AI Native的核心不是“在系统里用AI”,而是“让AI成为系统运行时的一部分”——状态由模型推导、控制流由推理决定、数据布局以模型理解为前提。这篇文章不打算讲概念玄学,直接聊聊我从零搭建一个AI原生业务系统时的决策链路、分层逻辑,以及那些文档里不会提示你的坑。
1. 先分清“AI增强”和“AI Native”:大多数系统死在这条分界线上
很多团队没有意识到,他们做的不是AI Native,而是AI增强。这两者的架构决策完全不同:增强模式还保留着传统系统的控制边界,模型只是藏在某个服务里的功能模块;Native模式则要求你重新思考实体、状态、流程和接口的定义方式。
1.1 三种阶段的架构特征对比
我习惯把AI落地分成三个阶段:
| 阶段 | 决策者 | 状态来源 | 接口形态 | 典型问题 |
|---|---|---|---|---|
| AI辅助 | 人类/传统逻辑 | 数据库事务 | REST同步 | 模型只是计算器,能力被封印在接口里 |
| AI增强 | 传统逻辑为主 | 业务状态+模型输出 | 混合接口 | 模型与业务逻辑互相拉扯,边界混乱 |
| AI Native | 模型推理为主 | 推导状态+外部事实 | 流式+事件驱动 | 调试和验证困难,需要全新观测手段 |
很多人误以为“把LLM接入系统就是AI Native”,这是目前我看到的最大误判。
1.2 AI Native的四个判断标准
我判断一个系统是否真的“AI Native”,只看四件事:
- 状态是否由模型推导。比如一个工单能否被自动关闭,不是代码里写死的“状态机+条件分支”,而是模型看完上下文后给出的结论,规则只作为安全兜底。
- 控制权是否交给推理。路由到哪个模块、查询哪些记忆、调用哪几个工具,由模型在运行时决定,而不是前端写死。
- 反馈回路是否成为一等公民。系统需要具备“自省”能力:每次推理结果会回流为评估信号,从而影响下一次推理策略。
- 数据布局是否以模型理解为前提。原生系统不再单纯按关系型范式组织数据,而是把语义索引、嵌入向量、上下文快照作为核心结构。
1.3 为什么传统微服务分层的边界会在这里失效
传统分层依赖“接口契约稳定”这个前提,本质上系统内部结构是预定义好的。但AI Native系统里,模型输出天然不稳定——同一个意图今天的表达和明天可能就不同。当你把AI作为核心时,分层边界不能让服务间相互暴露细节,而是要围绕“意图→推理→行动→反馈”这条链路重新划分。我见过很多团队强行把GPT输出塞进原有的“控制器-服务-仓储”结构,结果控制器里塞满了Prompt拼接逻辑,服务层成了遗忘记忆的垃圾桶,仓储层存了一堆不知道如何查询的长文本。这些都是因为分层的设计初衷与AI的运行方式不匹配。
2. 从零开始的骨架搭建:模型接入、Agent运行时、记忆层、服务层
如果抛开业务细节,一个从零开始的AI Native系统骨架通常包含四层。我不扯“参考架构图”那种空话,直接按实际搭建顺序往下走。
2.1 第一层:模型接入层,先做抽象而不是先选模型
很多人第一步是“选个大模型”。我的建议相反,先做模型接入抽象,再谈选型。因为你一定会换模型——成本原因、效果原因、领域需求原因,就跟我经历过的同一个系统在半年内从GPT切到Claude又切回国产开源模型一样。我推荐的接入模式是统一网关接口,内部做Provider适配。伪代码大致这样:
class LLMProvider(ABC): @abstractmethod async def chat(self, messages: list[dict], params: SamplingParams) -> ChatResponse: pass @abstractmethod async def stream_chat(self, messages: list[dict], params: SamplingParams) -> AsyncIterator[str]: pass @abstractmethod def embed(self, texts: list[str]) -> list[list[float]]: pass抽象之后,每个具体Provider只负责协议转换、重试、速率控制。这一层里有一个容易被忽略的细节:统一处理工具调用的格式。不同模型的function calling协议格式不一样,如果你不在这层做归一化,后面的Agent运行时就会被模型厂商绑死。
另外,我在实际项目中强烈建议把“流式输出”作为默认能力。原因不只是用户体验,更重要的是流式输出能让你在长任务场景里持续拿到中间状态,这关系到后面的可观测性和自省循环设计。
2.2 第二层:Agent运行时,这是AI Native的“操作系统”
Agent运行时是整个系统的中枢,负责四件事:任务解析、推理规划、工具调度、上下文管理。打个比方,传统系统的操作系统管进程和内存,Agent运行时管理的则是“意图”和“推理上下文”。
任务解析这步很容易被做成“把用户问题丢给模型完事”,这是错误的。我建议做一次意图归一化:不管用户说的是“帮我查一下张三的订单到了没”还是“我买的东西啥时候能送到”,先解析成结构化的意图对象:
{ "intent": "query_order_status", "entities": {"user_name": "张三", "target": "order_status"}, "confidence": 0.92, "fallback_strategy": "ask_clarification" }这个结构化的中间表示非常关键。它让你的系统不依赖特定模型的输出格式,当底层模型换掉时,上游业务不感知。同时,它也是调试和权限控制的重要抓手——很多安全策略要加载意图层,而不是模型输出层。
工具调度这块,我推荐“注册表+模型选择”模式。系统里有一个工具注册表,每个工具声明自己的能力描述、入参Schema、权限级别。模型在推理时根据用户意图和工具描述决定调用哪个工具以及传入什么参数。这里最大的坑是工具描述写得太抽象,模型无法理解。举个例子,同样的接口,“确认收货”写成“调用confirm_receipt接口并将order_id作为唯一参数”和“当用户表示已经收到商品并希望完成交易时,调用此工具,传入订单号”,后者的调用准确率会高出好几个百分点。写法本质上是在为模型编写“使用说明”,这是AI原生系统和传统系统的一个显著区别。
2.3 第三层:记忆层,区分短期工作记忆、长期语义记忆和外部事实
AI系统的记忆机制如果做不好,再多模型能力也白搭。我会在第四章单独展开讲,这里只说说骨架层面的划分思路。
我把记忆划分为三种:短期工作记忆(当前会话的推理上下文窗口)、长期语义记忆(跨会话的用户偏好、历史行为摘要)、外部事实(业务数据库、文档库、知识图谱)。骨架层面的关键在于:设计好记忆的读写接口,让Agent运行时对三种记忆一视同仁。你可以想象成给Agent接了一个“海马体”,它需要能在推理的任意时刻按需读取相关记忆片段,并定期把重要的上下文沉淀回长期记忆。
2.4 第四层:对外服务层,同步接口收敛、流式接口优先
对外服务层是传统架构里最容易照搬的部分,但有两个关键调整。
第一,同步接口要大大收敛。传统系统里几乎每个服务都暴露同步CRUD接口,但AI Native系统里,外部消费者更多是提交“意图”而非下发“指令”。这类似于从RPC式交互转向“目标式交互”。比如,传统接口是“创建工单”“分配处理人”“更新状态”,AI原生接口则是“处理这个客诉事件”,具体如何拆解由系统推理完成。
第二,流式接口和事件接口的优先级高于同步接口。因为模型推理是渐进式的,结果不是一个瞬间产出的一整块数据,而是一个流。客户端要能实时看到“正在理解”“正在检索”“正在调用工具”“正在生成回答”等中间状态。这个设计不仅改善体验,也为后端的反馈回路提供了天然的信号通道。
3. Agent形态的选择:单Agent、多Agent协作还是编排调度
Agent架构是当前讨论最密集、概念最混乱的部分。热搜词里大量出现“AI Agent 主流架构”“Agent架构”“多AI协作”,说明大家都卡在这里,但恰恰也是这里最容易走偏。
3.1 三种形态的对比
| 形态 | 适用场景 | 优点 | 主要风险 |
|---|---|---|---|
| 单Agent | 任务边界清晰、工具数量少(<10) | 头脑简单,上下文一致性好 | 工具一多就紊乱,上下文爆炸 |
| 多Agent协作 | 复杂任务、不同领域知识隔离 | 各司其职,系统边界清晰 | Agent间通信开销大,目标对齐难 |
| 编排调度 | 子任务可拆解、可并行、需复用 | 灵活度高,失败定位相对容易 | 规划策略本身依赖模型能力,不稳定 |
3.2 单Agent模式:够用就不要上复杂度
我见过很多新手团队一上来就设计七个Agent协同工作,结果一个会话下来Agent之间互相踢皮球,谁也完成不了任务。我个人的实践原则是:先单Agent,单Agent解决不了再加层。
单Agent适合的场景特征很鲜明——任务边界至少从业务视角是清晰的,比如“智能客服问答助手”,基本都是“理解问题→检索知识→生成回答”。单Agent最大的坑是上下文窗口被工具调用过程占满。一个长任务的工具调用轨迹可能消耗几千token,真正留给用户上下文和思考的空间就少了,常常出现“模型忘记最开始的目标”这种问题。我的解决方式是在Prompt里写“目标锚定段”,每轮工具调用后重述当前目标和已完成步骤,强制模型做个“进度状态盘点”。
3.3 多Agent协作的三种编排模式
如果需要上多Agent,通常有三种编排模式:
- Pipeline模式:任务按固定流程流动,Agent A的输出作为Agent B的输入。适合流程相对固定的场景,比如“意图识别Agent → 信息抽取Agent → 答案生成Agent”。
- Hub-and-Spoke模式:一个主控Agent负责拆解任务并分发给多个子Agent。适合任务不确定、需要动态拆分的场景。这是目前最稳的主流方式。
- Peer-to-Peer模式:Agent之间平等沟通、互相提问。这个看起来很美,实际上最容易失控,慎用,除非你做了严格的消息协议约束。
我个人在主控模式下最推荐“主控只做规划,不做执行”的拆分。主控Agent负责理解目标、拆解步骤、检查子Agent的产出质量;子Agent只做具体的专业操作,比如“检索文档”“操作业务系统”。好处是主控的上下文不受具体工具调用污染,规划质量更高。
3.4 一个实际的选型案例
我之前做过一个工单自动处理系统,初始设计是“单Agent一把梭”,跑了两个月后发现问题:处理普通工单还行,但一旦涉及退款决策、库存查询、客户情绪安抚等多个目标时,单Agent的表现直线下降。后来改成三段式编排:入口Agent做分类和情绪识别,业务Agent分组处理不同域的工单,质检Agent在最后做合规审查。整体准确率提升了约30%,而且最关键的收益是可调试性——你终于知道问题出在哪个环节,而不是在一团乱麻的会话里猜原因。
4. 记忆与状态:AI Native系统里最容易翻车的持久化层
记忆层是我见过翻车最惨烈的地方。很多团队用的向量库存一切,出了问题就归因“向量检索不准”,其实问题往往出在记忆建模本身。
4.1 为什么传统数据库和纯向量库都不够用
传统关系型数据库适合存储强结构数据,但AI系统里占大量比重的是非结构化语义信息,它的价值在于“语义关联”而不是“字段精确匹配”。纯向量库的问题则相反:它适合语义相似检索,但不能保证精确性,而且没有事务和一致性机制。AI Native系统的持久化层应该是“分类存储、按需组合”的混合方案。
| 数据类型 | 存储方式 | 查询方式 |
|---|---|---|
| 用户偏好/语义记忆 | 向量库 | 相似度检索 |
| 事实记录/交易数据 | 关系型数据库 | SQL精确查询 |
| 决策轨迹/推理链路 | 文档库或日志系统 | 按时间+关联ID遍历 |
| 高频快照/上下文压缩 | KV存储 | 直接键值读取 |
4.2 短期工作记忆的Token预算管理
工作记忆的关键是Token预算。我给团队定的经验值是:整个Prompt的token分配中,系统指令不超过20%,上下文记忆不超过50%,工具声明不超过15%,给模型思考留至少15%的余量。一旦超出预算,优先级从低往高依次裁剪。这里有一个反直觉的点:工具声明往往最容易被过度保留,很多工具Description写了一大堆,调用率却极低。我后来做了一个工具用量统计功能,把两周内零调用的工具Description压缩成一行,Prompt长度直接降了三分之一,推理速度和成本都有可观改善。
4.3 长期语义记忆的沉淀与读取机制
长期语义记忆不能简单靠“把所有历史对话向量化”,这样会存很多垃圾且检索效果差。更靠谱的做法是设置“记忆沉淀器”——每轮任务结束后,用一个独立的规约模型把本次会话压缩成结构化摘要,包括用户的偏好、未完成的事项、关键事实,然后才写入长期记忆。这就像你的大脑不会记住今天午饭嚼了多少下,而只会记住“这家店口味偏咸,下次少放盐”。
读取机制同样有讲究:记忆不能靠一次性全部灌入上下文,而是要做“主动唤起”。Agent在推理过程中根据当前意图去检索相关记忆片段,检索结果要与当前状态做相关性重排后才进入上下文。这个“按需唤起”机制让系统既具备长期记忆,又不被海量历史拖垮。
4.4 三个高频翻车点和对应解法
第一个是记忆污染。用户随口说的一句话被写进长期记忆,之后每次推理都被这条错误记忆干扰。解法是给记忆加置信度字段和衰减机制:暂时性记忆置信度低,几天内自动衰减淘汰;确认性记忆需要用户二次确认或跨会话重复出现才提升置信度。
第二个是会话漂移。长会话里,用户的意图可能不断调整,原始目标被遗忘。解法是前面提过的“目标锚定段”,每几轮强制模型反思与原始目标的偏差。
第三个是并发一致性。多个会话同时更新同一个用户的长期记忆时,可能产生覆盖或错乱。你需要在写入层做版本号和合并策略,最稳妥的是“新增优先、覆盖谨慎,永不物理删除”,用版本链来保留记忆的演变历史。
5. 可观测性与调试:“自省循环”替代传统排查路径
AI Native系统调试的最大痛点在于:你不是在追一个确定的代码分支,而是在理解“模型为什么做出了这个选择”。传统日志大屏在这里基本失效,你需要为系统设计一套面向推理过程的观测机制。
5.1 三个独立的可观测性维度
我把观测维度拆成三层,追踪链路(Trace)、状态快照(State)、质量信号(Quality)。追踪链路记录一次请求从进入系统到返回的全过程,包括每轮推理的输入输出、工具调用参数和结果、上下文变化。状态快照记录推理发生时系统的记忆状态、用户上下文和决策中间表示。质量信号则是对结果的评估——回答是否被采纳、用户是否追问、工具是否报错。
给每个推理过程打上trace_id,把以上三层数据组织成一个统一的推理轨迹对象。我习惯用JSON格式落盘:
{ "trace_id": "req_7f3a2d", "intent": {"type": "query_order_status", "confidence": 0.92}, "llm_calls": [ { "step": "planning", "model": "gpt-4o-mini", "input_tokens": 1840, "output_tokens": 320, "raw_output": "调用订单查询工具", "latency_ms": 1200 }, { "step": "tool_execution", "tool": "order_service.query", "args": {"order_id": "A1001"}, "result": {"status": "shipped", "eta": "tomorrow"} } ], "memory_snapshot": { "retrieved_chunks": ["用户张三近期投诉过物流延迟"], "working_context": "用户关注配送时效" }, "quality": {"feedback": "thumbs_up", "retry": 0} }有了这种数据结构,你可以回放任意一次推理过程,而不是靠猜。
5.2 AI测试的方法论:Golden Set、对抗样本和突变测试
传统测试框架测试的是确定性逻辑,AI系统的输出天然有随机性,所以测试策略要做根本转变。
我的做法是建立三个测试层级。第一层是Golden Set回归集,把历史上表现最好的一批样本做成评测集,每次升级Prompt、换模型、调参数都自动跑一遍,防止“修一个坏三个”。第二层是对抗样本集,针对系统的薄弱点构造刁钻输入,比如模糊隐晦的表达、双关语、超长上下文、多意图混合,这些是实际运行中最容易出现质量滑坡的场景。第三层是突变测试,对输入做微小扰动,比如替换同义词、乱序、删除标点,看系统输出是否保持稳定。突变测试能很快暴露模型的鲁棒性问题,往往比单纯加样本更有效。
5.3 自省循环:让系统自己评价自己
自省循环是我觉得AI Native最独特的设计,它有两个机制。第一是自动失败探测:系统在生成外部回复前,用一次独立的评估调用检查当前回答是否存在明显缺陷,比如答非所问、缺失关键信息、违背既定策略,如果发现问题就触发重写循环。第二是事后复盘:每天离线分析当天的推理轨迹,把反馈差、重试多的样本聚类,提炼成新的对抗样本加入测试集。
我把这个设计叫作“模型给自己当质检员”。实践下来,让主模型用“双输出模式”——既输出回答又输出回答的自我解释——能把很多潜在错误在出口拦截住。代价是每次推理成本大约增加10%到20%,但换来的是明显的稳定性提升。如果预算紧张,可以只对高价值请求启用自省,而非全量。
5.4 调试工具链搭配
语言模型Debug没有统一的IDE可用,我的常用组合是“会话重放+变量比对”。会话重放就是把上面的trace JSON按时间线播放,可视化展示每个时间点模型看到了什么、做了什么决定。变量比对则是固定输入、只改变一个因素(比如换模型版本、改Prompt措辞、改检索TopK),对比输出差异,以此定位影响质量的关键变量。这个思路跟传统A/B测试很像,但速度要求更高,我通常直接用脚本驱动跑几十组对比,输出差异报告。
6. 模型、成本和安全:决定系统能跑多久的三道约束
最后这部分看起来像运维,实际是架构层面必须提前想清楚的约束,否则后面会面临大规模返工。
6.1 模型选型别再只盯“能力榜”
我建议按四个维度给模型做评估:能力、延迟、成本、可控性。其中可控性容易被忽视,包含是否支持私有化部署、是否支持function calling的稳定格式、输出是否容易解析。实测下来,同样一个Agent流程,有些模型在工具调用格式上频繁出错,让你不得不写大量兼容代码。选型时拿自己真实的业务样本去跑,不要只看公开Benchmark分数。效果上的差距往往没有发布数据看起来那么大,稳定性和成本差异反而更致命。
6.2 路由与降级:大模型、小模型和规则兜底的组合
一个成熟的AI Native系统不会只用一种模型,而是要设计模型路由。我常用的策略是“意图分级路由”:简单任务走快而便宜的小模型,复杂任务走大模型,高风险动作走规则兜底。比如“查询订单状态”这种标准化操作,小模型足够;而“处理用户投诉并提出赔偿方案”则需要大模型推理。
这里的架构关键点在于路由本身你要用规则还是模型决定。我的建议是:能规则就规则,规则决定不了的再让模型判断。因为路由如果也用模型,那你的系统又多了一个不确定点,出了问题排查链路会加倍复杂。
6.3 安全边界:工具权限和输出校验不能省
AI系统的安全问题根源在于:模型可以生成任意文本,而你并不希望所有生成的指令都被执行。我的做法是工具权限的“最小够用”原则——每个Agent只挂载完成自身任务必需的工具,工具的执行前再叠加条件校验。同时,输出层必须挂一道规则过滤器,比如禁止生成外部可执行代码、禁止输出未脱敏的个人信息。尤其涉及业务系统的写操作,一定要设计“拟执行→预览→确认→执行”的流程,模型只负责生成建议执行的动作,最终落地由人为或规则触发。这一点在面向外部用户的系统里尤其重要,属于底线问题。
6.4 成本控制需要架构级的手段
Token成本失控是AI Native项目最常见的猝死原因。架构层面能做的事很多,排名第一的是缓存,把语义相同的请求结果按意图哈希复用;排名第二是分层模型路由,前面已经展开;排名第三是上下文裁剪,很多请求不需要全量历史,按相关性压缩上下文能省下大量Token。这几个手段组合起来,实测能省下大约60%到70%的Token消耗,比单纯跟模型厂商讨价还价有效得多。
最后分享一点个人体会
从一个传统架构系统演进到AI Native,我的建议是不要搞“大爆炸式重写”。最稳妥的路径是挑一条核心业务链路,把它的决策逻辑逐步移交给模型驱动,同时保留规则兜底和人工介入通道。等你把这条链路上的评测体系、可观测机制、成本模型都跑顺了,再横向推广到其他业务。AI Native最本质的改变不是技术栈换新,而是你从“预设所有路径”切换到“信任推理并用工程手段约束推理”的状态。这个转变需要时间,更需要踩坑后的复盘。希望这篇文章的框架和教训能给你省下一些弯路。