
1. 从一次深夜救火说起为什么“AI 应用底座”突然成了刚需去年冬天一个做智能客服的朋友凌晨两点给我打电话说他们的 AI 问答服务又挂了。不是模型的问题而是模型前面那层业务系统扛不住了——会话状态丢失、限流规则失效、多个服务之间的调用链断得七零八落。他们团队之前把精力全砸在模型调优上觉得“AI 应用”嘛核心就是模型结果上线三个月真正拖后腿的全是那些看起来不起眼的基础设施。这个场景我后来在好几个团队都遇到过。大家一窝蜂地接大模型、做 RAG、搞 Agent但很少有人认真想过一个问题AI 能力要真正变成企业里稳定运行的应用中间那层“底座”到底该长什么样QuickBlue 就是在这个背景下进入我视野的一个东西。它本质上是一个AI 应用底座说白了就是给 AI 应用提供一套标准化的运行环境、服务治理能力和工程化支撑让开发者不用每次都从零去搭微服务、配网关、接限流、管配置。你可能会问这不就是传统的微服务框架干的事吗对也不对。传统微服务解决的是“服务怎么拆、怎么调、怎么管”的问题而 AI 应用底座要额外解决的是“模型调用怎么稳定、会话上下文怎么保持、推理请求怎么排队、多模型怎么路由”这些 AI 特有的问题。QuickBlue 的思路是把这两层揉在一起用JDK 21和Spring Cloud这套成熟的技术栈做地基在上面叠一层面向 AI 场景的抽象。这篇文章适合谁看如果你正在负责企业级 AI 应用的落地或者你是一个后端工程师被拉来做 AI 项目又或者你单纯好奇“AI 应用底座”这个词到底指什么那接下来的内容应该能帮你把这件事想清楚。我会从设计思路、核心技术点、实操落地到踩坑经验一层层拆开讲。2. QuickBlue 到底解决了什么问题AI 应用落地的四道坎2.1 第一道坎模型调用不是普通的 HTTP 请求很多人第一次做 AI 应用会觉得调模型就跟调一个普通接口一样发个请求等结果就行了。实际跑起来才发现完全不是这么回事。模型推理的延迟波动极大同一个 prompt 可能 800 毫秒返回也可能 8 秒才返回并发一上来后端推理服务直接排队排到超时更麻烦的是很多模型服务是按 token 计费的你没法像普通接口那样随便重试。QuickBlue 在这块的处理思路是把模型调用抽象成一种受治理的资源。它不是在业务代码里直接写 HTTP 调用而是通过统一的模型网关层来管理。这一层会做几件事——请求排队与优先级调度、超时与重试策略的精细化控制、token 消耗的实时统计、多模型之间的路由与降级。我实测下来光是“把模型调用从业务代码里抽出来”这一个动作就能让后续的运维排查轻松一大截。注意模型调用的重试策略和普通接口完全不同。普通接口重试通常是无害的但模型调用重试可能带来重复计费和重复推理。QuickBlue 默认对推理请求关闭自动重试只对连接层失败做有限重试这个设计我认为是对的。2.2 第二道坎会话状态和上下文管理AI 应用和传统 Web 应用最大的区别之一就是它高度依赖上下文。一个多轮对话的客服机器人你得记住用户前面说了什么一个 Agent 任务你得维护它的执行状态和中间结果。传统微服务里状态通常放在 Redis 或者数据库里但 AI 场景下的上下文有它的特殊性——数据量大、生命周期短、访问频率高、结构灵活。QuickBlue 在这块的方案是提供一个会话上下文服务把上下文的存储、过期、压缩、检索都封装起来。它底层可以用 Redis 集群做热存储用对象存储做冷归档对上层业务暴露统一的 API。我比较欣赏的一点是它对上下文做了分级——最近几轮对话走内存缓存稍早的走 Redis更早的做摘要压缩后存储。这个分级策略在实际场景里非常实用因为大部分对话的有效上下文其实就集中在最近几轮。2.3 第三道坎服务治理在 AI 场景下的变形Spring Cloud 这套东西大家都很熟服务注册发现、配置中心、熔断限流、链路追踪该有的都有。但 AI 应用对服务治理提出了一些新要求。比如限流传统接口按 QPS 限就够了但 AI 接口你得按 token 数限、按并发推理数限、按用户等级限。再比如熔断模型服务挂了之后你是直接返回错误还是降级到一个更小的模型还是走缓存结果这些策略都需要在底座层面支持。QuickBlue 基于 Spring Cloud 做了不少针对 AI 场景的扩展。它把 Sentinel 的限流规则做了增强支持按 token 消耗量做流控在服务路由上支持根据请求的模型类型、用户等级、当前负载做动态路由。这些能力如果让每个业务团队自己实现工作量不小而且很容易做得不一致。2.4 第四道坎工程化与可观测性AI 应用的调试和排障比传统应用难得多。一个请求经过了多少个服务、在每个服务里花了多少时间、模型推理占了多大比例、上下文检索命中了哪些数据这些信息如果散落在各个日志里排查起来就是噩梦。QuickBlue 在可观测性上做了统一埋点把一次 AI 请求的完整链路串起来包括模型调用的输入输出摘要、token 消耗、各阶段耗时。这个能力在出问题的时候能救命。3. 技术选型背后的逻辑为什么是 JDK 21 加 Spring Cloud3.1 JDK 21 带来的实际收益QuickBlue 选择 JDK 21 作为基础运行时这个决定我觉得挺有讲究。JDK 21 是 LTS 版本虚拟线程Virtual Threads正式转正这对 AI 应用来说是个大利好。AI 应用的典型特征是大量 IO 等待——等模型返回、等向量检索、等上下文读取。传统线程模型下每个请求占一个线程并发一高线程池就爆了。虚拟线程让每个请求可以低成本地阻塞等待吞吐量提升非常明显。我做过一个简单的对比测试在一个模拟模型调用的场景下同样的硬件配置JDK 21 虚拟线程模式比 JDK 17 传统线程池模式的吞吐量高了将近三倍。当然这个数字会随场景变化但方向是明确的。另外 JDK 21 在 ZGC 上的改进也让大内存场景下的 GC 停顿更可控这对需要缓存大量上下文和向量的 AI 应用很重要。3.2 Spring Cloud 生态的取舍Spring Cloud 是个庞大的生态QuickBlue 并没有全盘照搬而是做了取舍。服务注册发现用的是 Nacos配置中心也是 Nacos网关用的是 Spring Cloud Gateway熔断限流用的是 Sentinel。这套组合在国内的落地案例最多社区资料也最丰富。这里有个背景值得提一下——Spring Cloud Alibaba 前几年有过一段停更期导致很多团队对这套技术栈的可持续性产生过疑虑。QuickBlue 的做法是把核心依赖锁定在稳定版本同时对关键组件做了自研增强和封装降低对上游更新节奏的依赖。这个策略我认为是务实的企业级底座最怕的就是上游一变动自己就跟着抖。3.3 微服务拆分粒度的考量AI 应用底座本身也是个微服务系统拆多细合适QuickBlue 的拆分粒度大致是模型网关一个服务、会话上下文一个服务、配置与治理一个服务、可观测性一个服务、业务编排一个服务。这个粒度不算细但我觉得对底座类系统来说是对的。底座追求的是稳定和低耦合拆得太细反而增加运维复杂度和调用链长度。实操心得底座类系统的微服务拆分我建议按“变更频率”来拆而不是按“功能模块”来拆。变更频率相近的放一起变更频率差异大的分开。这样每次发版的影响面可控不会因为改一个小功能导致整个底座重启。4. 核心模块拆解与实操要点4.1 模型网关层统一入口与智能路由模型网关是 QuickBlue 最核心的模块之一。所有对模型的调用都经过这一层它负责协议适配、请求排队、路由决策、限流熔断、用量统计。协议适配这块不同模型服务的接口格式不一样有的走 OpenAI 兼容格式有的走自定义格式网关层做统一转换上层业务只需要按一种格式调用。路由决策是这里面最有意思的部分。QuickBlue 支持基于规则的路由比如“VIP 用户的请求走高性能模型普通用户走经济模型”也支持基于负载的动态路由比如“当前 A 模型集群负载超过 80%自动切到 B 集群”。配置方式是在 Nacos 里写路由规则支持热更新不用重启服务。# 路由规则示例Nacos 配置 ai: gateway: routes: - id: vip-route predicate: user.level VIP target: model-cluster-high-performance - id: fallback-route predicate: cluster.load 0.8 target: model-cluster-economy请求排队这块QuickBlue 用的是基于优先级的队列。高优先级请求可以插队低优先级请求在队列满时会被拒绝而不是无限等待。这个设计避免了慢请求拖垮整个系统。4.2 会话上下文服务分级存储与智能压缩上下文服务的设计我前面提过分级存储的思路这里展开讲一下具体实现。最近 N 轮对话默认 5 轮放在本地内存缓存读写延迟在微秒级N 到 M 轮默认 5 到 20 轮放在 Redis 集群读写延迟在毫秒级超过 M 轮的做摘要压缩后存到对象存储需要时异步加载。摘要压缩这块QuickBlue 提供了一个可插拔的压缩策略接口。默认策略是用一个小模型对历史对话做摘要保留关键信息。你也可以换成基于规则的压缩比如只保留用户明确提到的实体和意图。这个设计的好处是上下文长度可控不会因为对话轮次多了就把 token 撑爆。// 上下文压缩策略接口示例 public interface ContextCompressionStrategy { CompressedContext compress(ListDialogueTurn turns); ListDialogueTurn decompress(CompressedContext context); }4.3 治理与配置中心Sentinel 的 AI 化增强Sentinel 本身是个很成熟的限流熔断组件但它的默认规则是面向 QPS 和线程数的。QuickBlue 在 Sentinel 之上做了一层封装增加了 token 维度的流控。具体来说它会在模型网关层统计每个请求的 token 消耗然后把这个数据喂给 Sentinel 做规则判断。配置中心用的是 Nacos所有治理规则、路由规则、模型配置都放在 Nacos 里。这里有个细节值得注意——QuickBlue 对配置做了版本管理和灰度发布。你可以先把新规则推给 10% 的实例观察一段时间没问题再全量。这个能力在生产环境里非常有用避免了改错一个配置导致全站故障。4.4 可观测性把一次 AI 请求的完整链路串起来可观测性模块是 QuickBlue 里我觉得最实用的部分。它基于 OpenTelemetry 做埋点把一次 AI 请求经过的所有服务、每个阶段的耗时、模型调用的输入输出摘要、token 消耗、上下文命中情况都记录下来。这些数据可以在 Grafana 里看也可以对接企业已有的监控系统。我特别喜欢它的“请求回放”功能。出问题的时候你可以根据 trace ID 把一次请求的完整过程回放出来看到底是哪一步慢了、哪一步错了。这个功能在排查偶发问题时特别管用因为 AI 应用的问题往往不是必现的。5. 从零搭建一个 QuickBlue 环境的完整流程5.1 环境准备与依赖检查搭建 QuickBlue 环境之前先把基础依赖确认一遍。JDK 21 是必须的建议用 Eclipse Temurin 或者 Oracle 的官方版本。Nacos 建议用 2.x 版本单机模式够开发用生产环境至少三节点集群。Redis 建议 7.x如果要用到向量检索能力可以考虑 Redis Stack。# 检查 JDK 版本 java -version # 应该输出类似openjdk version 21.0.x # 启动 Nacos单机模式 sh startup.sh -m standalone # 启动 Redis redis-server /path/to/redis.conf内存方面开发环境建议至少 16GB因为要同时跑 Nacos、Redis、网关、上下文服务、治理服务好几个进程。生产环境按实际流量估算模型网关层是资源消耗大户建议单独部署。5.2 核心服务启动顺序与配置要点QuickBlue 的各个服务有启动依赖关系顺序搞错了会报错。正确的顺序是先起 Nacos 和 Redis再起治理与配置服务然后起模型网关和上下文服务最后起业务编排服务。每个服务的配置都从 Nacos 拉取所以 Nacos 必须先就绪。# 模型网关核心配置示例 server: port: 8080 spring: cloud: nacos: discovery: server-addr: 127.0.0.1:8848 config: server-addr: 127.0.0.1:8848 ai: gateway: model-clusters: - name: model-cluster-high-performance endpoint: http://model-a:9000 max-concurrency: 50 - name: model-cluster-economy endpoint: http://model-b:9000 max-concurrency: 100配置里有个参数max-concurrency需要根据实际模型服务的承载能力来设。设大了会把模型服务打挂设小了浪费资源。我的经验是先从保守值开始观察模型服务的 CPU 和显存使用率逐步往上调。5.3 验证底座是否正常工作的检查清单环境搭好之后别急着接业务先做一轮基础验证。我整理了一个检查清单按顺序过一遍基本能确认底座是健康的。检查项验证方法预期结果服务注册访问 Nacos 控制台服务列表所有 QuickBlue 服务都在列配置拉取查看各服务启动日志无配置拉取失败报错模型网关连通调用网关健康检查接口返回所有模型集群状态上下文读写调用上下文服务测试接口写入后能正确读出限流生效压测工具打满 QPS超出阈值后返回限流错误链路追踪发起一次请求后查 trace完整链路可见这套检查做完底座基本就算跑起来了。接下来就是接业务、调参数、观察运行状态。6. 实际落地中踩过的坑与排查技巧6.1 模型网关超时设置的那些坑超时设置看起来简单实际很容易踩坑。我遇到过好几次因为超时设置不合理导致的问题。有一次是把网关的读超时设成了 5 秒结果有些复杂推理请求需要 8 秒才返回全被网关掐断了。后来改成 30 秒又出现了慢请求堆积把连接池占满的问题。最后的方案是分层设置超时连接超时 2 秒读超时按模型类型区分轻量模型 10 秒重量模型 60 秒同时在网关层做并发隔离不同模型集群用不同的连接池。这样既不会误杀正常请求也不会让慢请求拖垮整个网关。注意超时时间不是越长越好。超时设长了故障时请求堆积更严重设短了正常请求被误杀。关键是配合并发隔离和队列控制一起用。6.2 上下文丢失问题的排查思路上下文丢失是 AI 应用里比较常见的问题表现是用户明明前面说过了机器人却像失忆一样。排查这类问题我一般按这个顺序走先确认上下文有没有写进去再确认有没有读出来最后确认读出来的内容对不对。写不进去的原因通常是 Redis 连接问题或者序列化失败。读不出来的原因可能是 key 过期了、被 LRU 淘汰了、或者读的是错误的 key。读出来内容不对的原因可能是压缩策略有问题把关键信息压没了。QuickBlue 的上下文服务有详细的日志每个操作都有记录顺着日志查一般都能定位到。6.3 限流规则配置不当引发的雪崩限流规则配错了比不配还危险。我见过一个案例限流阈值设得极低正常流量都被限了然后客户端疯狂重试反而把系统打得更惨。还有一个案例是限流规则只配了总入口没配下游服务结果入口限住了下游还是被内部调用打挂。QuickBlue 的限流支持多层级配置入口一层、网关一层、每个下游服务一层。我的建议是每层都配而且阈值要有梯度入口最宽越往下越窄。另外一定要配 fallback 逻辑被限流之后返回什么、怎么提示用户这些都要提前想好。6.4 常见问题速查表现象可能原因排查方向解决思路请求全部超时模型服务挂了或网络不通检查模型服务健康状态确认模型服务检查网络策略部分请求失败限流触发或队列满查看限流日志和队列深度调整阈值或扩容上下文丢失Redis 过期或 key 错误查上下文服务日志调整过期时间检查 key 生成逻辑响应变慢模型负载高或 GC 停顿看模型服务指标和 JVM 监控扩容模型服务调 GC 参数配置不生效Nacos 推送失败或缓存查 Nacos 推送日志重启服务或手动刷新配置7. 我对 AI 应用底座这件事的一些个人看法做了一段时间的 AI 应用落地我越来越觉得“底座”这个东西的价值被低估了。大家的目光都在模型上觉得模型强则应用强但实际决定一个 AI 应用能不能稳定跑起来的往往是底座这一层。模型可以换底座换起来就伤筋动骨了。QuickBlue 这套东西给我的启发是AI 应用底座的核心不是堆功能而是把 AI 场景下的那些“特殊需求”用工程化的方式固化下来。模型调用要治理、上下文要管理、限流要按 token 算、链路要能追踪这些需求每个做 AI 应用的团队都会遇到与其各自造轮子不如有一个统一的底座来承载。当然底座也不是越厚越好。我见过一些团队把底座做得极其复杂结果业务团队用不起来最后还是绕过底座自己干。底座的边界应该是把通用的、稳定的、与业务无关的能力收进来把变化的、个性化的留给业务层。这个边界怎么划每个团队要根据自己的情况来定。最后分享一个小技巧如果你刚开始做 AI 应用底座别一上来就追求大而全。先把模型网关和上下文服务这两个最核心的模块做扎实让业务能跑起来然后再逐步补治理、可观测性这些能力。底座是长出来的不是设计出来的。