1. 从一个尴尬的现场说起:为什么“AI 应用底座”这个词开始被频繁提起
去年下半年,我参与过一个挺典型的内部项目复盘。团队花了三个月做了一个“AI 问答助手”,演示的时候效果很好,领导点头,业务方也满意。结果上线两周后,问题全冒出来了:模型调用没有统一入口,三个业务线各写各的 SDK;提示词散落在代码、配置文件和数据库里,改一句提示词要发一次版;会话上下文没有统一存储,换个节点就丢历史;权限、审计、限流这些非功能性需求,每个接入方都要重新造一遍轮子。最后这个项目没有死在“AI 能力”上,而是死在“工程底座”上。
这件事之后,我对“AI 应用底座”这个概念有了非常具体的理解。它不是一个模型,也不是一个聊天窗口,而是一层介于底层大模型能力和上层业务应用之间的工程化中间层。QuickBlue 就是在这个背景下进入我视野的一个东西——它想解决的问题,正是上面那个复盘里暴露出来的一堆烂摊子。
先把话说在前面:QuickBlue 不是一个开源大模型,也不是某个具体的 AI 应用。从它的定位和关键词来看,它更像是一套面向 AI 应用场景的微服务工程底座,技术栈上带着很明显的 Spring Cloud、微服务拆分、JDK 21 这些标签。换句话说,它关心的是“AI 应用怎么被稳定、可维护、可扩展地跑起来”,而不是“模型有多聪明”。
这篇文章我打算聊四件事:QuickBlue 这类底座到底在解决什么问题;它和普通微服务框架的区别在哪;如果真要落地,架构上该怎么拆、哪些坑必须提前避开;以及为什么在 Spring Cloud Alibaba 生态出现变化、JDK 21 逐渐普及的当下,企业自建 AI 应用底座这件事变得比以前更值得认真对待。适合正在做 AI 应用落地、被工程问题折磨过的后端和架构同学看,也适合还没上手但想提前了解全貌的技术负责人。
2. QuickBlue 到底是个什么东西:把“AI 能力”和“业务系统”之间的那层胶水做厚
2.1 先厘清一个常见误解:它不是模型,也不是聊天机器人
很多人第一次听到 QuickBlue 这个名字,会下意识以为它是一个 AI 产品,比如某个智能助手或者某个大模型平台。但从它的关键词组合——微服务、Spring Cloud、JDK 21——基本可以判断,它的重心在服务端工程架构,而不是模型本身。
我习惯用一个类比来解释:如果把大模型比作“发电厂”,那 AI 应用就是“各种电器”,而 QuickBlue 这类底座就是“电网和配电系统”。发电厂再强,如果没有稳定的输电网络、没有标准的插座接口、没有过载保护,电器是用不起来的。企业真正缺的往往不是电,而是那套能把电安全送到每个房间的系统。
所以 QuickBlue 的定位,我理解是:一套把大模型调用、提示词管理、会话上下文、权限审计、限流熔断、多租户隔离这些 AI 应用共性能力,沉淀成标准微服务组件的工程底座。业务团队接入它之后,不用再从零写一遍模型调用和上下文管理,而是直接复用底座能力,把精力放在业务逻辑上。
2.2 为什么“底座”这个词比“框架”更准确
框架和底座,听起来差不多,但实际差别很大。框架通常是一组库和约定,你引入依赖、按它的方式写代码就行,它不负责运行。底座不一样,底座是要跑起来的、带运行时能力的系统。
具体到 QuickBlue 这类东西,它至少包含几层含义:
- 它是可独立部署的服务集群,不是一堆 jar 包。模型网关、会话服务、提示词服务、权限服务各自是独立进程,能单独扩容、单独发布。
- 它提供统一的接入协议。业务方通过标准 API 或 SDK 接入,而不是直接对接各家模型厂商的原始接口。
- 它承担非功能性职责。限流、熔断、降级、审计、计费统计这些事,在底座层统一做,业务层不用关心。
- 它屏蔽底层差异。今天用 A 模型,明天换 B 模型,业务代码不用改,只改底座里的适配层。
这四点里,我认为屏蔽底层差异是最有价值的。因为模型迭代速度太快了,如果业务代码和某个具体模型深度绑定,每次换模型都是一次重构。底座把这层变化隔离掉,业务才能稳定。
2.3 从关键词反推 QuickBlue 的技术画像
把热搜词和关键词放在一起看,QuickBlue 的技术画像其实挺清晰的。我整理了一张表,把关键词和它对应的工程含义列出来:
| 关键词 | 对应的工程含义 |
|---|---|
| 微服务 / 微服务拆分 | 底座按职责拆成多个独立服务,而非单体 |
| Spring Cloud | 服务注册发现、配置中心、网关、负载均衡的基础设施 |
| JDK 21 | 运行时基线,涉及虚拟线程、新 GC 等性能特性 |
| 微服务架构图 | 需要清晰的调用关系和依赖拓扑 |
| Sentinel | 限流、熔断、降级的流量治理组件 |
| Redis 集群 | 会话上下文、缓存、分布式锁的存储层 |
| 若依微服务 | 国内常见的微服务脚手架参考,说明底座可能借鉴了类似工程结构 |
这张表里,我觉得最值得单独说的是JDK 21。很多人会忽略运行时版本,觉得“能跑就行”。但 AI 应用有个特点:大量时间花在等待外部 IO 上——等模型返回、等向量库查询、等第三方接口。这种场景下,JDK 21 的虚拟线程(Virtual Threads)价值非常大。传统线程池模式下,一个请求占一个线程,线程数上不去,吞吐就卡死;虚拟线程可以让“等待”这件事的成本大幅降低,同样的硬件能扛更多并发。这不是玄学,是实打实的资源账。
2.4 一个容易被忽略的点:底座本身也要“可被治理”
我在实际项目里踩过一个坑:团队花大力气做了一个很漂亮的 AI 网关,结果这个网关自己成了单点。所有业务都走它,它一挂全挂,它一慢全慢。后来复盘才发现,我们在设计底座的时候,只想着“底座治理业务”,忘了“底座自己也需要被治理”。
QuickBlue 这类底座如果设计得当,应该具备几个自我治理能力:底座内部服务之间的调用要有超时和重试策略;模型网关要能按租户、按业务线做隔离,避免一个业务把配额打满影响其他人;配置变更要能灰度,不能一改全量生效。这些细节在架构图上看不出来,但决定了底座能不能真正扛住生产流量。
3. 企业为什么需要这层底座:四个绕不开的现实问题
3.1 问题一:模型调用散落各处,成本和风险都失控
我见过最夸张的一个项目,同一个公司内部有七个团队在调同一个大模型,每个团队自己封装了一套调用逻辑,各自维护自己的 API Key,各自处理重试和超时。结果月底对账的时候,财务问“这个月模型费用为什么涨了 40%”,没人能说清楚是哪个业务涨的。
这就是没有底座的典型症状。调用入口不统一,成本就无法归集,风险就无法管控。底座要做的第一件事,就是把所有模型调用收敛到一个网关层。这个网关负责:统一鉴权、统一计费打点、统一限流、统一日志。业务方拿到的是一把“受控的钥匙”,而不是直接拿到模型厂商的原始凭证。
从工程角度看,这个网关的价值不只是省钱。它还能做模型路由——简单问题走便宜的小模型,复杂问题走贵的大模型;还能做降级——主模型不可用时自动切到备用模型。这些能力如果散在各个业务里,根本没法统一实现。
3.2 问题二:提示词是“代码之外的代码”,却没有被当代码管理
提示词工程这件事,很多人嘴上重视,实际管理很随意。我见过提示词直接硬编码在 Java 字符串里的,也见过放在数据库一张表里、改一次要手动执行 SQL 的,还见过放在配置中心但没有任何版本记录的。
提示词本质上是一种业务逻辑,它决定了 AI 的行为。既然是业务逻辑,就应该像代码一样被管理:有版本、有审核、有灰度、有回滚。QuickBlue 这类底座如果把提示词服务独立出来,就能解决几个具体问题:
- 版本管理:每次修改生成新版本,旧版本可回滚,出问题能快速定位是哪次改动导致的。
- 灰度发布:新提示词先对 5% 流量生效,观察效果再全量。
- 多环境隔离:开发、测试、生产的提示词互不干扰。
- 权限控制:谁能改提示词、谁能发布,有明确边界。
提示:提示词服务千万不要做成“一个大 JSON 存所有提示词”。按业务域、按场景拆分,否则后期维护会非常痛苦。
3.3 问题三:会话上下文管理,比想象中复杂得多
“记住上下文”这件事,看起来简单,做起来坑很多。我总结过几个典型问题:
第一,存储选型。会话数据是典型的热数据,读写频繁、单条不大、需要快速过期。用关系型数据库扛不住,用 Redis 集群是常见选择。但 Redis 集群有个坑:如果会话数据需要按用户维度做范围查询,集群模式下的 key 分布会让查询变得很别扭,需要提前设计好 key 结构。
第二,上下文长度控制。模型有上下文窗口限制,历史对话不能无限往里塞。底座需要做上下文裁剪策略——按时间裁剪、按重要性裁剪、或者做摘要压缩。这个策略如果让每个业务自己实现,质量参差不齐。
第三,多轮会话的状态一致性。用户可能在多个设备上继续同一个会话,也可能在会话中途切换业务场景。底座要保证会话状态在分布式环境下的一致性,这就涉及分布式锁、乐观锁这些机制。
QuickBlue 如果把这部分做成独立服务,业务方只需要传一个 sessionId,剩下的存储、裁剪、一致性都由底座处理,接入成本会低很多。
3.4 问题四:AI 应用的流量特征,和传统 Web 应用完全不同
传统 Web 应用的流量,通常是“请求-快速响应”模式,RT 在几十毫秒级别。AI 应用的流量完全不一样:RT 长、波动大、资源占用高。一次模型调用可能几百毫秒,也可能几秒甚至几十秒;高峰期和低谷期差距可能是几十倍。
这种流量特征,对底座提出了特殊要求:
- 长连接和流式响应:很多 AI 场景需要 SSE 或 WebSocket 流式返回,传统短连接网关处理不好。
- 超时策略要重新设计:默认 3 秒超时在 AI 场景下完全不适用,需要按接口类型分别配置。
- 线程模型要调整:大量线程阻塞在等待模型返回上,JDK 21 虚拟线程在这里能明显降低资源消耗。
- 限流维度要更细:不能只按 QPS 限流,还要按 token 消耗量、按并发会话数限流。
这些差异,决定了 AI 应用底座不能简单套用传统微服务的默认配置,必须针对 AI 流量特征做专门优化。
4. 如果我来设计 QuickBlue 这类底座:架构拆解与关键取舍
4.1 服务怎么拆:按“变化频率”而不是按“技术分层”
微服务拆分最容易犯的错误,是按技术分层拆——controller 一层、service 一层、dao 一层。这种拆法在 AI 底座场景下是灾难,因为每层的变化频率不一样,绑在一起会导致频繁的跨服务调用。
我的经验是按变化频率和职责边界拆。QuickBlue 这类底座,我倾向于拆成这么几个服务:
| 服务 | 职责 | 变化频率 |
|---|---|---|
| 模型网关服务 | 统一模型调用、路由、降级、计费打点 | 中(模型厂商接口变动时) |
| 提示词服务 | 提示词版本管理、灰度、渲染 | 高(业务频繁调整) |
| 会话服务 | 上下文存储、裁剪、一致性 | 低(逻辑相对稳定) |
| 权限审计服务 | 鉴权、配额、审计日志 | 低 |
| 向量检索服务 | 知识库检索、embedding 管理 | 中 |
这么拆的好处是:提示词服务变化最频繁,可以独立高频发布,不影响其他服务;会话服务逻辑稳定,可以少动;模型网关变化中等,独立演进。如果全塞在一个单体里,改一句提示词就要全量发布,风险和成本都很高。
4.2 模型网关的核心设计:适配器模式 + 责任链
模型网关是整个底座最核心的组件,我重点说一下它的设计思路。
第一层是适配器模式。不同模型厂商的接口协议、参数格式、返回结构都不一样。网关内部为每家厂商写一个适配器,对外暴露统一的接口。业务方调用的是统一接口,适配器负责翻译。这样换模型只需要新增或替换适配器,业务代码零改动。
第二层是责任链。一次模型调用要经过很多处理步骤:鉴权、配额检查、限流、提示词渲染、参数校验、调用、结果后处理、计费打点、日志记录。这些步骤用责任链串起来,每个步骤独立可插拔。比如某个业务不需要计费,就把计费节点摘掉;某个场景需要额外的内容过滤,就插一个过滤节点。
// 责任链的简化示意,实际实现会更复杂 public interface ModelInvokeHandler { ModelResponse handle(ModelRequest request, HandlerChain chain); } // 典型链路:鉴权 -> 限流 -> 渲染 -> 调用 -> 后处理 -> 打点 HandlerChain chain = new HandlerChain() .add(new AuthHandler()) .add(new RateLimitHandler()) .add(new PromptRenderHandler()) .add(new InvokeHandler()) .add(new PostProcessHandler()) .add(new MetricsHandler());这种设计的好处是可测试、可扩展、可组合。每个 Handler 单独测试,新增能力不影响已有逻辑。
4.3 会话服务的存储设计:Redis 集群 + 冷热分离
会话数据我建议做冷热分离。热数据是最近几轮对话,放 Redis 集群,读写快;冷数据是历史对话,定期归档到对象存储或关系库,需要时再加载。
Redis 集群的 key 设计有个细节要注意:如果按session:{sessionId}存整个会话,单 key 会越来越大,而且集群模式下大 key 会导致数据倾斜。更好的做法是按轮次拆分,session:{sessionId}:turn:{n},每轮一条记录,用 List 或 Sorted Set 组织。这样单 key 小,分布均匀,也方便按轮次裁剪。
上下文裁剪策略我一般用滑动窗口 + 摘要的组合:保留最近 N 轮完整对话,更早的对话做摘要压缩成一段话放在最前面。这样既控制了 token 消耗,又不完全丢失历史信息。
4.4 JDK 21 虚拟线程:不是银弹,但在这个场景确实有用
JDK 21 的虚拟线程在 AI 底座场景下确实有价值,但要说清楚它适合什么、不适合什么。
适合的场景:模型调用、向量检索、第三方 API 调用这类IO 密集型、线程大量阻塞在等待上的操作。虚拟线程让“等待”几乎不占操作系统线程,同样的硬件能支撑更高的并发。
不适合的场景:CPU 密集型计算,比如本地做 embedding 计算、做复杂的文本处理。这些场景虚拟线程没有优势,甚至因为调度开销可能更慢。
还有一个坑要注意:虚拟线程和 synchronized 的配合。在 JDK 21 早期版本里,虚拟线程遇到 synchronized 块可能会 pin 住载体线程,导致性能下降。虽然后续版本有优化,但在实际使用中,涉及共享资源同步的地方,建议优先用ReentrantLock而不是synchronized。
注意:升级 JDK 21 不是改个版本号就完事。依赖库的兼容性、GC 参数、监控指标都要重新验证。我建议先在非核心业务上灰度,观察至少两周再推广。
4.5 限流熔断:Sentinel 的规则要按 AI 场景重新配
Sentinel 是 Spring Cloud 生态里常用的流量治理组件,但默认配置是给传统 Web 应用用的,直接套到 AI 场景会出问题。
传统限流通常按 QPS 配,比如某个接口每秒最多 100 次。但 AI 场景下,一次调用消耗的资源差异巨大——简单问答可能只消耗几百 token,复杂分析可能消耗几万 token。只按 QPS 限流,会出现“100 次调用里有 99 次是轻量的,1 次是超重的,结果超重那次把配额打满”的情况。
我的做法是多维度限流:QPS 限流 + token 消耗限流 + 并发会话数限流,三个维度同时生效。Sentinel 支持自定义规则,可以基于 token 消耗量做热点参数限流。熔断策略也要调整,AI 接口的慢调用比例阈值不能按传统标准设,否则正常的长耗时调用会被误判为故障。
5. 落地过程中最容易踩的五个坑
5.1 坑一:把底座做成了“大泥球”
我见过一个团队,一开始拆了五个服务,做着做着发现服务间调用太麻烦,于是又合并回两个,最后变成一个“大服务 + 一堆工具类”。这就是典型的拆分过度后又回退。
根因是拆分时没有想清楚服务边界。判断边界有个简单标准:如果两个模块的数据一致性要求很高、变更总是一起发生,那它们就不该拆开。模型网关和计费打点可以拆,因为计费可以异步;但提示词渲染和参数校验最好放一起,因为它们总是一起变。
5.2 坑二:配置中心成了新的“单点”
用 Spring Cloud Config 或 Nacos 做配置中心很常见,但很多人忘了配置中心本身的高可用。配置中心一挂,所有服务重启时拉不到配置,直接起不来。
我的经验是:配置中心必须集群部署,且客户端要有本地缓存兜底。Nacos 客户端支持本地快照,配置中心不可用时用本地缓存启动,这个能力一定要开启并验证。另外,敏感配置比如模型 API Key,不要明文放配置中心,要走加密或者独立的密钥管理。
5.3 坑三:日志和链路追踪没做好,出问题查不动
AI 应用的调用链路比传统应用长得多:网关 -> 鉴权 -> 限流 -> 提示词渲染 -> 模型调用 -> 后处理 -> 返回。中间任何一环出问题,如果没有完整的链路追踪,排查起来就是噩梦。
我建议从第一天就把 traceId 贯穿全链路,每个环节的日志都带上 traceId。模型调用的请求和响应(注意脱敏)也要记录,方便复现问题。这块投入看起来是“非功能性”的,但实际能省下大量排查时间。
5.4 坑四:忽略了多租户隔离,一个业务拖垮所有人
如果底座是给多个业务线共用的,多租户隔离必须提前设计。隔离维度包括:配额隔离(每个租户独立的 token 配额)、存储隔离(会话数据逻辑隔离)、限流隔离(一个租户的流量不影响其他租户)。
我见过没做隔离的后果:某个业务做了一次批量测试,瞬间打满模型配额,导致其他所有业务当天都无法调用。这种事故一旦发生,底座的信任度就没了。
5.5 坑五:版本升级没有回滚方案
微服务架构下,服务版本升级是常态。但 AI 底座有个特殊性:模型版本、提示词版本、服务版本三者可能独立变化。如果升级出问题,要能快速定位是哪一层的问题,并单独回滚。
我的做法是:每次发布记录三个版本号的组合(服务版本 + 模型版本 + 提示词版本),出问题时可以精确回滚到某个组合。这个“版本三元组”的概念,在 AI 应用里比传统应用重要得多。
6. 关于 Spring Cloud 生态变化和自建底座的一些个人判断
6.1 Spring Cloud Alibaba 的变化,对底座选型意味着什么
最近圈子里讨论比较多的是 Spring Cloud Alibaba 相关组件的维护节奏变化。这件事对做 AI 应用底座的团队来说,影响是实实在在的:如果你重度依赖某个特定组件,而它的维护节奏放缓,后续的安全更新和兼容性适配就会成为隐患。
我的建议是不要把底座绑死在单一实现上。服务注册发现、配置中心、限流这些能力,尽量通过标准接口抽象,底层实现可替换。比如限流,Sentinel 可以用,但业务代码里不要直接依赖 Sentinel 的 API,而是封装一层自己的接口,将来换实现时改动可控。
6.2 自建底座 vs 直接用现成平台,怎么选
这是个很现实的问题。市面上有不少现成的 AI 应用平台,开箱即用,为什么还要自建底座?
我的判断标准是看你的核心诉求在哪。如果你的 AI 应用是标准场景、需求变化不大、对数据主权要求不高,用现成平台更划算。但如果你的场景有特殊性——比如需要深度定制模型路由策略、需要和内部系统深度集成、对数据隔离有硬性要求——那自建底座更合适。
QuickBlue 这类底座的价值,恰恰在于它提供了一个可定制的起点。你不是从零开始,也不是被平台绑死,而是在一个合理的工程结构上做自己的扩展。
6.3 给准备动手的团队的三条实操建议
第一条,先跑通最小闭环,再谈架构完善。不要一上来就设计五个服务、三套存储。先用一个服务把“模型调用 + 提示词 + 会话”跑通,验证核心链路,再逐步拆分。我见过太多团队在架构设计上花了两个月,结果核心功能还没跑通。
第二条,把可观测性当一等公民。日志、指标、链路追踪,从第一行代码就要考虑。AI 应用的排查难度比传统应用高,没有可观测性就是盲人摸象。
第三条,预留模型切换能力。不要假设你现在选的模型会一直用下去。适配器层、统一接口、配置化路由,这些设计一开始可能觉得“过度设计”,但半年后你会感谢自己。
6.4 一个具体的落地节奏参考
如果让我给一个从零开始的团队排节奏,大概是这样:
- 第 1-2 周:搭起基础工程结构,跑通单服务的模型调用闭环,确定 JDK 版本和核心依赖。
- 第 3-4 周:把提示词管理和会话管理独立出来,接入 Redis 集群,验证存储方案。
- 第 5-6 周:引入模型网关,做统一鉴权和计费打点,接入 Sentinel 做基础限流。
- 第 7-8 周:完善可观测性,压测验证,做多租户隔离,准备灰度上线。
这个节奏不算快,但每一步都有可验证的产出。比起一开始就追求“完整架构”,这种渐进式的方式风险更低,也更容易在过程中发现问题、调整方向。
我在实际做这类底座的时候,最大的体会是:技术选型的重要性,远不如边界划分和演进节奏的重要性。选 Spring Cloud 还是别的,选 Redis 还是别的,这些都有成熟答案;但服务怎么拆、什么时候拆、拆完怎么保证一致性,这些没有标准答案,只能结合团队和业务实际情况判断。QuickBlue 这类底座提供的,与其说是一套技术方案,不如说是一种把 AI 应用工程化落地的思路——先承认 AI 应用和传统应用不一样,然后针对这些不一样,老老实实把工程问题一个个解决掉。