AI 系统架构设计

AI 系统与传统软件的本质差异、分层架构设计、微服务 vs 单体、核心组件选型,以及从 MVP 到企业级的部署演进

20 min read Part of AI Engineering · Ch. 1

AI 系统架构设计

flowchart LR
  A["AI 系统架构设计"]
  A --> B["分类:工程与生产"]
  A --> C["关键词:AI"]
  A --> D["关键词:架构"]
  A --> E["关键词:微服务"]
  A --> F["关键词:部署"]

AI 系统不是“传统软件外面包一层模型调用”。非确定性、高延迟、高成本、快速迭代,以及评估困难,决定了它需要一套不同于传统 CRUD 系统的架构思维。


为什么要从“架构”开始

很多 AI 项目在最早几周都显得进展很快:

  • 接一个模型 API
  • 写一个 Prompt
  • 做一个聊天界面
  • 接一点检索或工具调用

很快,一个能演示的版本就出来了。

但真正上线时,问题会突然集中出现:

  • 同样的问题,今天和明天回答不一样,怎么验收?
  • 成本一旦和调用量线性绑定,怎么避免越增长越亏?
  • 一个回答生成 20 秒,前端应该怎么设计交互?
  • Prompt 要频繁调,难道每次都跟着业务代码一起发版?
  • 模型、RAG、工具调用、权限、缓存,到底应该放在哪一层?
  • 失败不再只是 500 或超时,还可能是“看起来正常,其实答错了”,这种系统怎么观测?

这篇文章讨论的,就是这些问题背后的架构逻辑。

它不是教你画一张“高大上”的系统图,而是想建立一个更实用的判断框架:AI 系统和传统软件到底哪里不一样,这些差异如何影响分层、部署、拆分边界、基础设施和演进路径。


1. AI 系统和传统软件,到底差在哪

一句话概括:

传统软件主要在管理确定性的业务逻辑;AI 系统则要在一个非确定性、成本敏感、持续变化的能力层之上构建产品。

这个差异不只是“多了个模型 API”,而是会一路影响到架构设计的优先级。

维度传统软件AI 系统
输出特性相同输入通常得到相同输出相同输入可能得到不同输出
失败模式报错、超时、权限失败幻觉、偏题、格式漂移、拒答、工具误用
成本结构计算成本相对固定token、推理时长、检索和工具调用成本随使用增长
迭代对象代码、配置、数据库结构代码、Prompt、模型、评估集、工具链、知识库
延迟分布毫秒级为主秒级常见,长任务并不少见
验收方式单测、集成测试、业务规则校验除功能测试外,还要做质量评估、离线评测与线上观测

1.1 非确定性:系统不再“可完全预测”

这件事是 AI 系统和传统系统最大的分水岭。

在传统软件里,你通常假设:

  • 输入相同
  • 代码相同
  • 外部依赖相同
  • 输出就应当相同

而在 LLM 系统里,就算你尽量把参数固定,输出依然可能出现差异。更麻烦的是,很多差异并不是“错得很明显”,而是:

  • 大方向对,但细节有误
  • 格式看似正确,但字段含义错了
  • 结论合理,但证据不足
  • 工具调用成功,但调用了不该调用的工具

所以 AI 系统不能只围绕“系统是否报错”来设计,还必须围绕“结果是否可信、可解释、可接受”来设计。

1.2 成本不是基础设施背景噪声,而是产品变量

传统 Web 服务里,计算资源成本当然也重要,但它往往不会精确到“每多说一段话就多花多少钱”。

AI 系统不一样。一次请求的成本可能直接和这些因素绑定:

  • prompt 长度
  • 上下文窗口
  • 检索召回数量
  • 是否调用更强模型
  • 是否发生多轮工具循环
  • 是否进行了重试或重写

这意味着成本不是运维团队关心的事,而是产品和架构都必须参与的约束条件。

1.3 模型层在快速变化,系统必须允许“热插拔”

传统系统当然也升级依赖,但 AI 系统的变化速度通常更快:

  • 模型版本在变
  • Prompt 在变
  • 工具策略在变
  • RAG 策略在变
  • 输出 schema 在变
  • 评估指标也在变

如果你的架构把这些东西都和核心业务代码硬绑在一起,系统很快会变得难以迭代。LangSmith 的 Prompt 管理文档就明确把 prompt 视为可版本化、可拉取、可管理的对象,而不是只能写死在代码里的字符串。(docs.langchain.com (LangChain 文档))

1.4 可观测性不再是“有日志就行”

