news 2026/4/23 8:55:10

基于SpringBoot+LLM+Milvus构建企业级AI智能客服系统:架构设计与生产落地实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于SpringBoot+LLM+Milvus构建企业级AI智能客服系统:架构设计与生产落地实战


基于SpringBoot+LLM+Milvus构建企业级AI智能客服系统:架构设计与生产落地实战


1. 传统客服的三大“老大难”

做ToB客服产品五年,我总结过一张“吐槽清单”,出现频率最高的三条是:

  1. 意图识别太傻:关键词+正则,用户换种说法就“对不起,我没听懂”。
  2. 多轮对话断片:每次都得重复订单号、手机号,体验像打客服热线。
  3. 知识库检索慢:MySQL LIKE '%xxx%',数据量一上200万条,查询直奔2 s,客服坐席只能让客户“稍等”。

这三点直接带来两个结果:人工坐席成本居高不下;用户满意度常年在及格线徘徊。要破局,就得把“语义理解”和“知识检索”同时做到毫秒级,并且让系统可以横向扩展——这正是本文方案要解决的命题。


2. 技术选型:为什么不是Dubbo+GPT+PGVector?

###选型之前先拉一张对比表,把“业务指标”翻译成“技术指标”:

业务诉求技术指标候选方案结论
周迭代、Java生态友好开发效率、社区包SpringCloud/DubboSpringBoot 3.x胜在“一键启动”,学习曲线低
私有化部署、可控可插拔模型大小、LicenseGPT-4/ChatGLM3-6BChatGLM3-6B 12G显存可跑,Apache-2.0 License,可改可商用
10亿级向量、毫秒延迟索引召回<50 msMilvus/PGVectorPGVector单表500万后性能骤降,Milvus分布式+GPU索引优势明显

一句话总结:SpringBoot负责“快”,ChatGLM负责“懂”,Milvus负责“搜”。三者组合,既能在两周内做出MVP,也能在正式环境横向扩容到几十台机器。


3. 系统分层架构:一张图看懂数据流

文字版“架构图”如下,方便复制到PPT:

  1. 接入层:Nginx+Gateway,统一做HTTPS卸载、WAF、流控
  2. 服务层:SpringBoot业务Pod,无状态,可水平扩容
  3. 语义层:
    • LLM-Svc:ChatGLM3-6B,通过TorchServe暴露/gene_answer
    • Embed-Svc:Sentence-Transformers,把知识库文本向量化
  4. 存储层:
    • Milvus:存储1.2亿条512维向量,索引IVF_SQ8
    • Redis:对话状态、热数据缓存
    • MySQL:知识原文、运营后台
  5. 观察层:Prometheus+Grafana+ELK,SLA告警阈值P99>600 ms即触发

异步与流量控制细节:

  • 用户提问先进入Kafka Topicchat.req,消费端按user_id做分区,保证同一用户顺序处理
  • 若LLM-Svc平均RT>1 s,Gateway自动降级到“FAQ静态答案”,同时把流量镜像到影子集群做热备
  • 关键接口/chat/send配置令牌桶500次/上限/秒,超量返回429,防止促销时段把GPU打爆

4. 核心代码落地

4.1 SpringBoot集成LLM(REST+JWT)

@RestController @RequestMapping("/api/v1/chat") @RequiredArgsConstructor public class ChatController { private final ChatService chatService; private final JwtHelper jwtHelper; @PostMapping("/send") public Reply send(@RequestHeader("Authorization") String bearer, @Valid @RequestBody ChatReq req) { String userId = jwtHelper.parse(bearer); // 限流注解,基于Redis令牌桶 return chatService.reply(userId, req.getQuery()); } } @Service public class ChatService { private final LLMClient llmClient; private final VectorSearch vectorSearch; public Reply reply(String userId, String query) { // 1. 检索Top5相关知识点 List<String> knowledges = vectorSearch.topK(query, 5); // 2. 构造Prompt,控制token在3k以内 String prompt = PromptTpl.of(knowledges, query); // 3. 调用LLM,超时2s重试一次 String ans = llmClient.generate(prompt, Duration.ofSeconds(2)); return Reply.of(ans); } }

时间复杂度分析:向量检索IVF_SQ8索引,n=1.2亿,topK=5,耗时O(log n)≈25 ms;LLM生成首字延迟400 ms,整体P80<600 ms。

4.2 Milvus向量检索(Python脚本,可跑在Embed-Svc容器)

from pymilvus import Collection, utility collection = Collection("kb_embed") collection.load() def topk_search(embed: list, k: int = 5, threshold=0.78): search_params = {"metric_type": "IP", "params": {"nprobe": 64}} results = collection.search( data=[embed], anns_field="vector", param=search_params, limit=k, output_fields=["text"] ) # 过滤相似度 return [r.entity.get("text") for r in results[0] if r.score > threshold]

说明:IP(内积)相似度阈值0.78由网格搜索+人工标注1000条得,Precision@5=0.91。

4.3 对话状态机(Java枚举实现)

public enum DialogueState { GREET, ASK_ORDER, CONFIRM_ADDR, FINISH; public DialogueState next(Event e) { switch (this)订单查询: if (e == Event.ORDER_FOUND) return CONFIRM_ADDR; if (e == Event.NOT_FOUND) return ASK_ORDER; ... } }

状态缓存到Redis Hash,TTL=15 min,key=dialog:{userId},读写O(1)。


5. 生产环境 checklist

5.1 压力测试方案

