尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

AI应用底座实战:基于Spring Cloud与JDK 21的微服务架构设计

AI应用底座实战:基于Spring Cloud与JDK 21的微服务架构设计 1. 从一次深夜救火说起为什么“AI 应用底座”突然成了刚需去年冬天一个做智能客服的朋友凌晨两点给我打电话说他们的 AI 问答服务又挂了。不是模型的问题而是模型前面那层“壳”出了问题——会话状态丢了、限流没生效、某个下游服务超时把整个链路拖垮。他们团队一共五个人既要调 Prompt又要维护网关、配置中心、熔断规则还要盯着日志排查问题。那天晚上我帮他重启服务的时候就在想这不就是三年前微服务刚普及时大家踩过的坑吗只不过这次上面叠了一层 AI。QuickBlue 就是在这个背景下进入我视野的。简单说它是一个面向 AI 应用场景的应用底座——你可以把它理解成一套已经搭好水电煤的毛坯房AI 能力是你要搬进去的家具而 QuickBlue 负责的是承重墙、管线、配电箱这些你不想每次重新搞的东西。它基于 Spring Cloud 生态构建跑在 JDK 21 上把微服务治理、配置管理、服务发现、限流熔断、可观测性这些能力打包成一个开箱即用的基座让做 AI 应用的团队不用从零搭一套分布式基础设施。这篇文章适合三类人看第一类是在做 AI 应用但被工程问题拖住的后端开发第二类是在选型阶段、想知道“AI 应用底座”到底解决什么问题的技术负责人第三类是对微服务架构有兴趣、想看看 AI 场景下微服务怎么落地的人。我会把 QuickBlue 这类底座的设计思路、核心能力、实操要点、踩坑经验都摊开讲尽量让你看完能判断自己的项目要不要上、怎么上。2. AI 应用底座到底解决什么问题拆解 QuickBlue 的核心定位2.1 先搞清楚AI 应用和普通应用的本质差异在哪很多人以为 AI 应用就是“普通后端 调个模型 API”这个认知会让你在工程上吃大亏。我总结下来AI 应用相比传统业务系统有三个本质差异这三个差异直接决定了为什么需要专门的底座。第一个差异是调用链路的非确定性。传统接口的响应时间基本可控一个查询 50ms 就是 50ms。但 AI 推理不一样同样的问题模型可能 800ms 返回也可能 8 秒才返回遇到长文本或者复杂推理甚至要几十秒。这种长尾延迟对网关超时配置、线程池管理、熔断阈值都是全新挑战。你按传统经验配的 3 秒超时在 AI 场景下会把大量正常请求误杀。第二个差异是状态管理的复杂性。多轮对话需要维护会话上下文RAG 场景需要管理向量检索的中间状态Agent 场景更是要跟踪多步工具调用的执行链路。这些状态如果散落在各个服务里一旦某个环节重启整个对话就断了。底座需要提供统一的会话存储和状态传递机制。第三个差异是资源成本的敏感性。模型推理是实打实烧钱的一次调用可能几分钱到几毛钱。如果没有精细的限流、缓存、降级策略一个爬虫或者一次流量突刺就能让你账单爆炸。底座层面的配额管理和成本控制在 AI 场景下不是可选项而是必选项。QuickBlue 的定位就是把这三点作为设计原点而不是像传统微服务框架那样先搭架子再想业务。2.2 QuickBlue 的能力边界它做什么不做什么我见过不少团队对“底座”有误解以为上了底座就万事大吉。这里必须说清楚 QuickBlue 这类 AI 应用底座的能力边界。它做的事情包括服务注册与发现让各个 AI 能力模块比如意图识别、知识检索、回复生成能互相找到统一配置管理把模型参数、Prompt 模板、限流阈值集中管理并支持热更新流量治理包括限流、熔断、降级、重试可观测性把分散的调用链路串起来让你能看到一次对话到底经过了哪些服务、各花了多少时间还有统一认证和租户隔离这在多客户场景下尤其重要。它不做的事情也很明确不训练模型、不管理模型权重、不替代向量数据库、不负责 Prompt 工程本身。QuickBlue 是“应用底座”不是“模型平台”它管的是模型外面那圈工程问题。这个边界想清楚了选型时就不会被各种概念绕晕。提示判断一个团队要不要上 AI 应用底座有个简单的标准——如果你的 AI 服务超过三个独立部署单元或者日调用量超过十万次或者有多个客户需要隔离那底座的投入产出比就很高了。反之一个单体应用加个模型 API 就能搞定的场景硬上底座是过度设计。2.3 为什么是 Spring Cloud 生态而不是另起炉灶QuickBlue 选择 Spring Cloud 作为技术基座这个决策背后有很实际的考量。Spring Cloud 经过这么多年发展服务发现Nacos、Eureka、配置中心Nacos Config、Apollo、网关Gateway、熔断Sentinel、Resilience4j这些组件已经非常成熟社区文档和踩坑记录极其丰富。对于大多数 Java 团队来说学习成本几乎为零。更重要的是Spring Cloud 的抽象层设计让你可以在不同实现之间切换。比如服务发现今天用 Nacos明天要换 Consul业务代码基本不用动。这种可替换性在长期演进中价值巨大。相比之下一些新兴的 AI 编排框架虽然概念先进但生态成熟度和人才储备都还在早期企业级落地风险更高。JDK 21 的选择也值得说一句。虚拟线程Virtual Threads在 JDK 21 正式转正这对 AI 应用是重大利好。AI 调用大量时间花在等待模型响应上传统平台线程在这种 IO 密集型场景下利用率很低。虚拟线程让每个请求可以用一个轻量线程处理不用再费劲搞响应式编程那套复杂模型代码可读性和维护性都上了一个台阶。QuickBlue 基于 JDK 21 构建等于把这个红利直接吃进来了。3. 核心能力逐项拆解QuickBlue 的关键模块与实操要点3.1 服务注册与发现AI 能力模块怎么互相找到在 AI 应用里服务拆分通常比传统业务更细。一个典型的智能问答系统可能拆成接入网关、会话管理、意图识别、知识检索、向量化服务、模型调用代理、后处理服务。这些模块需要互相调用服务发现就是解决“我怎么知道检索服务现在有几个实例、地址是什么”的问题。QuickBlue 默认集成 Nacos 作为注册中心。实操上每个 AI 能力模块启动时向 Nacos 注册自己的地址和元数据调用方通过服务名而不是 IP 来发起请求。这里有个 AI 场景特有的细节模型调用代理服务通常需要注册额外的元数据比如它背后挂的是哪个模型、支持的最大上下文长度、当前并发容量。这样上游在做路由时可以根据这些元数据做智能选择而不是简单轮询。配置上服务注册的关键参数我建议这样设置心跳间隔不要用默认的 5 秒AI 服务启动时加载模型或建立连接池可能耗时较长心跳间隔设成 10 到 15 秒更稳妥避免服务还没就绪就被判定为健康。健康检查路径要单独设计不要用业务接口而是用一个轻量的/health端点只检查关键依赖数据库、模型连接是否可用。spring: cloud: nacos: discovery: server-addr: ${NACOS_ADDR:127.0.0.1:8848} heart-beat-interval: 15000 heart-beat-timeout: 30000 ip-delete-timeout: 60000 metadata: model-name: qwen-plus max-context: 8192 capacity: 50注意AI 服务的实例下线不能简单粗暴地直接停进程。正在处理的推理请求可能还要几十秒才完成直接下线会导致大量请求失败。正确做法是先调用 Nacos 的下线接口把实例标记为不健康等待一段时间建议 30 秒以上让上游刷新实例列表再停止服务。这个优雅下线流程在 QuickBlue 里可以通过扩展ApplicationListener来实现。3.2 配置中心Prompt 和模型参数的热更新怎么做AI 应用有个传统应用没有的痛点Prompt 和模型参数需要频繁调整。今天发现回复太啰嗦改一下 Prompt明天发现某个场景温度值太高调一下 temperature。如果每次都要改代码重新部署迭代效率会低到无法接受。QuickBlue 用 Nacos Config 做配置中心把 Prompt 模板、模型参数、限流阈值都放在配置里。关键是要设计好配置的命名空间和分组。我的经验是按“环境 租户 场景”三级来组织环境用 Nacos 的 namespace 隔离租户用 group 隔离具体场景用 dataId 区分。这样多租户场景下改 A 客户的 Prompt 不会影响 B 客户。配置热更新的实现要注意两点。第一RefreshScope注解要加在真正需要动态刷新的 Bean 上不要图省事加在启动类上那会导致整个上下文重建AI 服务重建一次可能要几十秒。第二Prompt 模板的更新要有版本记录和回滚机制Nacos 自带历史版本功能但建议在应用层再记一份变更日志方便出问题时快速定位是哪次改动导致的。RefreshScope Component public class PromptTemplateManager { Value(${ai.prompt.system:你是一个有用的助手}) private String systemPrompt; Value(${ai.model.temperature:0.7}) private double temperature; public String buildPrompt(String userInput) { return systemPrompt \n用户: userInput; } }实测下来Nacos Config 的推送延迟在局域网内通常 1 秒以内跨机房大概 3 到 5 秒。对于 Prompt 调整这种场景完全够用。但如果你要做 A/B 测试级别的实时切换可能需要考虑在应用层加一层本地缓存加定时拉取的兜底策略。3.3 流量治理AI 场景下的限流熔断和传统有什么不同这是 QuickBlue 最核心也最容易踩坑的部分。传统微服务的限流熔断策略直接搬到 AI 场景基本都会出问题。先说限流。传统接口按 QPS 限流很合理但 AI 接口的“一次请求”成本差异巨大。同样是一次问答简单问题可能消耗 500 token复杂问题可能消耗 8000 token。如果只按 QPS 限流一个用户狂发复杂问题就能把配额吃光。所以 AI 场景的限流要多维度的QPS 限流、并发数限流、Token 消耗限流三者结合。QuickBlue 集成 Sentinel 后可以通过自定义 Slot 来实现 Token 维度的统计和限流。再说熔断。传统熔断看的是错误率和响应时间但 AI 场景下“慢”不等于“坏”。模型偶尔慢一点是正常的如果按传统策略响应时间超过阈值就熔断会导致大量正常请求被误熔断。我的做法是把熔断阈值调得更宽松同时引入慢调用比例而不是绝对时间作为判断依据。比如 30 秒内慢调用超过 10 秒比例超过 60% 才触发熔断而不是单次超过 3 秒就熔断。治理维度传统微服务策略AI 应用底座策略原因限流依据QPS 为主QPS 并发 Token 消耗单次请求成本差异大熔断阈值错误率 响应时间错误率 慢调用比例慢不等于坏重试策略立即重试 2-3 次谨慎重试仅对幂等操作推理成本高重试代价大降级方案返回缓存或默认值返回简化模型结果或引导话术用户体验连续性提示AI 场景下的重试要特别小心。模型调用通常不是幂等的同样的输入可能产生不同输出而且重试意味着双倍成本。我的建议是只对“连接超时”这类明确未到达模型的错误做重试对“推理超时”不要重试直接走降级。3.4 可观测性怎么看清一次 AI 对话到底发生了什么AI 应用的排查难度比传统应用高一个数量级。用户说“回答不对”你需要知道请求经过了哪些服务、检索到了哪些文档、Prompt 最终长什么样、模型返回的原始内容是什么、后处理做了什么修改。这些信息如果分散在各个服务的日志里排查一次问题可能要半小时。QuickBlue 的可观测性方案是Trace Metrics Logging三位一体。Trace 用 Spring Cloud Sleuth 或 Micrometer Tracing 把调用链路串起来每个 AI 处理环节作为一个 Span。Metrics 通过 Micrometer 采集关键指标各服务调用耗时、Token 消耗量、限流触发次数、熔断器状态。Logging 则要结构化把 traceId、sessionId、模型名称、token 数这些关键字段都打到日志里。实操上有个细节很重要Prompt 和模型返回内容的日志记录要脱敏且可开关。默认情况下不要记录完整 Prompt 和返回内容因为可能包含用户隐私。但在排查问题时可以通过动态配置打开特定会话的详细日志。这个开关放在配置中心里排查完及时关掉。Around(annotation(aiTrace)) public Object traceAiCall(ProceedingJoinPoint pjp) throws Throwable { Span span tracer.nextSpan().name(ai.inference).start(); try (Tracer.SpanInScope ws tracer.withSpan(span)) { span.tag(model, currentModel); long start System.currentTimeMillis(); Object result pjp.proceed(); span.tag(duration.ms, String.valueOf(System.currentTimeMillis() - start)); return result; } catch (Exception e) { span.tag(error, e.getMessage()); throw e; } finally { span.end(); } }4. 从零搭建一个基于 QuickBlue 的 AI 问答服务完整实操记录4.1 环境准备与项目初始化我拿一个真实的智能问答场景来演示。目标搭建一个支持多轮对话、带知识库检索、有租户隔离的问答服务。技术栈就是 QuickBlue 默认的那套JDK 21、Spring Boot 3.x、Spring Cloud 2023.x、Nacos、Sentinel、Gateway。第一步是环境准备。JDK 21 的安装没什么好说的注意JAVA_HOME配好就行。Nacos 建议用 2.3 以上版本单机模式启动命令是sh startup.sh -m standalone。Sentinel Dashboard 用 1.8.7 以上启动后默认端口 8080。这些中间件建议用 Docker Compose 统一管理省得环境混乱。项目结构我建议这样组织一个父 POM 管理依赖版本下面分模块——quickblue-gateway网关、quickblue-session会话管理、quickblue-retrieval知识检索、quickblue-inference模型调用、quickblue-common公共依赖。每个模块独立打包独立部署通过 Nacos 互相发现。父 POM 里关键的是 Spring Cloud 和 Spring Cloud Alibaba 的版本对齐。这里有个坑Spring Cloud Alibaba 的版本更新节奏和 Spring Cloud 不完全同步选版本时要去官方 Wiki 查兼容矩阵。我当前用的是 Spring Cloud 2023.0.x 配 Spring Cloud Alibaba 2023.0.1.0实测稳定。dependencyManagement dependencies dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-dependencies/artifactId version2023.0.1/version typepom/type scopeimport/scope /dependency dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-alibaba-dependencies/artifactId version2023.0.1.0/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagement4.2 网关层统一入口和租户识别网关是整个系统的入口承担路由转发、认证鉴权、租户识别、全局限流四个职责。QuickBlue 用 Spring Cloud Gateway 做网关配置上要特别注意路由规则的设计。路由规则我按“路径前缀 租户标识”来设计。比如/api/{tenantId}/chat/**路由到会话服务/api/{tenantId}/knowledge/**路由到检索服务。租户标识从请求头或 JWT 里解析解析后放到请求头里传给下游。这样下游服务不用重复解析直接从请求头拿租户 ID。全局限流在网关层做第一道拦截用 Sentinel 的 Gateway Adapter。这里配置的是粗粒度限流比如每个租户每秒最多 100 次请求。细粒度的 Token 限流放在推理服务里做因为只有那里才知道实际消耗了多少 Token。spring: cloud: gateway: routes: - id: session-service uri: lb://quickblue-session predicates: - Path/api/*/chat/** filters: - StripPrefix1 - name: RequestRateLimiter args: redis-rate-limiter.replenishRate: 100 redis-rate-limiter.burstCapacity: 200注意网关层的超时配置要特别小心。默认的 30 秒超时对 AI 场景可能不够但设太长又会占用连接资源。我的经验是网关超时设成 60 秒同时开启响应式超时spring.cloud.gateway.httpclient.response-timeout让慢请求在网关层就被截断不要拖到下游。4.3 会话服务多轮对话的状态管理会话服务的核心是维护对话上下文。每次用户发消息会话服务要取出历史对话、拼接到当前请求、调用推理服务、拿到回复后更新历史。这个流程看似简单但有几个关键决策点。第一个决策会话状态存哪里。内存最快但重启就丢数据库持久但每次读写有延迟Redis 是折中方案。我的选择是 Redis 存热数据最近 20 轮对话MySQL 存冷数据完整历史用于审计和分析。Redis 的 key 设计成session:{tenantId}:{sessionId}value 用 List 结构存消息每条消息包含角色、内容、时间戳、token 数。第二个决策上下文窗口怎么截断。模型有最大上下文限制历史对话不能无限拼接。我的策略是“保留最近 N 轮 系统 Prompt 检索结果”N 根据模型窗口动态计算。比如模型窗口 8192 token系统 Prompt 占 500检索结果预留 2000那历史对话最多用 5000 token按平均每轮 200 token 算保留最近 25 轮。超出部分做摘要压缩把早期对话总结成一段话放在最前面。public ListMessage buildContext(String sessionId, String userInput) { ListMessage history redisTemplate.opsForList() .range(session: sessionId, -MAX_ROUNDS, -1); ListMessage context new ArrayList(); context.add(systemPrompt); if (history.size() SUMMARY_THRESHOLD) { context.add(buildSummary(history.subList(0, history.size() - RECENT_ROUNDS))); context.addAll(history.subList(history.size() - RECENT_ROUNDS, history.size())); } else { context.addAll(history); } context.add(new Message(user, userInput)); return context; }4.4 检索服务RAG 场景下的向量检索集成知识检索是 RAG 应用的核心。QuickBlue 本身不提供向量数据库但提供了标准的集成方式。我的做法是把检索服务做成一个独立的微服务对外暴露统一的检索接口内部可以对接不同的向量库Milvus、Qdrant、PgVector 都行。检索服务的接口设计要考虑几个参数查询文本、租户 ID、知识库 ID、返回条数、相似度阈值。租户 ID 用于数据隔离每个租户的知识库在向量库里用不同的 collection 或 partition 存储。相似度阈值很关键设太低会召回无关内容干扰模型设太高又可能召回不足。我的经验值是 0.75 起步根据实际效果微调。检索服务的性能优化有两个方向。一是批量检索如果一次请求需要查多个知识库合并成一次向量查询。二是缓存相同或相似的查询结果缓存起来用查询文本的向量做 key相似度超过 0.95 视为命中缓存。这个缓存在客服场景下命中率能到 30% 以上显著降低向量库压力。4.5 推理服务模型调用的统一代理推理服务是所有模型调用的统一入口。它的职责包括选择模型、组装 Prompt、调用模型 API、处理流式响应、统计 Token 消耗、执行降级策略。模型选择逻辑我设计成可配置的规则引擎。规则包括租户级别指定模型、场景级别指定模型、根据输入长度自动选择短文本用小模型长文本用大模型、根据当前负载选择某模型过载时切到备用模型。这些规则放在 Nacos 配置里支持热更新。流式响应是 AI 应用的标配但流式场景下的错误处理比较麻烦。如果流已经开始返回中途模型出错不能简单返回错误码因为 HTTP 状态码已经发出去了。我的做法是在流式响应的协议里加一个特殊的结束标记正常结束和异常结束用不同的标记前端根据标记判断是否完整。public FluxString streamInference(InferenceRequest request) { return modelClient.stream(request) .doOnNext(chunk - tokenCounter.add(request.getTenantId(), chunk.getTokenCount())) .onErrorResume(e - { log.error(Stream inference failed, e); return Flux.just([ERROR]生成中断请重试); }) .concatWith(Flux.just([DONE])); }提示Token 统计一定要在推理服务里做不要依赖模型 API 返回的 usage 字段。有些模型 API 在流式模式下不返回 usage或者返回的数值有延迟。自己用 tokenizer 统计虽然有一点误差但实时性和可控性更好。误差在 5% 以内对限流和计费来说完全可以接受。5. 踩坑实录那些文档里不会写的经验5.1 虚拟线程和 ThreadLocal 的冲突JDK 21 的虚拟线程很好用但有个坑我踩了整整一天。传统微服务里用 ThreadLocal 传递上下文比如租户 ID、traceId很常见但虚拟线程场景下 ThreadLocal 的行为和平台线程不完全一样。具体来说虚拟线程在阻塞时会从载体线程上卸载如果 ThreadLocal 里存了大对象会导致内存泄漏。解决方案是改用ScopedValueJDK 21 预览特性或者用 Micrometer Context Propagation 库来传递上下文。如果暂时不想用预览特性至少要把 ThreadLocal 里的对象控制得尽量小并且在 finally 块里显式 remove。// 不推荐ThreadLocal 存大对象 private static final ThreadLocalConversationContext CONTEXT new ThreadLocal(); // 推荐用请求作用域的 Bean 或 ScopedValue ScopedValue.where(TENANT_ID, tenantId).run(() - { // 业务逻辑 });5.2 Nacos 配置推送在容器环境下的延迟问题在 Kubernetes 环境里Nacos 配置推送偶尔会出现几十秒的延迟。排查后发现是容器网络的问题——Nacos 的长连接在容器网络里可能被中断重连需要时间。解决方案是在客户端配置里加上重连参数并且开启配置的本地缓存快照。这样即使推送延迟服务重启时也能从本地快照加载配置不会因为连不上 Nacos 而启动失败。spring: cloud: nacos: config: server-addr: ${NACOS_ADDR} config-long-poll-timeout: 30000 config-retry-time: 3000 max-retry: 10 enable-remote-sync-config: true5.3 Sentinel 规则持久化到 Nacos 的正确姿势Sentinel 默认的规则是存在内存里的重启就丢。生产环境必须持久化。官方支持推模式和拉模式我推荐推模式——规则存在 Nacos 配置中心Sentinel Dashboard 修改后推送到 Nacos客户端监听 Nacos 变更实时更新。配置的关键是sentinel.datasource的配置要指定 Nacos 的地址、dataId、groupId 和规则类型。这里有个容易忽略的点规则转换器要选对。流控规则用FlowRuleParser熔断规则用DegradeRuleParser不要搞混。另外 Nacos 里的规则内容格式是 JSONDashboard 推送时会自动转换手动配置时要注意格式。问题现象可能原因排查方向解决方案规则重启后丢失未持久化检查 datasource 配置配置 Nacos 推模式持久化规则推送不生效dataId 不匹配对比客户端和 Dashboard 的 dataId统一命名规范熔断不触发规则类型错误检查 parser 类型使用正确的 RuleParser限流误触发阈值设置过低查看实际 QPS 和阈值根据压测结果调整5.4 多租户场景下的数据隔离陷阱多租户隔离最容易出问题的地方不是数据库而是缓存和向量库。数据库层面加tenant_id字段大家都会但 Redis 的 key 如果忘了加租户前缀A 租户可能读到 B 租户的会话。向量库如果所有租户共用一个 collection检索时忘了加租户过滤条件就会召回其他租户的知识。我的做法是在框架层面强制隔离。Redis 的 key 生成统一走一个工具类工具类强制要求传入租户 ID。向量库的查询封装成统一方法方法签名里租户 ID 是必填参数。这样从代码层面杜绝遗漏的可能。另外在测试阶段专门写一个“跨租户访问测试”用 A 租户的凭证去访问 B 租户的数据验证是否被正确拦截。6. 选型对比QuickBlue 和几种常见方案的取舍6.1 和“单体应用 模型 API”的对比小团队最容易纠结的就是要不要上微服务底座。我的观点很明确日调用量低于一万次、团队少于三人、没有多租户需求的场景单体应用加模型 API 就够了。这个阶段上 QuickBlue 这类底座运维成本可能比收益还高。但一旦跨过某个临界点——比如开始出现“改一个 Prompt 要重新部署整个应用”的困扰或者“某个下游服务挂了导致整个系统不可用”的事故那就是上底座的信号。底座的本质是用运维复杂度换开发效率和系统稳定性这个交换在规模到达一定程度后是划算的。6.2 和纯 Serverless 方案的对比Serverless 方案比如函数计算 API 网关在弹性伸缩上有天然优势按调用付费的模式对波动大的场景很友好。但 AI 应用有个特点冷启动代价极高。模型加载、连接池建立、向量索引预热这些操作在 Serverless 的冷启动场景下可能耗时几十秒用户体验无法接受。QuickBlue 这类常驻服务方案虽然需要自己管理容量但胜在稳定可控。我的建议是混合使用核心推理链路用常驻服务保证稳定性边缘的、低频的功能比如数据导出、报表生成可以用 Serverless 降成本。6.3 和 AI 编排框架的对比市面上有一些专门面向 AI 的编排框架主打可视化编排、多模型路由、Agent 工作流。这些框架在 AI 特有概念上确实更友好但在企业级能力上往往欠缺没有完善的服务治理、没有成熟的配置中心、可观测性也偏弱。QuickBlue 的思路是“用成熟的微服务底座承载 AI 能力”而不是“为 AI 重新发明一套基础设施”。这个思路的优势是稳定性和生态劣势是 AI 特有的抽象比如 Prompt 版本管理、模型路由策略需要自己在上层封装。我的选择是底座用 QuickBlue上层自己封装一层 AI 编排层两者结合。7. 一些实操后的个人体会这套东西我在两个项目里落地过一个是对内的知识助手一个是对外的智能客服。最大的体会是AI 应用底座的价值不在于技术多先进而在于把不确定性关进笼子里。模型本身是不确定的但工程层面可以做到确定——确定的超时、确定的降级、确定的隔离、确定的成本上限。这些“确定”才是企业敢把 AI 应用上生产的前提。另一个体会是关于演进节奏。不要一上来就把所有微服务组件都堆上去先上服务发现和配置中心跑稳了再加限流熔断最后补可观测性。每加一个组件都要有明确的痛点驱动而不是“别人有我也要有”。我见过太多团队被自己搭的复杂架构拖垮最后回退到单体。最后分享一个配置管理的小技巧把所有 AI 相关的配置Prompt、模型参数、限流阈值、降级话术集中在一个 Nacos 命名空间里用统一的命名规范管理。这样排查问题时不用到处找配置改配置时也不会漏掉某个服务。命名规范我推荐ai.{模块}.{功能}.{参数}的格式比如ai.inference.model.temperature、ai.retrieval.topk一眼就能看出配置的归属和作用。
返回列表