OpenTelemetry 文档把 traces 定义为观察请求完整路径的方式,并强调 traces 对理解请求经过了哪些组件至关重要。对于 AI 系统,这种“完整路径”尤其关键,因为一次回答往往不是一个函数调用,而是一条链路:

  • 入口请求
  • 检索
  • Prompt 组装
  • 模型调用
  • 工具调用
  • 结果后处理
  • 安全检查
  • 返回前端或写入系统

如果这条链路不可见,线上问题几乎无法定位。(opentelemetry.io (OpenTelemetry))


2. AI 架构设计的第一原则:把变化快的东西隔离出来

AI 系统最容易犯的一个错误,是把所有逻辑揉在一起:

  • API 层直接拼 Prompt
  • 业务层直接决定模型
  • 模型返回值直接写数据库
  • 检索逻辑、工具逻辑、权限逻辑散落在各处

一开始这样写很快,但很快会遇到典型问题:

  • 改一个 Prompt 要重新发版
  • 换一个模型要改多处代码
  • 同一类逻辑在多个接口里复制
  • 很难知道到底是模型问题、检索问题还是业务逻辑问题
  • A/B 测试、灰度切流、回滚都变得麻烦

所以 AI 系统架构的第一原则,不是“先上微服务”,而是:

先把变化快、试验多、不确定性强的那一层和稳定业务边界隔离开。

这通常意味着,至少要把下面几类职责拆开:

  • 面向用户和业务系统的接口层
  • 稳定的业务应用层
  • AI 编排层
  • 模型接入与路由层
  • 数据与知识层

3. 一个更实用的分层架构

把 AI 系统抽象成五层通常是有帮助的,但真正有用的不是背层名,而是理解每层为什么存在。

┌─────────────────────────────────────────────────────┐
│ API / Experience Layer                             │
│ HTTP / SSE / WebSocket / Auth / Rate Limit         │
└──────────────────────┬──────────────────────────────┘

┌─────────────────────────────────────────────────────┐
│ Application Layer                                  │
│ 业务逻辑、租户隔离、会话、权限、工作流入口            │
└──────────────────────┬──────────────────────────────┘

┌─────────────────────────────────────────────────────┐
│ AI Orchestration Layer                             │
│ Prompt 组装、RAG、工具调用、Agent/Workflow 编排      │
└──────────────────────┬──────────────────────────────┘

┌─────────────────────────────────────────────────────┐
│ Model Access Layer                                 │
│ 模型路由、Fallback、重试、缓存、供应商适配            │
└──────────────────────┬──────────────────────────────┘

┌─────────────────────────────────────────────────────┐
│ Data / Knowledge Layer                             │
│ 业务库、对象存储、向量库、索引、外部系统              │
└─────────────────────────────────────────────────────┘

下面分别看。


4. API / Experience Layer:别把“调用模型”直接暴露给用户

这一层最容易被低估,因为很多 Demo 里它只是一个 /chat 接口。

但到了可上线阶段,它负责的往往不只是接请求,而是处理用户体验和系统边界:

  • 鉴权与租户识别
  • 限流与配额控制
  • 请求幂等性
  • 同步 / 流式 / 异步的交互模式
  • 用户取消请求
  • 前端实时状态回传
  • 基础审计与日志入口

为什么这一层很关键

因为 AI 请求往往比普通 HTTP 请求更长、更贵、更不稳定。

如果你把它当成普通同步 API,很容易出现这些问题:

  • 前端等待十几秒没有任何反馈
  • 用户重复点击,产生重复计费
  • 用户断开连接后,后端仍在傻跑
  • 流式输出、工具调用状态、最终结果混在一起

所以 API 层要明确区分几种交互模型:

4.1 同步 + 流式

适合:

  • 聊天
  • 短文本生成
  • 用户需要“边看边等”的场景

常见做法是 SSE 或 provider 自带 streaming。它不能缩短模型真实推理时间,但能改善感知延迟。

4.2 异步任务

适合:

  • 长文档处理
  • 批量分析
  • Agent 工作流
  • 可能持续数十秒到数分钟的任务

这类场景更适合“提交任务 → 获取任务 ID → 轮询 / webhook / socket 通知完成”。

4.3 WebSocket / 实时双向通道

适合:

  • 实时对话
  • 工具调用状态推送
  • 多轮交互和协作编辑
  • Agent 中间步骤可视化

关键不是“技术潮不潮”,而是用户是否真的需要更连续的过程反馈。


