当前位置: 首页 > news >正文

基于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系统=算法×工程×数据,任何一环掉链子,用户体验都会“秒翻车”。希望这份笔记能帮你少熬几个通宵,也欢迎把你们的实战故事分享给我,一起把智能客服做得再“像人”一点。


http://www.jsqmd.com/news/353630/

相关文章:

  • STM32F103C8T6工程移植与LED点灯实战指南
  • 智能穿戴设备的‘方向感’革命:LSM303DLH低功耗电子罗盘设计揭秘
  • 基于Chatbot Arena 8月排行榜的高效对话系统优化实战
  • 短视频平台毕业设计实战:从零构建高可用视频上传与分发系统
  • Arduino智能寻迹小车:从硬件搭建到算法优化的全流程解析
  • 毕设停车场车辆检测:从零实现一个轻量级YOLOv5检测系统
  • STM32 HAL库原理与工程实践:从内核演进到电机控制
  • 基于Java的建设工程质量检测机构智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • 计算机毕设Java网站新手入门:从零搭建可部署的Web应用避坑指南
  • RFSoC应用笔记 - RF数据转换器 -22- API实战:动态调整ADC抽取因子与时钟同步优化
  • 基于Python的旅游景点推荐系统毕设:从数据建模到Flask部署的实战全流程
  • 蜂答智能客服AI辅助开发实战:从架构设计到性能优化
  • STM32超声波测距:HC-SR04输入捕获与距离计算实战
  • 【玩转Jetson TX2 NX】(四)M.2固态硬盘Ext4分区优化与系统加速实战
  • 基于Java的建设工程质量监督智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • 基于YOLO的罐装饮料智能识别:从数据集构建到工业应用实战
  • 基于LLM的AI智能客服系统开发实战:从架构设计到生产环境部署
  • PHP智能客服系统源码解析:从零搭建高可用架构的实战指南
  • 从游戏设计到NP完全:如何用规约思维解决复杂关卡设计难题
  • STM32串口通信与HC-05蓝牙控制实战指南
  • 2026年2月购物卡回收公司最新推荐,权威榜单测评与无套路回收挑选攻略 - 品牌鉴赏师
  • AI 辅助开发实战:基于 MediaPipe 的手势识别毕业设计全流程解析
  • Qwen3-ASR-1.7B在会议场景的优化:多人对话识别方案
  • SpringBoot智能客服系统实战:从架构设计到性能优化
  • StableDiffusion模型与Lora安装全攻略:从下载到实战应用
  • 【Docker 27跨架构镜像转换终极指南】:20年DevOps专家亲授arm64/x86_64双向构建、签名与验证全链路实战
  • Qwen3-ASR-1.7B智能车载系统:驾驶场景语音指令识别
  • AI辅助CATIA卡车模型视频生成:从参数化建模到自动化渲染实战
  • ChatGPT工作空间被停用?AI辅助开发环境的高可用架构实践
  • 解决 ‘cosyvoice no module named torchaudio‘ 的 AI 辅助开发实战指南