最近在做一个从零开始的AI客服和决策辅助系统,团队里反复出现同一个问题:技术方案到底怎么画?是先把模型接进来,还是先把数据理清楚?哪些模块该做成微服务,哪些根本不用拆?这些问题凑在一起,其实就是AI Native研发范式要回答的事。我理解的AI Native,不是把大模型API接到现有工程上就完事,而是把模型调用、上下文组织、评估反馈这些AI特有元素,作为系统的一等公民来设计。这篇文章算是我的实操复盘,会聊核心假设、分层蓝图、与微服务/DDD/六边形架构的融合方式,以及一堆踩坑记录。适合正在做AI产品技术选型、或者准备从存量系统向AI化演进的工程师。
1. 先想清楚:AI Native到底改写了哪些架构假设
很多人觉得AI Native就是引入一个大模型SDK,在Controller里调一下chat接口,其余跟传统架构没有差别。这个理解在第一个Demo阶段没问题,但一旦进入生产,你会发现问题全在架构层面。
传统系统处理的是确定性逻辑:输入A,经过规则计算,输出B,最多有几个分支。AI系统处理的是概率性输出:同样的输入,模型可能给出不同表达,虽然语义可能等价,但形式不稳定。你没法用“返回码是否为200”判断成功,你得判断“回答是否达到了预期效果”。这个差别直接影响设计:你必须额外设计评估、兜底、限流、版本回滚机制,而不是扔给运维就完事。
我常说一句话:传统系统像自动售货机,投币、选货、掉货,逻辑可预期;AI系统像银行柜台经理,不同柜员话术有差异,但业务目标一致。售货机不需要“评估仪”,银行却需要质检监听。AI Native架构的实质,就是把质检能力内建到系统里。
1.1 从“确定性逻辑+数据库”到“概率输出+上下文+评估”
传统架构的核心链路是:请求进来,代码按规则处理,把结果写入数据库。故障模式相对清晰,要么出结果,要么报错。AI系统不一样,模型输出是概率性的,同样的输入今天和明天可能不完全一样,你没法用错误码来描述“回答不够好”。
于是系统里必须多出两个新成员:上下文组装器和评估器。上下文组装器负责把用户历史、领域知识、工具结果拼装成模型能理解的消息序列;评估器则负责判断模型输出是否满足业务目标,可以在线回流信号,也可以在离线阶段跑金标集。
这也解释了为什么AI Native项目通常比传统项目更依赖数据平台。没有评估数据的AI系统,就像没有测试用例的软件仓库,上线全靠赌。
1.2 数据链路由“按ID取数据”变成“组织上下文”
第二个变化是数据流。传统业务系统里,用户点详情,代码查一行数据库记录返回,输入ID,输出记录,干净利落。AI系统需要的是“上下文”:用户最近十次操作、订单状态、知识库片段、工具返回结果,这些数据要在请求时被动态拼装成模型输入。
这个“上下文组装”层很薄但极关键。哪些数据进上下文、哪些不进,按什么优先级,给多少Token配额,都要有明确策略。我见过不少项目把这些逻辑散落在业务代码里,换个模型或调一次Prompt,牵扯一堆地方,最后根本无法维护。AI Native的做法是把上下文策略做成独立模块,甚至独立成服务。
1.3 演进单位从“版本发布”变成“策略热更新”
第三个变化是演进方式。传统系统升级是发版本:修Bug、加功能、重新部署。AI系统更频繁的变化是调Prompt、换模型、改RAG参数、更新知识库版本。这些内容如果每次都要走完整发布流程,团队会崩溃,AI产品也没办法快速迭代。
所以AI Native架构必须支持策略与代码分离。Prompt模板、模型路由规则、温度参数、知识库版本都要能独立变更、独立回滚。这也是为什么配置中心、模型网关这类基础设施在AI项目里格外重要。
1.4 从零开始反而友好,存量改造要循序渐进
从零设计AI Native系统确实更舒服,因为第一天就能定义好模型接入契约、上下文协议、评估数据格式,没有历史包袱。但多数团队是改造存量系统,这时候我强烈建议不要一上来就把AI塞进核心事务链路。
更稳妥的路径是:先用一个旁路场景试水,比如异步摘要生成、辅助建议、风险预判,把“模型输出-人工确认-结果回流”的数据闭环跑通。等团队积累出评估数据集和上下文处理经验后,再把AI逐步抬升为决策主链路。这样做不是架构上的妥协,而是容错成本和团队认知的理性安排。
提示:AI Native不是把所有逻辑都交给模型,而是让系统具备“安全地使用模型”的能力。这个边界想清楚,后面很多决策都好做。
2. 三条核心设计原则:把AI放进决策链路的中心
2.1 Prompt与模型策略必须是“可版本化配置”
第一条原则,把Prompt当成代码来管。提示词不是“写一次就完事”的文本,而是系统的关键资产。它要进Git、走评审、打标签,要能跟随线上请求记录一起归档。
我习惯把每条生产Prompt拆成模板、变量填充规则、模型参数三部分。模板里只写稳定指令,变量部分由上下文组装层注入,模型参数(temperature、top_p、max_tokens)单独配置。这样修改时能精准定位是哪个环节变了,也能快速做A/B对比。
以一个电商售后分类场景为例,Prompt模板可能是:
你是售后工单分类助手。请根据用户描述和订单信息,输出JSON格式的分类结果。 字段包括:category(枚举值)、priority(1-5)、reason(一句话)。 只输出JSON,不要额外解释。变量部分由系统填充用户描述、订单状态、历史处理记录。模型参数统一从配置中心读取。线上每次请求都记录使用的Prompt版本,一旦效果下降,直接回滚到上一个版本。
2.2 上下文工程优先于模型选型
第二条原则,先把上下文组织好,再决定换不换模型。我见过不少团队,效果不好就换更大的模型,结果成本翻倍,准确率只提升几个点。真正的问题往往出在上下文:该给的背景信息没给全、历史记录顺序混乱、噪音数据太多。
我用过一个亲测的例子:一个争议订单处理功能,最初把所有聊天记录、订单明细按时间顺序一股脑拼接给模型,分类准确率只有72%。后来上下文组装层做了三件事:按对话轮次倒序排列、给订单状态加醒目标签、把最近一次客服承诺的原文完整摘出来,准确率直接到91%,同一个模型。这个提升完全来自架构层面,而不是模型能力。
所以AI Native系统中要专门投入资源建设上下文管线,包括信息抓取、相关性打分、Token预算控制、历史压缩摘要。这也是为什么很多项目会引入向量检索而不是只靠拼接。
2.3 评估反馈是核心数据链路,不是事后补丁
第三条原则,评估必须内建到数据链路里。没有评估的AI系统就像没有测试用例的软件,上线全靠赌。
我在系统中至少维护三类评估数据:离线金标集、线上实时指标、人工抽检样本。离线金标集用于发版前验证Prompt或模型变更;线上实时指标包括用户点赞、点踩、是否继续追问、是否复制回答;人工抽检则覆盖那些没有明显行为信号的场景。
评估结果要回流到模型策略配置。比如某个分类的阈值长期偏低,就要去检查上下文是否漏了关键字段,而不是继续加Prompt咒语。相关逻辑可以用一段简单伪代码表达:
def evaluate_prediction(prediction, expectation): if prediction.category != expectation.category: log_trace("category_mismatch", prediction, expectation) trigger_review(prediction.context_snapshot) return False update_daily_metric("category_accuracy", True) return True这段代码看着简单,但架构含义很重:每个评估结果都要能回溯到当时的上下文快照和Prompt版本,否则你根本查不出问题来源。
3. 从零开始的AI Native分层架构蓝图
我根据实践把系统切成了六层,不追求大而全,但每一层边界必须清晰。你可以把它理解成包饺子:馅是模型能力,皮是上下文与安全边界,而锅是评估与可观测性。任何一层出问题,最后端上桌的饺子都会破。
3.1 接入层:会话入口与统一接口
第一层是接入层,负责把所有外部入口收敛成统一的“会话输入”。不管是Web聊天框、OpenAPI、还是企业微信机器人,进到系统后都转换成标准消息格式。这样做的好处是后续所有策略、统计、评测都不需要关心入口差异。
接入层还要做基础的流量控制、身份识别、敏感信息过滤。AI系统里,输入可能直接变成Prompt的一部分,脏话、隐私数据、注入攻击都可能在这里发生危害。所以接入层必须有内容安全策略,不能直接放给下游。
3.2 会话与状态层:上下文组装和记忆管理
这一层负责把原始消息变成「上下文」。它要维护会话级状态,比如用户ID、会话ID、历史消息列表、当前任务阶段。同时负责调用上下文组装器,从知识库、用户画像、订单系统等处拉取信息。
记忆管理是这里的难点。短期记忆就是当前会话的消息列表,长期记忆可能来自向量检索、用户标签、历史会话摘要。系统要决定哪些记忆进入当前提示,哪些归档压缩,哪些丢弃。我的建议是,不要贪心把所有记忆都塞进去,Token成本只是一方面,更重要的是噪音会让模型效果变差。
3.3 编排层:Agent循环与工具调度的边界
编排层是AI Native系统最特别的一层,它负责决定“要不要调用工具、调用哪个工具、如何根据工具结果继续生成”。
这里可以设计一个通用的Agent循环。举个最小实现:
class AgentLoop: def __init__(self, model_gateway, tools, max_steps=10): self.model_gateway = model_gateway self.tools = tools self.max_steps = max_steps def run(self, messages): for step in range(self.max_steps): response = self.model_gateway.chat(messages) if not response.tool_calls: return response.content for call in response.tool_calls: tool_result = self.tools.execute(call.name, call.arguments) messages.append({ "role": "tool", "tool_call_id": call.id, "content": tool_result, }) raise AgentLoopLimitExceeded(self.max_steps)这段代码背后的架构决策很关键:消息历史被当作状态传入,模型网关负责模型切换,工具接口是统一协议。这样Agent循环可以复用到不同场景,不会每做一个功能就重写一遍。
编排层还需要考虑状态持久化。一次多轮Agent交互可能持续几秒甚至几分钟,中间掉线怎么办?需要把消息序列存到Redis或事件流里,恢复时可以继续。
3.4 模型接入层:网关、路由与降级策略
模型接入层要解决的问题是:上层不直接依赖某个具体模型厂商,而是通过一个网关统一访问。
网关至少做四件事:协议转换、流式转发、密钥管理、计费计量。再往上可以增加模型路由,比如简单问题用快而便宜的小模型,复杂推理用旗舰模型;模型出现故障时按降级策略切到备选模型。
我常用一个两层路由策略:第一层根据任务类型路由,比如分类任务走小模型,复杂对话走旗舰;第二层根据实时延迟或错误率降级。降级不是无脑换模型,而是要同步更新上下文格式,因为不同模型对指令的遵从程度不一样。
3.5 数据与知识层:向量库、缓存与事件流
数据层要准备三类存储:业务数据库(订单、用户信息)、向量数据库(知识库切片、历史对话向量)、KV缓存(热点上下文、会话状态、临时记忆)。这三类缺一不可。
知识库的更新要支持版本化。我建议把知识库切片、索引、向量化版本绑定在一起,线上请求记录也要记录当时的知识版本。一旦知识库内容与线上数据不一致,出现“旧答案反复出现”的问题,快速排查的关键就在这里。
事件流在这一层也很重要。用户行为、模型输出、评估结果都应该作为事件落到消息队列里,供后续统计、回放、异步学习使用。不要把事件逻辑揉在各业务服务里。
3.6 评估与可观测层:Trace、成本与指标
最后一层是评估与可观测性。需要做端到端Trace,从用户请求到Prompt组装,再到模型响应、工具调用结果,全链路串起来。这样出了问题能定位是上下文问题、模型问题,还是工具问题。
成本指标要单独计量。每次请求消耗多少Token、成本多少、调用哪个模型、是否走了缓存,都要能统计。这个数据既用于财务核算,也用于模型路由策略的调优。有的模型贵但效果好,有的便宜但效果一般,最终要通过准确率和成本的联合指标来做决策。
这六层之间不是严格的上下游调用关系,有些层之间会有事件回环。比如用户对答案点踩,这个信号会从接入层流入评估层,评估层再触发上下文策略调整,最终影响下一次编排。
4. AI Native与微服务、六边形架构、DDD的融合
说完蓝图,回到大家最常问的问题:AI Native是不是要推翻微服务?跟DDD、六边形架构什么关系?
4.1 微服务不是被取代,而是拆分依据变了
微服务仍然是很多AI系统的基础设施,但拆分依据会加入AI特有因素:模型调用频率、上下文热点、数据血缘。
举个例子,“会话状态”和“上下文组装”这两个模块,如果拆成两个独立微服务,每次对话都要跨网络拷贝大量上下文,延迟和成本都不划算。所以我倾向于把它们放在同一进程内,做成模块化单体。相反,“知识检索”“评估计算”“模型网关”这类独立性强、调用频率不均匀的能力,拆成独立服务更合适。
所以答案是:不要再按传统CRUD的边界拆微服务,而要按“AI数据流”重新划分。一个订单服务可能被拆成订单数据服务和订单决策服务,模型调用放在决策侧。
4.2 六边形架构的端口-适配器思想在AI场景怎么用
六边形架构强调业务核心与外部技术隔离,通过端口和适配器交互。这个思路在AI Native里非常适用。
比如模型网关就是端口,OpenAI适配器、通义适配器、本地推理服务适配器都是可插拔实现。工具调用也是端口,搜索、查订单、发邮件各是一个适配器。业务编排层只依赖端口接口,不依赖具体厂商。
六边形架构还提醒我们:不要让模型返回的原始结构直接污染领域核心。适配器层要做好数据清洗和转换。这里用表格整理一下:
| 端口 | 核心用途 | 典型适配器 |
|---|---|---|
| ChatModelPort | 统一大模型对话接口 | OpenAI、通义、本地推理服务 |
| EmbeddingPort | 文本向量化 | 不同Embedding模型、批量离线任务 |
| ToolPort | 外部工具调用 | 订单查询、知识检索、邮件通知 |
| EvaluationPort | 评估打分 | 规则评估、模型评判、人工复核 |
4.3 DDD的防腐层对模型输出有多重要
DDD里有个概念叫防腐层,用来隔离外部模型与内部领域模型。AI场景下,模型输出的JSON经常出现乱七八糟的情况:字段缺失、枚举值超出定义、JSON嵌套错误。如果直接让这些数据流入业务逻辑,随时可能炸。
我的做法是:模型输出先进防腐层,做Schema校验、默认值填充、枚举映射、无效内容重试。校验不过就触发一次自动重试,用更严格的few-shot示例二次生成;仍失败则走人工兜底。
防腐层还可以做“语义映射”,比如模型输出“用户很生气”,要转成业务上的“投诉等级=high”,这层逻辑不能散落到各处。业务方拿到的是一个干净的领域对象,不是一段需要重新解释的自然语言。
5. 落地避坑实录:高频问题与排查清单
这一节全是实战中反复出现的问题,每条都是教训。有点长,但每个都值得你存进自己的运维手册。
5.1 输出格式飘了:结构化输出与校验
最常遇到的是模型不听话,明明要求只输出JSON,它却夹带Markdown或解释文字。处理办法分三层:第一层在Prompt里加严格约束和few-shot示例;第二层用Function Calling或JSON Schema绑定输出结构;第三层引入校验与重试。
一旦校验失败,不要直接报错给用户,建议带着更明确的示例重试一次,仍然失败才走兜底。这里要注意重试成本,别动不动把Token烧在无意义的重复生成上。实测下来,90%的格式问题能靠第一层和第二层解决,第三层主要防漏网之鱼。
5.2 延迟和成本失控:流式、缓存与模型降级
AI系统的延迟和成本经常一起失控。流式输出是体验的第一步,但后端处理也要控制模型调用次数。可以在模型网关层做“语义缓存”——相似提问命中缓存就直接返回历史答案,减少重复调用。
成本控制还可以做“模型降级梯队”:复杂任务用旗舰模型,常见简单问题用小型模型,模型负载高时自动切到备选模型。我见过一个项目,做完整内容审核分类,所有请求都打旗舰模型,成本一天顶别人一个月。后来把80%请求路由到小模型,准确率只降了1到2个百分点,成本降了60%。
5.3 Agent循环失控:步数、超时与预算
Agent多轮调用工具时,最怕陷入死循环:模型反复调用同一个工具,或者不断修正一个无解的参数。必须在Agent循环里加入三把锁:最大步数限制、单步调用的超时限制、整体Token预算限制。超出后不是直接失败,而是带当前状态回到用户,问一句“我还需要更多信息,你可以补充吗”。
预算限制尤其重要,最好在网关层按会话ID记录累计消耗,超过阈值自动降级或停止调用。这一步在初期很容易被忽略,等月底账单出来才后悔。
5.4 知识库与线上数据不一致:版本化与重建
知识库内容更新后,向量索引有时候还是旧切片,导致用户搜到的答案来自过期数据。原因通常是知识版本与向量版本解耦了。我的解决方案是:每次知识库变更都生成新的版本标识,索引、切片、向量都带上版本号;线上请求记录知识版本,评估时能回溯。
如果发现线上数据与向量库不一致,先检查索引重建任务是否完成,再检查请求是否命中缓存了旧版本结果。这个坑排查起来很费劲,但预防只需要一条规范:所有知识库读取都要显式带版本参数。
5.5 存量系统集成:同步调用还是事件驱动
存量系统接入AI时,最纠结的是用同步调用还是异步事件。我的判断标准是:如果AI结果是主流程的必要输入,且用户可以接受等待几秒,用同步调用;如果AI只是辅助分析、生成建议,尽量用事件驱动,把请求丢到队列,AI处理完成后回调或推送结果。事件驱动的优势是把AI故障与主流程解耦,模型挂了不至于拖垮核心业务。
6. 从零落地的行动清单:按这个顺序推进
如果你准备从零建一个AI Native系统,我的建议是别追求一次到位,按四周节奏推进。这个节奏可以让你在每个阶段都有阶段性成果,团队信心也会更稳。
6.1 第一周:定义契约和评估种子集
先花时间把模型接入契约、消息协议、评估金标集定义出来。哪怕功能还没跑通,也要写清楚模型返回结构长什么样、失败怎么处理、哪些场景需要人工兜底。这一步决定后面所有工作是否扎实。
评估种子集不用多,但要有代表性。我通常会准备30到50条真实场景样例,覆盖主流程、边界情况和几个失败案例。这比写冗长的架构文档有用得多。
6.2 第二周:打通一条最小决策链路
选一个业务场景,把“输入-上下文组装-模型调用-校验-输出-评估”整个链路串起来。不要加太多工具和分支,先让最简单的端到端流程能跑。
这一步的目标是验证契约是否合理。你会发现很多在文档里看起来合理的字段,真正接过一遍之后才发现该调整。
6.3 第三周:建立可观测性
接好Trace、日志、成本计量。重点记录Prompt版本、上下文快照、模型输出、评估结果。这一周投入的收益最大,因为后面排查问题全靠它。
如果这一周偷懒,后面遇到线上问题就只能抓瞎。我曾经因为没有记录上下文快照,花了整整一天才定位到一个很简单的知识库版本问题。
6.4 第四周:小范围真实流量验证
找一批真实用户或真实业务数据做小范围验证,重点看线上评估指标与离线金标集的差异。如果差异过大,回头检查上下文组装和Prompt模板,通常能发现离线场景过度拟合。
四周下来,你对系统的理解和第一版架构肯定跟初始设想不一样,没关系,架构本来就是迭代出来的。重要的是你已经有了一个完整可跑、可观察、可评估的AI Native骨架。
最后再分享一个我自己的心得:每次上线新模型或改Prompt前,都先往评估集里跑一遍,再把线上请求的Prompt和输出落日志。这个习惯看着简单,但比任何监控面板都更能救命。AI Native架构的核心不是选哪个模型,而是让系统具备稳定地观察、评估、迭代AI行为的能力。