5. Application Layer:稳定业务规则,不要让 Prompt 替代它

应用层处理的是相对稳定的业务事实和系统规则,比如:

  • 用户与租户模型
  • 角色与权限
  • 订单、工单、项目、对话等业务对象
  • 工作流入口与状态机
  • 计费、配额、审计
  • 哪些动作允许自动执行,哪些必须人工审批

这一层最大的误区,是把模型当成业务逻辑执行器。

比如有人会这样设计:

  • 让模型判断用户有没有权限
  • 让模型决定能不能改生产配置
  • 让模型自己理解什么叫“管理员可见”
  • 让模型根据自然语言自由决定流程跳转

这样短期很方便,长期极不稳定。原因很简单:模型适合处理语义模糊和信息压缩,不适合承担刚性规则。

更合理的边界通常是:

  • 应用层:决定“能不能做”
  • AI 层:决定“怎么更好地理解、生成、辅助完成”

也就是说:

  • 是否有权限发邮件,不该让模型猜
  • 是否超出预算,不该让模型猜
  • 是否属于高风险动作,不该让模型猜
  • 是否满足发布门槛,不该只靠模型说了算

AI 系统的好架构,不是让模型无所不能,而是让模型只做它擅长的部分。


6. Orchestration Layer:AI 应用真正容易失控的地方

如果说传统系统的复杂度常常集中在业务领域模型和数据库,那么 AI 系统的复杂度往往集中在编排层。

这一层通常负责:

  • Prompt 组装
  • 上下文构造
  • 检索与重排
  • 工具调用
  • 输出结构化
  • 多模型协同
  • Agent 循环
  • 工作流分支与重试
  • 人工介入点

这也是为什么很多 AI 项目早期“明明只有几个接口”,却很快变得很难维护——因为真正的复杂度其实已经跑到编排层里了。

6.1 不要把业务逻辑和编排逻辑混在一起

比如下面两种写法,长期维护成本会非常不一样。

不好的方式

  • Controller 里直接拼 Prompt
  • 业务服务里直接做向量检索
  • 模型返回后顺手做格式修正和权限判断
  • 工具调用逻辑写在 if/else 里

更好的方式

  • 应用层明确提出“业务目标”
  • 编排层负责把目标转换成 AI 执行过程
  • 模型层只负责推理能力访问
  • 业务规则仍在应用层统一执行

这种分离的价值在于,AI 方案会频繁变,而业务边界不该跟着一起抖动。

6.2 编排层不只是“Prompt 中转站”

很多文章把 orchestration 理解成“把检索结果和系统提示拼进 Prompt”。这太窄了。

真正成熟的编排层更像一个运行时协调器,要解决的问题包括:

  • 哪一步用哪个模型
  • 哪一步是否应该检索
  • 检索失败后是否降级
  • 结构化输出失败时要不要重试
  • 哪些工具可调用
  • 哪些结果必须经由校验器
  • 哪些场景必须转人工
  • 长任务如何拆成阶段执行

这也是 LangGraph、CrewAI、Temporal 这类框架会被反复讨论的原因:不是因为大家需要更多框架,而是因为编排本身已经成为独立复杂度来源。


7. Model Access Layer:把“模型”当成可替换基础设施,而不是业务写死依赖

模型接入层是很多系统早期最偷懒、后期最痛苦的部分。

最初常见写法是:

  • 业务代码里直接调某家 API
  • 到处散落模型名
  • Prompt 和模型参数耦合
  • 错误处理、限流、重试各写各的

随着系统增长,很快会出现:

  • 想换模型很难
  • 想做 fallback 很难
  • 不同场景的参数配置到处散
  • 成本优化没有统一入口
  • 无法做灰度和实验

所以更合理的做法,是把模型调用统一收敛到一个模型接入层,负责这些事情:

  • 供应商适配
  • 模型路由
  • fallback
  • 重试和熔断
  • 请求标准化
  • 返回标准化
  • 速率限制
  • 成本与 token 统计
  • 缓存与复用

7.1 模型路由不是“为了炫技”

模型路由最常见的误解,是把它理解成复杂平台才需要的“高端能力”。

其实很多系统很早就该有简单路由逻辑:

  • 分类、抽取、改写用便宜模型
  • 最终复杂生成用强模型
  • 高置信模板化任务优先走小模型
  • 供应商异常时切备用模型

这本质上是在把“成本”和“质量”做成系统级策略,而不是开发者拍脑袋。

7.2 缓存也不只是 Redis 一把梭