  1. JMeter线程组:200并发,Ramp-up 60 s,循环次数无限
  2. 通过jp@gc - Throughput Shaping Timer把峰值压到1000 TPS
  3. 监控指标:Error<0.5%,P99 Latency<800 ms,GPU Util<85%
  4. 发现瓶颈:TorchServe默认workers=1,改为gpu_count*2,TPS从260提到740

5.2 安全防护

  • SQL注入:MyBatis-Plus只提供QueryWrapper,禁止拼接${};参数化绑定
  • 速率限制:Gateway层集成Bucket4j,按IP+user双维度,突发系数1.5
  • 内容审核:调用本地敏感词DFA过滤器,再调外部审核API双保险

5.3 Kubernetes关键YAML

apiVersion: apps/v1 kind: Deployment metadata: name: llm-svc spec: replicas: 2 template: spec: containers: - name: llm image: chatglm3:6b-torchserve resources: limits: nvidia.com/gpu: 1 # 单卡 requests: memory: "14Gi" livenessProbe: httpGet: path: /ping port: 8080 initialDelaySeconds: 300 # 模型加载慢

6. 避坑指南:上线前必须踩的坑

  1. LLM token长度:ChatGLM3默认8k,但TorchServe一次只能收2048汉字;解决:在SpringBoot侧用gpt2-tokenizer预截断,保留最后1800字,首字延迟降30%
  2. Milvus索引:IVF需要预训练nlist,经验公式nlist=sqrt(N),N=1.2亿时nlist=1w最合适;别盲目上HNSW,内存翻倍,提升仅5%
  3. Redis存上下文:刚开始用String存JSON,用户一多内存飙到30 G;改Hash+压缩(LZ4),节省60%,重启加载时间从90 s降到20 s

7. 开放讨论:如何做LLM的AB测试?

目前我们靠离线人工标注+BLEU/ROUGE打分,只能看“静态”效果。线上真实用户反馈怎么实时回流?如何按session维度自动分流到不同模型,并保证置信区间?欢迎有经验的同学留言聊聊,你们公司是怎样设计LLM线上AB测试框架的。


踩坑、调参、压测、上线,整套流程写下来,最深的体会是:AI系统=算法×工程×数据,任何一环掉链子,用户体验都会“秒翻车”。希望这份笔记能帮你少熬几个通宵,也欢迎把你们的实战故事分享给我,一起把智能客服做得再“像人”一点。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 4:27:33

Java AI智能体客服:从架构设计到生产环境落地实战

Java AI智能体客服&#xff1a;从架构设计到生产环境落地实战 1. 背景痛点&#xff1a;传统客服系统的三座大山 过去两年&#xff0c;我帮三家电商公司重构客服系统&#xff0c;总结下来最痛的点有三&#xff1a; 响应延迟&#xff1a;高峰期平均等待 8&#xff5e;12 s&…

作者头像 李华
网站建设 2026/3/20 9:18:08

【玩转Jetson TX2 NX】(四)M.2固态硬盘Ext4分区优化与系统加速实战

1. Jetson TX2 NX与M.2固态硬盘的黄金组合 Jetson TX2 NX作为边缘计算领域的明星产品&#xff0c;其小巧体积和强大算力让它成为众多AI项目的首选。但原厂自带的eMMC存储往往成为性能瓶颈——尤其是需要频繁读写数据的场景。我实测过&#xff0c;在运行目标检测模型时&#xff…

作者头像 李华
网站建设 2026/4/17 20:35:59

智能穿戴设备的‘方向感’革命:LSM303DLH低功耗电子罗盘设计揭秘

智能穿戴设备的‘方向感’革命&#xff1a;LSM303DLH低功耗电子罗盘设计揭秘 当清晨的第一缕阳光穿过窗帘&#xff0c;手腕上的智能手表轻轻震动&#xff0c;不仅提醒你新的一天开始&#xff0c;还准确指向北方——这背后是LSM303DLH三轴电子罗盘模块的精密运作。作为穿戴设备…

作者头像 李华
网站建设 2026/4/17 6:48:26

STM32串口通信与HC-05蓝牙控制实战指南

1. 串口通信基础与USART1硬件验证 在嵌入式系统中,串口通信是调试、控制与数据交互最基础且可靠的物理层通道。本项目选用STM32F103C8T6作为主控芯片,其具备3个USART/UART外设(USART1、USART2、USART3),其中USART1挂载于APB2总线,具有最高时钟权限(最高72MHz),且TX/R…

作者头像 李华
网站建设 2026/4/1 22:59:39

ChatGPT翻译内容公式高效导入Word的自动化实践

ChatGPT翻译内容公式高效导入Word的自动化实践 痛点分析&#xff1a;手动搬运的三座大山 格式丢失 直接把 ChatGPT 返回的 Markdown 粘进 Word&#xff0c;公式编号、粗体、行内代码全被吃掉&#xff0c;回头还要手工加样式&#xff0c;一篇 50 页的技术文档能折腾一下午。 批…

作者头像 李华