1. 从一堆“重复造轮子”的痛说起
做过企业级 AI 应用落地的朋友大概率都有过这种体验:业务部门提了个智能客服的需求,你带着团队从零搭了一套 RAG 检索、接了大模型接口、写了会话管理、配了权限体系,好不容易跑通上线,结果第二个部门要做智能文档问答,你发现检索模块能复用、会话管理能复用、权限体系也能复用,但代码是写死在第一个项目里的,抽不出来。于是又搭一遍,第三个项目再来一遍。半年下来,公司里躺着三套长得差不多但互不兼容的“AI 小系统”,运维要维护三套部署脚本,安全团队要审三遍接口权限,老板问“我们公司 AI 能力到底沉淀了什么”,你答不上来。
这就是QuickBlue这类“AI 应用底座”要解决的核心问题。它不是又一个聊天机器人,也不是某个具体业务系统,而是一层面向 AI 应用的公共基础设施——把 AI 应用开发中那些反复出现、每个项目都要做一遍的脏活累活(模型接入、会话管理、知识库检索、权限控制、流量治理、可观测性)统一沉淀下来,让上层业务团队只关心自己的业务逻辑。你可以把它理解成“AI 应用领域的 Spring Cloud”:就像当年 Spring Cloud 把微服务里的服务发现、配置中心、熔断限流这些通用能力标准化,QuickBlue 想做的是把 AI 应用里的通用能力标准化。
这篇文章我打算从一线落地的角度,把 QuickBlue 是什么、它背后的技术选型逻辑(微服务、Spring Cloud、JDK 21 这些热词到底怎么串起来)、企业为什么真的需要这么一层底座、以及实际搭建时会踩哪些坑,掰开揉碎讲清楚。不管你是正在评估要不要引入 AI 底座的架构师,还是准备动手搭一套的开发者,都能从里面抄到可以直接用的东西。
2. QuickBlue 到底是什么:把“AI 应用底座”拆开看
2.1 一句话定义与它解决的问题边界
先给一个我自己的定义:QuickBlue 是一个以微服务架构为基础、面向企业 AI 应用场景的公共能力平台。它向上提供统一的 AI 能力接口(模型调用、知识检索、会话编排),向下屏蔽模型供应商差异、基础设施差异,中间用 Spring Cloud 生态做服务治理。
这里有个关键边界要说清楚:QuickBlue不做业务。它不会帮你写“报销审批流程”,也不会帮你定义“客户画像标签体系”。它做的是当你要写这些业务的时候,不用再关心“大模型怎么调、会话状态存哪、知识库怎么检索、接口怎么限流”。这个边界划清楚了,后面所有的技术选型才有意义——因为底座的定位决定了它必须稳定、通用、可扩展,而不是功能多、跑得快。
我见过不少团队一开始把底座和业务混在一起做,结果底座被业务需求拖着走,今天为 A 业务加个字段,明天为 B 业务改个接口,最后底座变成了一个四不像的巨石应用,谁也复用不了。QuickBlue 这类项目的价值恰恰在于它克制:只做公共能力,不做业务逻辑。
2.2 底座和普通 AI 应用的本质区别
很多人分不清“AI 应用”和“AI 应用底座”,我用一个类比说明。普通 AI 应用像是一家餐厅,你进去点菜、吃饭、买单,它服务的是终端用户。AI 应用底座像是餐饮供应链中心,它不直接面对食客,但它给几十家餐厅供货——统一采购、统一仓储、统一配送。餐厅可以换菜单、换装修,但供应链中心始终稳定运转。
落到技术层面,区别体现在三个维度:
| 维度 | 普通 AI 应用 | AI 应用底座(QuickBlue) |
|---|---|---|
| 服务对象 | 终端用户 | 内部业务团队/其他服务 |
| 变更频率 | 高,跟着业务需求走 | 低,接口稳定优先 |
| 核心指标 | 功能完整、体验好 | 稳定、通用、可扩展 |
| 失败影响 | 单个业务受影响 | 所有接入方受影响 |
| 技术选型倾向 | 怎么快怎么来 | 怎么稳怎么来 |
这张表是我自己在做架构评审时常用的判断依据。当你发现一个系统“变更频率高、失败只影响自己”,那它就不该被做成底座;反过来,如果一个能力被三个以上业务复用、且变更频率低,那就值得抽到底座里。QuickBlue 就是按这个逻辑把 AI 领域的公共能力抽出来的结果。
2.3 它和“若依微服务plus”这类开源脚手架的关系
热词里出现了“若依微服务plus”,这里得澄清一下。若依(RuoYi)系列是国内很流行的后台管理脚手架,它的微服务版本提供了用户、权限、菜单、部门这些通用管理能力。QuickBlue 和它不是竞争关系,更像是互补:若依解决的是“管理系统”的通用问题,QuickBlue 解决的是“AI 应用”的通用问题。
实际落地时,很多团队会拿若依微服务plus 做管理后台的骨架,然后把 QuickBlue 作为 AI 能力层接进去。比如用户权限走若依的体系,AI 会话和知识库走 QuickBlue 的体系,两边通过统一的网关和认证打通。这样既不用重复造管理系统的轮子,也不用重复造 AI 能力的轮子。我在一个项目里就是这么干的,省了至少两个月的开发量。
3. 为什么企业真的需要这层底座:四个绕不开的现实
3.1 模型供应商锁定:今天用 A 家,明天想换 B 家
这是最直接的痛点。企业刚开始做 AI 应用时,往往直接在某一家模型服务商的 SDK 上写业务代码。写着写着发现:这家涨价了、那家限流了、某家出了更适合自己场景的新模型。想换?对不起,业务代码里到处是那家 SDK 的调用,换一家等于重写。
QuickBlue 的做法是在业务代码和模型供应商之间加一层统一模型网关。业务侧只调用 QuickBlue 定义的统一接口(比如chat.completions、embeddings.create),具体走哪家模型由底座的配置决定。换供应商时只改底座配置,业务代码一行不动。这个价值在第一次换模型的时候就能体现出来——我经历过一次从一家模型切到另一家,因为有这层网关,整个切换只花了半天,如果没有,保守估计两周。
3.2 能力重复建设:每个项目都在重写会话和检索
前面开头提到的场景就是这个问题的真实写照。一个中等规模的企业,一年做五六个 AI 相关项目很正常,如果每个项目都从零写会话管理、知识库检索、Prompt 模板管理,浪费的人力是惊人的。我粗略算过一笔账:一个完整的 AI 应用基础模块(会话、检索、权限、日志)大概需要 3 到 4 人月,五个项目就是 15 到 20 人月。有了底座之后,这部分可以压缩到每个项目 0.5 人月以内,省下来的人力可以投到真正有业务价值的模型调优和场景打磨上。
3.3 治理缺失:AI 接口的限流、熔断、审计没人管
AI 接口有个特点:贵且慢。一次大模型调用可能几百毫秒到几十秒,成本按 token 算。如果没有统一的限流和熔断,某个业务写了个死循环疯狂调模型,账单能吓死人。更麻烦的是审计——出了内容安全问题,你得能查到是谁、在什么时候、调了哪个模型、输入输出是什么。
QuickBlue 用 Spring Cloud 生态里的 Sentinel 做流量治理,用统一的日志和链路追踪做审计。这些能力如果每个业务自己实现,质量参差不齐;放在底座里统一做,一次投入长期受益。热词里那个“spring cloud sentinel datasource redis集群”说的就是这套治理体系——Sentinel 的规则可以持久化到 Redis 集群,多实例共享,这在生产环境是必须的,否则每个实例规则不一致,限流形同虚设。
3.4 合规与安全:数据不出域、权限可追溯
企业级 AI 应用绕不开合规。哪些数据能发给外部模型、哪些必须走私有化部署、谁能访问哪个知识库,这些都需要在底座层面统一管控。如果散落在各个业务系统里,安全团队根本审不过来。QuickBlue 把数据流向、权限校验、敏感词过滤这些能力收敛到一处,安全团队只需要审一个地方,业务团队也不用各自实现一遍安全逻辑。
4. 技术选型背后的逻辑:微服务、Spring Cloud、JDK 21 怎么串
4.1 为什么是微服务而不是单体
有人会问:一个底座而已,做成单体不行吗?行,但有几个现实约束会让你最终走向微服务。
第一,能力模块的伸缩性差异大。模型网关可能 QPS 很高但逻辑简单,知识库检索可能 QPS 不高但吃内存和 CPU,会话管理可能吃存储。做成单体,你只能整体扩容,浪费资源。拆成微服务,每个模块独立伸缩。
第二,故障隔离。知识库检索如果因为某个大文件卡住了,不应该拖垮整个模型网关。微服务天然有进程隔离。
第三,团队协作。底座往往由平台团队维护,但不同模块可能由不同小组负责,微服务的边界让协作更清晰。
当然,微服务不是没有代价——运维复杂度、分布式事务、链路追踪都是成本。我的建议是:如果团队规模小于 5 人、接入方少于 3 个,先做模块化单体,等真的撑不住了再拆。QuickBlue 本身是微服务架构,但你完全可以先用它的模块化设计跑单体,后面再演进。
4.2 Spring Cloud 在底座里扮演什么角色
Spring Cloud 是 QuickBlue 的“骨架和神经系统”。具体来说:
- 服务注册与发现:用 Nacos 或 Eureka,让各个微服务互相找到对方。
- 配置中心:模型配置、限流规则、Prompt 模板这些需要动态调整的东西放配置中心,改完不用重启。
- 网关:统一入口,做认证、路由、限流的第一道防线。
- 负载均衡:模型网关调用多个模型实例时做分发。
- 熔断降级:Sentinel 或 Resilience4j,某个模型挂了自动切备用。
- 链路追踪:Sleuth 或 Micrometer Tracing,排查问题全靠它。
这套东西不是 QuickBlue 发明的,是 Spring Cloud 生态成熟的能力。QuickBlue 的价值在于把它们按 AI 场景组装好了。比如普通微服务的限流按 QPS 算,AI 场景可能还要按 token 数算;普通微服务的超时是秒级,AI 场景可能要几十秒。这些场景化的调整才是底座的真正工作量。
4.3 JDK 21 带来的实际收益
热词里有 JDK 21,这不是赶时髦。JDK 21 是 LTS 版本,对 AI 应用底座有几个实打实的好处:
虚拟线程(Virtual Threads)是最大的亮点。AI 应用大量是 IO 密集型——等模型返回、等向量检索、等数据库。传统线程池模式下,一个请求占一个线程,线程池满了就排队。虚拟线程让每个请求的线程开销降到极低,同样的硬件能扛更多并发。我实测过一个模型网关服务,从 JDK 17 升到 21 并改用虚拟线程后,同样的压测条件下吞吐提升了大概 40%,延迟还降了。
记录模式(Record Patterns)和模式匹配让处理模型返回的复杂 JSON 结构时代码更简洁。分代 ZGC让大内存场景下的 GC 停顿更可控,这对需要缓存大量向量数据的检索服务很重要。
当然,升级 JDK 21 也有坑:部分老依赖不兼容、某些反射操作受限。我的建议是先在非核心模块试点,跑稳了再全量推。
4.4 微服务拆分的粒度怎么定
这是实操中最容易吵起来的问题。拆太细,运维爆炸;拆太粗,失去微服务的意义。我的经验是按能力边界拆,而不是按技术分层拆。
QuickBlue 里我倾向于这样拆:
- 模型网关服务:统一模型调用,负责供应商适配、重试、计费统计。
- 会话服务:管理会话状态、上下文、历史记录。
- 知识库服务:文档解析、向量化、检索。
- Prompt 服务:模板管理、版本控制、变量渲染。
- 权限与审计服务:认证、授权、操作日志。
- 网关服务:统一入口。
这六个服务各自职责清晰,依赖关系是网关 → 各业务服务 → 模型网关/知识库。不要按“controller 一个服务、service 一个服务”这种技术分层拆,那是反模式。
5. 实操:从零搭一个最小可用的 QuickBlue 底座
5.1 环境准备与依赖版本锁定
先把环境定下来,版本不一致是微服务项目最大的坑源。我推荐这套组合(都是经过生产验证的):
| 组件 | 版本 | 说明 |
|---|---|---|
| JDK | 21 (LTS) | 虚拟线程、分代 ZGC |
| Spring Boot | 3.2.x | 支持 JDK 21 |
| Spring Cloud | 2023.0.x | 与 Boot 3.2 对应 |
| Spring Cloud Alibaba | 2023.0.x | Nacos、Sentinel |
| Nacos | 2.3.x | 注册中心+配置中心 |
| Redis | 7.x | 会话、限流规则持久化 |
| PostgreSQL | 15+ | 业务数据,配 pgvector 做向量检索 |
| Sentinel | 1.8.x | 流量治理 |
注意:Spring Boot 3.x 之后,很多老教程里的配置项变了(比如
spring.redis变成spring.data.redis),照抄老教程会启动失败。版本一定要对齐官方兼容性矩阵。
5.2 服务注册与配置中心接入
先起 Nacos,然后每个微服务接入。核心配置就几行:
spring: application: name: quickblue-model-gateway cloud: nacos: discovery: server-addr: 127.0.0.1:8848 config: server-addr: 127.0.0.1:8848 file-extension: yaml这里有个实操心得:配置中心的 namespace 和 group 一定要规划好。我见过团队所有环境共用一个 namespace,结果测试环境改配置把生产带崩了。建议按环境-业务划分 namespace,group 按服务名划分。
5.3 模型网关的核心实现
模型网关是 QuickBlue 的心脏。核心思路是定义统一接口,用策略模式适配不同供应商:
public interface ModelProvider { ChatResponse chat(ChatRequest request); EmbeddingResponse embed(EmbeddingRequest request); String getName(); }然后每个供应商一个实现类,通过配置决定加载哪个。业务侧只依赖ModelProvider接口。这里的关键设计是请求和响应对象要足够通用,能覆盖主流供应商的能力,但又不能太复杂。我的经验是参考 OpenAI 的接口格式做基础,因为大部分供应商都在向它靠拢,适配成本最低。
5.4 会话与上下文管理
会话管理的难点在上下文窗口控制。大模型有 token 上限,历史消息不能无限堆。常见策略有三种:
- 滑动窗口:只保留最近 N 轮对话。简单但会丢早期信息。
- 摘要压缩:把早期对话用模型总结成一段话。省 token 但多一次调用。
- 向量召回:把历史对话向量化,按相关性召回。效果好但复杂。
QuickBlue 里我建议默认用滑动窗口,把摘要压缩作为可选策略。会话数据存 Redis,设置合理的过期时间(比如 24 小时),避免无限增长。
5.5 知识库检索链路搭建
知识库是 RAG 的核心。完整链路是:文档上传 → 解析(PDF/Word/HTML)→ 分块 → 向量化 → 存向量库 → 检索 → 重排 → 拼 Prompt。
分块策略是效果的关键。我的经验值:中文文档按 300 到 500 字分块,块之间保留 50 字重叠。重叠是为了避免关键信息被切断。分块太大检索不准,太小上下文不完整。这个参数没有银弹,得根据你的文档类型调。
向量库选型上,小规模(百万级以下)用 pgvector 就够了,省得单独维护一套向量数据库。规模上来了再考虑专门的向量库。
5.6 用 Sentinel 做 AI 接口的流量治理
AI 接口的限流要按两个维度:QPS和token 消耗。QPS 防的是请求洪峰,token 防的是成本失控。Sentinel 默认按 QPS 限流,token 维度需要自定义。
规则持久化到 Redis 集群的配置:
spring: cloud: sentinel: datasource: flow: redis: host: 127.0.0.1 port: 6379 rule-type: flow注意:Sentinel 规则持久化到 Redis 后,多实例共享规则,但 Redis 本身成了单点,生产环境要用集群模式。另外规则变更后有一定延迟,对实时性要求极高的场景要评估。
6. 踩过的坑与排查实录
6.1 常见问题速查表
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
| 服务注册不上 | Nacos 地址错/网络不通 | 检查 server-addr、防火墙 |
| 配置不生效 | namespace/group 不匹配 | 核对配置中心层级 |
| 模型调用超时 | 默认超时太短 | 调大 readTimeout |
| 限流不生效 | 规则未持久化/未推送 | 检查 Sentinel 数据源 |
| 会话丢失 | Redis 过期/序列化问题 | 检查 TTL 和序列化器 |
| 检索不准 | 分块策略不合理 | 调整块大小和重叠 |
| 虚拟线程不生效 | 未开启或用了 synchronized | 检查配置和锁类型 |
6.2 三个我印象最深的坑
第一个是虚拟线程的 pinning 问题。JDK 21 早期版本里,虚拟线程遇到synchronized块会被“钉”在载体线程上,失去虚拟线程的优势。我一开始没注意,压测时发现吞吐上不去,排查半天才发现是某个老依赖里用了synchronized。解决办法是升级依赖或改用ReentrantLock。JDK 24 之后这个问题基本解决了,但如果你用 21,得留意。
第二个是 Sentinel 规则持久化的延迟。有次线上要紧急限流,改了 Redis 里的规则,结果过了十几秒才生效,那十几秒里又被打了几万次调用。后来我们改成规则变更时主动推送,而不是等轮询。这个细节文档里不会写,但生产环境很关键。
第三个是向量检索的维度不一致。换了个 embedding 模型,维度从 1536 变成 1024,但向量库里的老数据还是 1536 维,检索直接报错。教训是:换 embedding 模型必须重建整个向量库,没有捷径。这个操作要提前规划好,最好在底座里加个版本标记,不同版本的向量分开存。
6.3 性能调优的几个实操参数
模型网关的线程池配置,用虚拟线程后可以这样:
spring: threads: virtual: enabled: trueHTTP 客户端连接池要调大,因为模型调用是长连接:
http: client: max-connections: 500 max-connections-per-route: 100Redis 连接池也别用默认值,AI 场景并发高:
spring: data: redis: lettuce: pool: max-active: 100 max-idle: 50这些参数不是拍脑袋定的,是根据压测结果调的。我的建议是先用默认值跑通,再用压测工具(JMeter 或 wrk)逐步加压,观察瓶颈在哪,针对性调。
7. 底座后续可以怎么扩展
QuickBlue 这类底座搭起来之后,扩展方向其实很多。我分享几个我实际做过或正在做的方向。
多模态能力接入。现在底座主要处理文本,但图片、音频、视频的 AI 能力需求越来越多。可以在模型网关里扩展多模态接口,知识库服务里加图片和音视频的解析能力。这块的难点在存储和检索,图片向量和文本向量的检索逻辑不太一样。
Agent 编排能力。单次模型调用解决不了复杂任务,需要 Agent 把多个工具、多次模型调用串起来。可以在底座里加一个编排服务,定义 Agent 的工作流。这块要小心,别做成又一个“低代码平台”,保持接口简单、可编程优先。
成本核算与配额。企业用 AI 最关心的除了效果就是成本。可以在底座里加 token 统计和成本核算,按部门、按项目、按用户维度出账单。这个能力一旦有了,业务部门用 AI 就会自觉很多。
私有化模型接入。有些企业对数据出域有硬要求,必须用私有化部署的模型。底座要能同时支持公有云模型和私有化模型,通过配置切换。这块的难点在私有化模型的性能和稳定性往往不如公有云,需要底座做更多的容错和降级。
评测与灰度。新模型上线前要评测,新 Prompt 上线前要灰度。底座可以集成评测框架,支持 A/B 测试。这个能力对持续优化 AI 效果很重要,但很多团队一开始不做,后面补起来很痛苦。
我个人在实际操作中的体会是:底座的价值不在于功能多,而在于边界清晰、接口稳定。每加一个能力,都要问自己“这是公共能力还是业务逻辑”,是公共能力才加,是业务逻辑就推给业务团队。守住这条线,底座才能长期健康地演进,而不是变成一个谁都不敢动的巨石。