AI 系统的缓存至少有三类思路:

  • 精确匹配缓存:同输入直接复用结果
  • 语义缓存:近似问题复用近似结果
  • 前缀/KV 缓存:推理层复用共享上下文

vLLM 官方文档明确提供了 Automatic Prefix Caching 设计,用于复用前缀对应的 KV cache,从而减少重复推理开销。(docs.vllm.ai (vLLM))

这提醒我们一个很重要的架构点:缓存不只发生在应用层,也可能发生在推理层。


8. Data / Knowledge Layer:别把“有向量库”误当成“有知识系统”

AI 系统的数据层通常比传统应用更杂:

  • 业务数据库
  • 文档与对象存储
  • 向量库 / 检索索引
  • 实时缓存
  • 特征或画像数据
  • 外部 API
  • 审计与事件日志

一个常见误区是:只要接了向量库,就觉得知识层搞定了。

其实向量库只解决了知识系统的一部分问题。更完整的知识层至少还包括:

  • 文档采集
  • 清洗与切分
  • 元数据管理
  • 权限映射
  • 索引更新策略
  • 召回与重排
  • 多源融合
  • 新鲜度控制
  • 可追溯引用

这意味着,RAG 架构里最难的往往不是“query embedding 一下”,而是让知识系统变得:

  • 可更新
  • 可控权限
  • 可追溯
  • 可评估
  • 可与业务对象关联

如果这一层做得粗糙,模型再强也会被脏知识喂偏。


9. 单体 vs 微服务:AI 系统里更应该警惕“过早拆分”

这是很多团队最容易过度讨论的话题。

一句话结论先说:

对大多数 AI 产品,早期更适合 模块化单体(modular monolith),而不是一上来就拆一堆微服务。

原因很简单:AI 系统的最主要复杂度,往往不是服务调用链,而是:

  • Prompt 和上下文设计
  • 编排逻辑
  • 模型与工具选择
  • 评估与观测
  • 成本优化

如果这些还没稳定,过早拆服务通常只会放大复杂度。

9.1 为什么早期单体通常更合适

  • 迭代快
  • 调试方便
  • 本地开发简单
  • Trace 好看
  • 跨层改动成本低
  • 认知负担更小

尤其在 MVP 阶段,你往往还在同时修改:

  • 产品流程
  • Prompt
  • 模型
  • 检索逻辑
  • 前端交互
  • 评估标准

这时候服务边界本身都还不稳,先拆成微服务很容易把不确定性固化成网络边界。

9.2 什么叫“模块化单体”比“单体”更重要

不是说把所有东西写在一个文件里,而是:

  • 进程可以是一个
  • 代码结构要按能力域分模块
  • API、应用、编排、模型接入、数据访问仍然要分层
  • 内部边界清晰,未来才有可能自然拆分

真正可演进的系统,往往不是“从混乱单体突然进化成微服务”,而是“先有清晰模块,再按压力点拆出去”。

9.3 什么时候值得拆成微服务

通常在这些信号出现时:

1. 资源形态明显不同

比如:

  • 推理服务需要 GPU
  • 业务 API 服务只需要 CPU
  • 检索服务需要高内存与高 IO
  • 批处理任务需要异步 worker

这时分开部署通常有明显收益。

2. 团队边界已经清晰

如果模型平台、业务应用、搜索/RAG 平台已经是不同团队维护,那服务边界更容易稳定。

3. 多租户与合规要求上升

例如:

  • 企业租户隔离
  • 数据驻留要求
  • 审计边界
  • SLA 不同

这些都会推动服务拆分。

4. 扩缩容模式差异显著

Kubernetes 官方文档明确支持 workload autoscaling,也支持 GPU 作为可调度资源,通过 device plugins 暴露给 Pod 使用。(kubernetes.io (Kubernetes))

这意味着,在 AI 系统里,“推理层单独扩 GPU,业务层维持 CPU 服务”常常是合理拆分边界。

9.4 哪些边界最适合先拆

比起按“前后端、用户、订单”这种传统域来拆,AI 系统更常见的天然拆分边界是:

  • 推理网关 / 模型服务
  • 检索与索引服务
  • 异步任务 / 工作流执行器
  • 业务 API 服务
  • 观测与评估服务

这些边界往往和资源、职责、故障模式都更一致。


10. 核心基础设施:AI 系统很早就该有的“五件套”

很多团队会把 AI 基础设施理解成“大厂才需要”。其实有些东西应该很早就有,只是形态可以先做轻。

10.1 Prompt 管理

