做了大半年Spring AI,从Demo原型到日调用十万级的生产服务,踩过的坑能绕工位三圈。
最开始做原型的时候,跑通问答觉得挺简单,真上线才发现到处漏风:集群部署会话丢了、知识库更新要全量重建、接口被刷爆没钱付API、检索准确率低到客户骂…
把这些坑都填完之后,整理出五个必须做的企业级改造点,全是可直接复用的代码,给准备上生产的朋友参考。
1. 分布式场景下:会话记忆改用Redis持久化
Spring AI默认用的InMemoryChatMemory,本地开发没问题,一上集群就凉:用户下一个请求打到另一台机器,之前的对话全没了,多轮问答直接答非所问。
改成Redis存储,支持分布式,还能自动过期,非常稳:
第一步:引入依赖
第二步:实现RedisChatMemory
第三步:注入容器使用
2. RAG知识库增量更新+自动去重:不用每次全量重建
最开始我做RAG,每次更文档都是删了全量重建,文档多了之后重建一次要半小时,完全没法用。
改成增量更新+内容哈希自动去重,新增文档自动入库,重复内容自动过滤,还能配合定时任务自动更新:
配合Spring定时任务,每天自动扫描新增文档:
3. 接口限流熔断+监控告警:防止大模型接口把服务打崩
OpenAI/通义千问这些API是按调用量收费的,不对接限流分分钟被刷到破产;而且一旦API出问题,得熔断防止故障拖垮整个服务,还要有监控告警第一时间通知开发:
我用Resilience4j实现,简单轻量,和SpringBoot集成非常方便:
第一步:引入依赖
第二步:给AI接口加上限流熔断
第三步:配置参数+监控
在application.yml里加配置:
对接Prometheus之后,配置告警规则:熔断打开、限流触发超过阈值,直接发消息到企业微信/钉钉,不用等用户投诉才知道出问题。
4. RAG智能分片+可调重叠:检索准确率提升20%+
Spring AI默认的分片器就是一刀切,经常把完整的语义切成两半,要么关键词在两个分片,检索的时候召回不出来,准确率特别低。
改成按段落分片,加可调重叠度,把上一个分片的末尾内容留到下一个分片,解决语义截断:
👉 调优经验:重叠大小一般设为分片大小的10%-20%就够了,我用maxChunkSize=1000,overlapSize=150,在我的知识库上准确率比默认分片高了23%,亲测有效。
5. Spring AI + Elasticsearch 实现混合检索,权重可调
原生Spring AI提供的Elasticsearch向量存储,只支持纯向量检索,很多关键词匹配的场景召回率上不去。我们改造成关键词+向量混合检索,还能调权重适配自己的数据集:
👉 调优经验:关键词权重0.2-0.4,向量权重0.6-0.8适配绝大多数场景,如果你的业务偏向专业名词检索,可以把关键词权重调高一点。
最后总结
Spring AI确实把AI应用开发的门槛降了很多,跑通Demo只要几十行代码,但真要做企业级生产服务,还是得补很多细节:
分布式会话要持久化,不能放内存
知识库要支持增量更新,别每次全量重建
接口要限流熔断,做好监控告警,不然出问题都不知道
分片和检索都要调优,才能拿到高准确率
下一篇讲Spring AI Agent多工具并行调度的生产改造~