1. 为什么现在要谈 AI Native 架构
过去两年,我参与过三个从零起步的 AI 项目,也接手过两个“传统系统加挂 AI 模块”的改造工程。这两类项目的体感差异非常大:前者像在高速公路上边跑边换轮胎,后者像给一辆老式手动挡汽车强行装上自动驾驶套件——能跑,但处处别扭。这种别扭的根源,就是架构范式的不匹配。
AI Native 架构的核心主张很直接:把 AI 能力当作系统的第一性能力来设计,而不是当作一个外挂模块来集成。传统架构里,AI 往往是一个“推理服务”,业务系统调用它、拿到结果、继续走自己的流程。AI Native 架构则要求我们从数据流、状态管理、服务编排、可观测性等层面,全部围绕“模型会持续变化、输出具有概率性、上下文需要被管理”这三个事实来重新设计。
这篇文章适合三类人:正在规划 AI 产品从零搭建的技术负责人、需要把现有系统向 AI 方向演进的后端工程师、以及想理解 AI 系统设计逻辑的产品经理。我会把架构选型的考量、核心模块的拆解、实操中的参数计算和踩坑经验都摊开来讲,尽量做到你读完能直接对照自己的项目做判断。
提示:AI Native 不等于“用了大模型就是 AI Native”。判断标准是:如果把模型替换成另一个能力相近的模型,你的系统需要改多少代码?改动越少,越接近 AI Native。
2. 核心设计思路与方案选型拆解
2.1 从“模型为中心”转向“上下文为中心”
传统 AI 集成方案里,工程师最关心的是“用哪个模型、推理延迟多少、准确率多高”。但在实际生产环境中,我观察到真正决定系统上限的往往不是模型本身,而是上下文的质量和流转效率。
举个具体例子。我们做过一个合同审查助手,最初方案是:用户上传合同 → 调用模型 → 返回审查意见。上线后发现两个问题:第一,长合同超出上下文窗口,模型只能看到片段;第二,每次审查都是独立请求,模型无法利用之前审查过的同类合同经验。
后来我们把架构改成“上下文为中心”:合同先经过分块和向量化存入知识库,审查时先检索相关条款和历史案例,再组装成结构化上下文送给模型。同样的模型,审查准确率从 61% 提升到 84%。这个案例说明,AI Native 架构的第一优先级是设计上下文的采集、存储、检索和组装流水线,模型只是这条流水线上的一个处理节点。
2.2 为什么选择“编排层 + 能力层”的分层结构
在方案选型阶段,我对比过三种主流结构:
| 结构方案 | 核心思路 | 优势 | 风险 |
|---|---|---|---|
| 单体推理服务 | 所有 AI 逻辑写在一个服务里 | 开发快,部署简单 | 模型切换成本极高,无法独立扩缩容 |
| 微服务化 AI | 每个模型独立服务,业务侧编排 | 解耦好,可独立迭代 | 编排逻辑分散,上下文管理复杂 |
| 编排层 + 能力层 | 统一编排层管理流程,能力层提供模型/工具 | 兼顾灵活性和可控性 | 编排层设计难度大,需要前期投入 |
我们最终选择第三种。原因很实际:AI 应用的需求变化太快,今天用这个模型做摘要,明天可能换成另一个模型做结构化抽取,后天又要加入工具调用。如果编排逻辑散落在各个业务服务里,每次调整都是一场灾难。
编排层的职责包括:接收请求、管理会话状态、决定调用哪些能力、组装上下文、处理模型输出、触发后续动作。能力层则封装具体的模型调用、向量检索、工具执行等原子操作。两层之间通过明确定义的接口通信,能力层可以随时替换实现,编排层不需要感知。
2.3 状态管理:被低估的架构核心
很多团队在设计 AI 系统时,把大量精力花在模型选型和提示词调优上,却忽略了状态管理。我踩过的最大的坑就来自这里。
一个多轮对话场景,用户先问“帮我分析这份销售数据”,系统返回分析结果;用户接着说“把刚才的结果按区域拆分”。如果系统没有保存上一轮的完整上下文(包括原始数据、分析维度、输出格式),第二轮请求就会失败或者给出错误结果。
AI Native 架构中的状态管理需要解决三个问题:会话状态的持久化(跨请求保留上下文)、中间结果的缓存(避免重复计算)、状态的一致性(多并发请求下的隔离)。我们的做法是引入一个会话状态存储层,每个会话有独立的命名空间,状态数据按照“原始输入 → 中间处理 → 最终输出”的结构化格式存储,并设置合理的过期策略。
注意:状态存储的过期策略需要根据业务场景调整。客服对话可能 30 分钟无交互就过期,但数据分析场景可能需要保留数天,因为用户可能隔天回来继续追问。
3. 核心模块的细节解析与实操要点
3.1 上下文流水线的构建方法
上下文流水线是 AI Native 架构的主动脉。它的工作流程是:采集原始输入 → 清洗和分块 → 向量化存储 → 检索相关片段 → 组装成模型可用的上下文。
分块策略直接影响检索质量。我们试过固定长度分块(比如每 512 个 token 一块),效果一般,因为经常把一句完整的话切断。后来改成语义分块:先按段落切分,如果段落超过阈值再按句子边界切分,保证每个块包含完整的语义单元。实测下来,检索命中率提升了约 20%。
向量化模型的选择也有讲究。通用文本用常见的嵌入模型即可,但如果是垂直领域(比如法律、医疗),最好用领域数据微调过的嵌入模型,或者在检索时加入关键词过滤作为补充。我们做医疗问答时,纯向量检索的 Top-5 命中率只有 58%,加入医学术语词典做混合检索后提升到 79%。
组装上下文时要注意 token 预算。假设模型上下文窗口是 8K token,系统提示词占 500,历史对话占 1500,那么留给检索内容的只有 6000。你需要根据检索结果的相关性分数排序,优先放入高分片段,超出预算的低分片段直接丢弃。这个截断逻辑要写成可配置的,方便后续调优。
3.2 编排层的核心逻辑与实现
编排层是整个系统的大脑。它的核心逻辑可以用一个状态机来描述:接收请求 → 判断意图 → 选择能力组合 → 执行调用 → 处理结果 → 判断是否完成 → 返回或继续。
判断意图这一步,我们试过两种方案。一种是训练一个分类模型,另一种是用大模型做零样本分类。分类模型速度快但需要标注数据,大模型灵活但延迟高。最终我们采用混合方案:高频意图走分类模型,低频和新增意图走大模型兜底。这样既保证了常见场景的响应速度,又保留了扩展性。
能力调用的编排有两种模式:串行和并行。串行适合有依赖关系的步骤,比如先检索再生成。并行适合独立的能力调用,比如同时查询天气和日历。并行调用时要注意超时控制,任何一个能力超时都不应该阻塞整个流程,而是返回降级结果。
# 编排层伪代码示例 async def orchestrate(session_id, user_input): context = await load_session_context(session_id) intent = await classify_intent(user_input, context) if intent == "data_analysis": data = await fetch_data(user_input) analysis = await call_model("analysis", data, context) return format_response(analysis) elif intent == "multi_step": results = await asyncio.gather( call_capability("search", user_input), call_capability("calculate", user_input), return_exceptions=True ) return merge_results(results)3.3 可观测性:AI 系统的“黑匣子”
传统系统的监控指标是 CPU、内存、QPS、错误率。AI 系统还需要额外关注:模型调用的 token 消耗、推理延迟分布、输出质量指标、上下文命中率。
我们搭建了一套可观测性体系,核心是记录每次请求的完整链路:用户输入 → 意图识别结果 → 检索到的上下文片段及分数 → 模型调用参数 → 模型输出 → 后处理结果。这些数据存入日志系统,支持按会话、按用户、按时间段查询。
输出质量指标比较难量化。我们的做法是:对于有标准答案的场景(比如信息抽取),用准确率衡量;对于生成类场景,用人工抽检加用户反馈(点赞/点踩)来评估。每周统计一次质量趋势,如果某类请求的质量连续下降,就触发告警去排查是模型问题、上下文问题还是提示词问题。
提示:token 消耗监控能帮你发现很多隐性问题。我们曾经发现某个功能的 token 消耗是同类功能的 5 倍,排查后发现是上下文组装时重复放入了相同内容,修复后成本直接降了 70%。
4. 完整实操流程与关键环节实现
4.1 环境准备与基础依赖
从零搭建 AI Native 系统,我建议先明确技术栈。以下是我们团队实际使用的组合,供参考:
- 编排层:Python + FastAPI,异步框架适合处理模型调用的高延迟
- 状态存储:Redis 做会话缓存,PostgreSQL 做持久化
- 向量数据库:根据数据量选择,百万级以下用 pgvector 就够,千万级以上考虑专用向量库
- 模型接入:统一封装成内部 API,屏蔽不同模型提供方的差异
- 可观测性:OpenTelemetry 做链路追踪,Prometheus + Grafana 做指标监控
环境配置中最容易出问题的是依赖版本冲突。AI 生态的库更新极快,建议用容器化部署,每个能力层服务独立容器,通过内部网络通信。这样即使某个服务的依赖升级,也不会影响其他服务。
4.2 从零搭建的第一个可运行版本
不要一上来就追求完美架构。我的经验是:先用最小可行架构跑通核心流程,再逐步迭代。
第一版可以只包含三个模块:一个简单的编排逻辑(硬编码的 if-else)、一个模型调用封装、一个内存态的状态存储。用这个版本验证核心假设:用户是否愿意用、模型输出是否可接受、延迟是否在可忍受范围。
我们第一个版本的代码量不到 500 行,但已经能跑通“用户输入 → 模型处理 → 返回结果”的完整链路。上线两周收集了 200 多条真实请求,发现了上下文截断、超时处理、并发冲突等问题,这些在纯设计阶段是想不到的。
4.3 参数计算:上下文预算与成本估算
假设你使用一个上下文窗口为 128K token 的模型,每次请求的 token 消耗需要提前估算:
| 组成部分 | 预估 token 数 | 说明 |
|---|---|---|
| 系统提示词 | 300-800 | 固定内容,可缓存 |
| 历史对话 | 500-3000 | 随轮次增长,需要截断策略 |
| 检索上下文 | 2000-8000 | 根据检索结果动态调整 |
| 用户当前输入 | 100-1000 | 变化较大 |
| 模型输出预留 | 1000-4000 | 根据任务复杂度设定 |
总预算控制在窗口大小的 70% 以内比较安全,留出余量应对突发情况。成本估算方面,按每百万 token 的单价乘以日均请求量和平均 token 消耗,就能算出月度成本。我们一个中等规模的客服助手,日均 5000 次请求,平均每次消耗 3500 token,月度成本在可接受范围内。
4.4 灰度发布与回滚机制
AI 系统的输出具有不确定性,新版本上线必须走灰度。我们的做法是:新版本先对 5% 的流量生效,对比新旧版本的核心指标(准确率、延迟、用户反馈)。如果指标没有明显下降,逐步扩大到 20%、50%、100%。如果出现异常,一键回滚到旧版本。
灰度发布的关键是流量切分要稳定。同一个用户应该始终路由到同一个版本,否则体验会割裂。我们用用户 ID 的哈希值做路由,保证一致性。
5. 常见问题与排查技巧实录
5.1 模型输出不稳定的排查思路
模型输出不稳定是最高频的问题。表现包括:同样的输入有时返回正确结果有时返回错误结果、输出格式不符合预期、内容出现幻觉。
排查步骤我总结成一个速查表:
| 现象 | 可能原因 | 排查方法 | 解决方向 |
|---|---|---|---|
| 输出格式错乱 | 提示词约束不够强 | 检查提示词是否明确指定格式 | 加入格式示例,使用结构化输出 |
| 内容幻觉 | 上下文不足或矛盾 | 检查检索内容是否相关 | 优化检索,加入事实校验 |
| 结果随机波动 | 温度参数过高 | 检查 temperature 设置 | 降低温度,固定随机种子 |
| 长输入效果差 | 上下文截断 | 检查 token 计数 | 优化分块和检索策略 |
我踩过的一个典型坑:提示词里写了“请用 JSON 格式返回”,但模型有时会加 markdown 代码块标记。后来改成在提示词中明确“直接返回 JSON,不要添加任何标记”,并在后处理中做容错解析,问题才解决。
5.2 延迟优化的实操经验
AI 系统的延迟主要来自模型推理。优化手段按效果排序:
- 流式输出:首 token 延迟从 3 秒降到 500 毫秒,用户体验提升明显
- 上下文精简:减少不必要的上下文,推理时间线性下降
- 模型分级:简单任务用小模型,复杂任务用大模型
- 缓存:相同或相似的请求直接返回缓存结果
- 并行调用:独立的能力调用并行执行
我们做过一个对比测试:同一个请求,优化前端到端延迟 8.2 秒,加入流式输出后首 token 延迟 0.6 秒,总延迟 7.8 秒;再精简上下文后总延迟降到 4.1 秒;最后加入缓存,重复请求延迟降到 200 毫秒以内。
5.3 多轮对话中的状态丢失问题
多轮对话最容易出现状态丢失。用户说“把刚才的结果导出”,系统却不知道“刚才的结果”是什么。根本原因是状态存储没有覆盖所有必要信息。
我们的解决方案是:每次请求结束后,把“用户输入、系统输出、调用的能力、产生的中间数据”全部序列化存入会话状态。下一轮请求时,根据意图判断需要加载哪些历史状态。比如“导出”意图需要加载上一轮的完整输出,“继续”意图需要加载上一轮的上下文。
注意:状态数据可能很大,不要全量加载。按需加载 + 懒加载是更好的策略。我们设置了一个状态索引,记录每轮对话产生了哪些数据、存在哪里,需要时再取。
5.4 成本失控的预防措施
AI 系统的成本很容易失控,尤其是 token 消耗。我们设置了三级防护:第一级是单次请求的 token 上限,超过直接拒绝;第二级是单用户的日消耗限额,超过后降级到小模型;第三级是系统级日预算,达到阈值后触发告警并限制非核心功能。
这套机制帮我们避免了一次事故:某个用户写了个脚本疯狂调用接口,单日消耗飙升到正常水平的 50 倍。因为有限额保护,实际损失被控制在可接受范围内。
6. 架构演进与扩展方向
6.1 从单模型到多模型路由
系统上线一段时间后,你会发现单一模型无法满足所有场景。有的任务需要强推理能力,有的任务需要低延迟,有的任务需要特定领域知识。这时候就需要多模型路由。
路由策略可以基于规则(按任务类型分发)、基于成本(优先用便宜模型,效果不达标再升级)、基于质量(A/B 测试选出最优模型)。我们目前用的是规则 + 成本混合策略:高频简单任务走小模型,复杂任务走大模型,效果不达标时自动升级重试。
6.2 引入 Agent 能力的时机判断
Agent 架构很热,但不是所有场景都需要。我的判断标准是:任务是否需要多步推理和动态工具选择。如果任务流程是固定的(比如“检索 → 生成 → 返回”),用编排层就够了。如果任务需要根据中间结果决定下一步做什么(比如“先查数据,发现异常再查日志,最后生成报告”),才需要考虑 Agent 架构。
引入 Agent 的代价是复杂度和不确定性增加。Agent 可能陷入循环、可能选择错误的工具、可能产生不可预期的行为。我们的做法是:先用编排层实现固定流程,当发现流程需要频繁调整时,再逐步引入 Agent 能力,并且设置最大步数限制和人工确认环节。
6.3 数据飞轮:让系统越用越聪明
AI Native 架构的一个核心优势是数据飞轮:用户使用产生数据,数据用于优化模型和上下文,优化后的系统提供更好的体验,吸引更多用户。
实现数据飞轮的关键是闭环设计:记录用户行为(点击、采纳、修改、拒绝)→ 标注高质量样本 → 用于微调或提示词优化 → 评估效果 → 上线新版本。这个循环越快,系统进化越快。
我们目前做到的是周级别的闭环:每周收集用户反馈,人工标注 200-500 条样本,用于优化检索策略和提示词。模型微调的周期更长,大约每月一次。即使不做模型微调,仅靠上下文和提示词的优化,系统效果也能持续提升。
7. 个人实操体会
最后分享几个我在实际项目中总结的体会,不一定对,但都是真金白银换来的。
第一,不要过早追求架构完美。我见过团队花三个月设计“完美”的 AI 架构,结果上线后发现核心假设就是错的。先用最小可行架构验证需求,再逐步演进,比一开始就搭大框架要靠谱得多。
第二,上下文质量比模型选择重要。我们做过对比测试:同一个模型,优化上下文后效果提升 20 多个百分点;换更强的模型,效果只提升 5 个百分点。把精力花在上下文流水线上,投入产出比更高。
第三,可观测性要第一天就做。AI 系统的问题排查比传统系统难得多,没有完整的链路日志,你根本不知道问题出在哪。我们前期没重视这块,后来补日志花了两周时间,还丢失了一些关键数据。
第四,成本控制要设硬上限。不要指望团队自觉控制 token 消耗,一定要有系统级的限额和告警。我见过太多项目因为成本失控被迫下线功能。
第五,用户反馈是最宝贵的优化信号。模型指标再好看,用户不买账就是白搭。把用户的点赞、点踩、修改行为都记录下来,这些数据比任何 benchmark 都真实。