Prompt 不应该只是散落在代码里的字符串。它应该至少具备:

  • 版本化
  • 环境区分
  • 回滚能力
  • 实验能力
  • 评估集对照

LangSmith 文档已经把 Prompt 作为可创建、管理、fork 和程序化拉取的对象,而不是纯手写常量。(docs.langchain.com (LangChain 文档))

10.2 模型路由与供应商抽象

哪怕早期只有一个 provider,也建议统一出口。原因不是为了“未来也许会换”,而是为了:

  • 统计成本
  • 做 fallback
  • 管理参数
  • 做实验
  • 控制超时和重试

10.3 缓存

缓存不只为了省钱,也为了:

  • 降低延迟
  • 提高系统稳定性
  • 减少重复推理
  • 给高峰流量兜底

10.4 限流与预算

AI 请求的资源消耗远高于普通读接口,所以你不仅要限 QPS,还经常要考虑:

  • 每用户 token 配额
  • 每租户每日预算
  • 高峰期队列控制
  • 长任务并发上限

10.5 观测与 Trace

OpenTelemetry 是当前通用的 vendor-neutral 观测框架,覆盖 traces、metrics 和 logs。对 AI 系统来说,这类统一 trace 能力非常重要,因为你需要把模型调用、检索、工具、业务动作串到同一条链路里。(opentelemetry.io (OpenTelemetry))

一句更直接的话是:

线上 AI 系统如果没有可追踪的输入、Prompt、模型、检索上下文、工具调用和输出摘要,基本等于不可运维。


11. 长任务与异步处理:AI 系统里“超过 3 秒”通常就该认真设计了

传统 API 里,一个请求几百毫秒或一两秒算正常;AI 系统里,几秒只是起点。

尤其这些任务很容易变成长任务:

  • 长文档解析
  • 批量总结
  • 复杂 RAG
  • 多轮工具调用
  • Agent 工作流
  • 代码生成与测试
  • 企业审批链

所以架构上要尽早区分:

11.1 同步流式任务

适合聊天和短生成。关键目标是改善感知延迟,而不是假装任务很快。

11.2 异步任务队列

适合长流程。重要的不只是“扔进队列”,而是你要定义清楚:

  • 任务状态
  • 超时
  • 重试策略
  • 幂等性
  • 失败通知
  • 取消机制
  • 中间结果可见性

11.3 长连接状态推送

适合用户需要看到过程的场景,比如:

  • 工具调用进度
  • 多阶段状态
  • 协作式编辑
  • Agent 当前执行步骤

一个常见误区

很多系统做了异步,但没有做好状态机。结果就是:

  • 前端只知道“处理中”
  • 后台失败了用户也不知道
  • 重试和重复提交分不清
  • 同一个任务无法恢复

所以真正的问题不在“同步还是异步”,而在于:你的任务是否被当成一等对象来管理。


12. 部署模式:别把“自托管大模型”当成成熟的标志

部署问题在 AI 领域也常常被讨论得很浪漫,好像谁自托管得多,谁就更高级。

其实大多数团队一开始真正要解决的是:

  • 需求是否已经成立
  • 成本是否能闭环
  • 延迟是否可接受
  • 数据和合规是否允许外部 API
  • 团队是否有能力运维推理栈

从这个角度看,部署模式更像一条演进路径,而不是身份象征。

12.1 API-first:大多数团队的合理起点

对于多数 AI 产品,业务层跑在自己的服务里,模型能力优先使用成熟 API,通常是最现实的选择。

优点很明确:

  • 上线快
  • 无需自己维护推理栈
  • 模型升级快
  • GPU 运维成本低

代价也明确:

  • 成本结构受供应商影响
  • 可控性有限
  • 某些合规场景可能不满足
  • 深度推理优化空间小

12.2 容器化业务层:最常见的生产形态

即便模型走第三方 API,业务层、编排层、检索层通常也会跑在容器/Kubernetes 上。这样做的价值在于:

  • 扩缩容灵活
  • 环境一致
  • 与企业基础设施整合方便
  • 可分离 CPU 服务与 GPU 服务

12.3 自托管推理:只有在理由足够强时才值得做

适合的典型场景通常是:

  • 合规要求数据不出域
  • 访问量大到 API 成本失衡
  • 需要深度控制模型与推理参数
  • 有专门平台团队维护 GPU 资源

否则,自托管经常会把团队从“做 AI 产品”带向“做推理平台”。


13. 从 MVP 到企业级:真正该演进的不是“技术栈酷不酷”,而是系统能力

很多架构讨论的问题,不在于观点错,而在于忽略了阶段。

13.1 MVP 阶段:速度第一,但别埋太深的坑

目标通常是:

  • 证明需求成立
  • 找到有效交互
  • 跑通最小可行链路

这个阶段通常更适合:

  • 模块化单体
  • 单模型或极少模型
  • 最少必要的 RAG
  • 最基本的日志、trace、配置化 Prompt
  • 很少的异步链路

这个阶段最常见的错,不是“架构不够先进”,而是把本该配置化和可观察的东西全写死。

13.2 增长期:稳定性、成本和评估开始成为主问题

一旦开始有真实流量,架构重心会明显转向:

  • 模型路由
  • Prompt 管理
  • 缓存
  • 观测
  • 评估集
  • 限流与预算
  • 异步任务系统
  • 检索质量优化

这时你会发现,真正限制系统增长的,通常不是“再接一个更强模型”,而是你是否能:

  • 稳定复现问题
  • 快速回滚策略
  • 把坏请求挡在外面
  • 把贵请求控制住

13.3 企业阶段:治理能力开始压过“单点效果”

到了企业级,系统关注点通常变成:

  • 多租户
  • 审计
  • 权限与审批
  • SLA / SLO
  • 数据隔离
  • 合规与驻留
  • 灰度、回滚、灾备
  • 长流程恢复与人工介入

这时“模型答得不错”已经不够了,系统还得能被治理。


14. 一个更成熟的思路:AI 架构里同时存在“控制面”和“数据面”

如果再往上抽象一层,可以把 AI 系统理解成同时包含两类东西:

数据面(runtime path)

也就是每次请求真正走过的路径:

  • 请求进入
  • 检索
  • Prompt 构造
  • 模型推理
  • 工具调用
  • 返回结果

控制面(control plane)

也就是不直接生成结果,但决定系统如何运行的那一层:

  • Prompt 版本管理
  • 模型配置
  • 灰度切换
  • 评估集
  • 预算策略
  • 观测与告警
  • 安全策略
  • 审批与治理规则

很多系统一开始只有数据面,没有控制面,所以看起来能跑,但很难运营。

一旦有真实业务,控制面会越来越重要。因为你不只是想“调用成功”,而是想:

  • 知道现在用的是什么 prompt 和模型版本
  • 某次事故是否可以回滚
  • 某个租户是否超预算
  • 某类请求是否该走更便宜模型
  • 某个实验版本是否真的更好

这也是为什么成熟 AI 系统最终都不只是几个接口,而会逐步长出一套平台能力。


15. 最后给一个架构判断顺序

如果你正在设计一个 AI 系统,比起先问“该不该上微服务”,更建议按这个顺序思考:

第一步:先界定 AI 只负责什么

不要让模型背业务规则的锅。先明确:

  • 它负责理解什么
  • 负责生成什么
  • 负责决策到什么程度
  • 哪些边界必须由规则系统把住

第二步:再设计分层

尤其把:

  • 业务逻辑
  • AI 编排
  • 模型接入
  • 数据与知识访问

明确分开。

第三步:尽早补齐最小基础设施

至少包括:

  • Prompt 可配置
  • 模型调用统一出口
  • Trace
  • 成本统计
  • 基本缓存
  • 限流和预算

第四步:用模块化单体起步

除非你已经非常清楚边界和流量模式,否则不要过早拆微服务。

第五步:按真实压力点演进

谁先成为瓶颈,就先拆谁:

  • GPU 推理先成瓶颈,就先拆模型服务
  • 检索先成瓶颈,就先拆检索层
  • 长任务先成瓶颈,就先补任务系统和工作流引擎

而不是按流行架构模板一次性搭满。


小结

AI 系统架构设计的核心,不是“把模型接进去”,而是围绕 AI 这层能力的几个现实约束来重新组织系统:

  • 它不确定,所以要做评估、校验、回退和观测
  • 它昂贵,所以要做路由、缓存、预算和限流
  • 它变化快,所以要把 Prompt、模型和编排从稳定业务逻辑里隔离出来
  • 它常常更慢,所以要认真设计流式、异步和长任务处理
  • 它会进入真实业务,所以最终一定要面对权限、审计、治理和部署演进

所以,一套好的 AI 架构并不追求“从第一天就完美”,而追求另一件事:

先把边界划清,再让系统随着真实压力逐步长出复杂度。

这比一开始就追求“终极架构图”更重要,也更接近真实工程。