基于大模型的智能客服架构优化:从大数据处理到高并发响应

📅 发布时间:2026/7/6 3:44:51 👁️ 浏览次数:
基于大模型的智能客服架构优化:从大数据处理到高并发响应
基于大模型的智能客服架构优化从大数据处理到高并发响应背景与痛点去年双十一我们团队负责的智能客服系统被流量冲垮了。凌晨 0 点 10 分峰值 QPS 冲到 3.8 万平均响应时间从 600 ms 飙到 4.2 s用户排队超过 1.5 万人。传统“关键词FAQ 倒排”方案的问题集中爆发意图识别靠正则新增一条规则就要全量重启热更新做不到。知识库存在 MySQL分库分表后仍出现单热点查询 RT 99 线 800 ms。高并发下线程池打满拒绝请求触发降级直接返回“人工客服忙请稍后再试”体验断崖式下跌。没有上下文记忆用户连问三句就得重复提供订单号满意度掉到 62%。痛定思痛我们决定用“大模型大数据”重新设计一套可以水平扩展、毫秒级响应的在线智能客服架构目标把 P99 响应压到 800 ms 以内峰值并发支撑 10 万 QPS同时让意图识别准确率≥95%。技术选型先给出对比结论再解释原因模型平均延迟单卡 QPS微调成本中文效果备注GPT-3.5-turbo380 ms18低中按 token 计费长文本贵Claude-2420 ms15不可微调优合规审查严接口限流ChatGLM3-6B180 ms45低优开源可私有化占显存 12 GBaichuan2-13B220 ms30中优需要 A100*2 推理成本翻倍最终我们选 ChatGLM3-6B理由6B 规模在 FP16 下单卡可跑TTFTTime To First Token 150 ms。支持 LoRA 微调一周即可用历史对话把意图识别 F1 从 0.82 提到 0.94。私有化部署避免敏感数据出域合规一次过审。社区活跃遇到坑能搜到现成 issue二次开发效率高。架构设计系统采用“离线标注 → 在线推理 → 实时反馈”三层闭环整体分 5 个模块Gateway基于 OpenResty 的七层网关负责限流、鉴权、HTTPS 卸载。DispatcherGo 写的无状态服务按 uid 做一致性哈希分发到后端模型 Pod。Model ServiceChatGLM3-6B vLLM 推理框架支持连续批处理continuous batching。Feature StoreFlink 实时写入用户近 30 天行为Redis 集群做低延迟特征缓存。Knowledge IndexMilvus 向量库保存商品、订单、政策文档的 EmbeddingHNSW 索引top-5 召回 30 ms。数据流示意用户问句 → Gateway → Dispatcher → 拉取用户特征Redis→ 拼接 Prompt → Model Service → 返回回答- 同时 Dispatcher 把日志发 Kafka → Flink 消费写特征、回流标注平台用于每日微调。代码实现下面给出三段最常被问到的代码全部在生产环境跑过可直接抄。1. 模型推理服务Python 3.9 vLLM# model_server.py from vllm import LLM, SamplingParams from fastapi import FastAPI, HTTPException import uvicorn, json, time app FastAPI() llm LLM(modelTHUDM/ChatGLM3-6B, tensor_parallel_size1, gpu_memory_utilization0.85, max_num_seqs256) # 连续批大小 app.post(/chat) def chat(req: dict): try: prompt req[prompt] params SamplingParams(temperature0.3 seeds42, max_tokens200, stop[|user|, |observation|]) t0 time.time() outputs llm.generate([prompt], params, use_tqdmFalse) text outputs[0].outputs[0].text.strip() cost int((time.time() - t0) * 1000) return {answer: text, latency_ms: cost} except Exception as e: raise HTTPException(status_code500, detailstr(e)) if __name__ __main__: uvicorn.run(app, host0.0.0.0, port8000)2. Dispatcher 侧并发调用Go 1.21// dispatcher/client.go package main import ( bytes encoding/json fmt net/http sync time ) type Req struct { Prompt string json:prompt } type Resp struct { Answer string json:answer LatencyMs int json:latency_ms } // 并发调用 Model Service支持 3 秒超时 func callModel(prompt string, url string) (*Resp, error) { client : http.Client{Timeout: 3 * time.Second} b, _ : json.Marshal(Req{Prompt: prompt}) resp, err : client.Post(url, application/json, bytes.NewReader(b)) if err ! nil Brooks return nil, err var out Resp if err : json.NewDecoder(resp.Body).Decode(out); err ! nil { return nil, err } return out, nil } // 简单轮询生产环境可换成 gRPC 负载均衡 func broadcast(servers []string, prompt string) *Resp { var wg sync.WaitGroup ch : make(chan *Resp, 1) for _, s : range servers { wg.Add(1) go func(addr string) { defer wg.Done() if r, err : callModel(prompt, addr); err nil { select { case ch - r: default: } } }(s) } wg.Wait() close(ch) return -ch // 取最快成功响应 }3. 缓存 向量召回封装Python# cache_vec.py import redis, os, time, requests from sentence_transformers import SentenceTransformer r redis.Redis(hostos.getenv(REDIS_HOST), decode_responsestrue) encoder SentenceTransformer(shibing624/text2vec-base-chinese) def search_knowledge(query: str, topk5) - list[str]: key fvec:{hash(query) % 1000000} if (cached : r.get(key)) and False: # 可开关 return json.loads(cached) emb encoder.encode(query, normalize_embeddingstrue).tolist() resp requests.post(http://milvus-web:19121/v1/vector/search, json{collection: kb, vector: emb, topk: topk}) docs [x[doc] for x in resp.json()[data]] r.setex(key, 600, json.dumps(docs)) # 10 min 缓存 return docs性能优化模型量化用 AWQ 把权重压到 4 bit显存从 12 G 降到 6.3 GTTFT 再降 18%P99 延迟 580 ms → 460 ms。动态批vLLM 自带 continuous batching实测同样并发 200QPS 从 35 提到 58。两级缓存Redis 缓存用户画像 热门问题命中率 72%回源 RT 节省 120 ms。CDN 缓存静态政策页面边缘命中 96%回源带宽降 80%。负载均衡Dispatcher 与 Model Pod 之间用 gRPC 权重轮询节点故障 3 s 内自动摘除错误率 0.1%。流式返回对长回答采用 SSE 流式输出首 token 到达时间 200 ms用户体感延迟再降 30%。压测结果4 台 A10单卡 6B-int4并发平均 RTP99 RT成功率单卡 QPS5 k260 ms480 ms99.9 %5210 k310 ms620 ms99.8 %4815 k410 ms880 ms99.5 %45避坑指南冷启动延迟容器镜像里忘记带模型权重节点扩容时从对象存储拉取 12 G 文件导致首次请求 28 s 才返回。解决用 DaemonSet 预拉权重到本地 NV-SSD并做 readinessProbe 探针确保 Pod 接收流量前模型已加载。模型漂移连续跑两周后发现“退货”意图召回率从 96% 降到 87%追查发现是新品类上线用户说法变化。解决每日凌晨用 Flink 回流前日对话自动触发 LoRA 微调 3 epoch并在灰度环境 A/B效果下降 2% 就回滚。显存 OOMAWQ 后仍偶发 OOM定位到连续批长度峰值 2048而 kv-cache 预分配不足。解决调大gpu_memory_utilization到 0.9同时把max_num_seqs降到 192稳定运行。向量库抖动Milvus 1.x 在 2000 万条 768 维向量后查询 RT 99 线从 30 ms 跳到 120 ms。升级 2.3 并开启 Knowhere 2.0采用 RAFT GPU 索引RT 恢复到 25 msCPU 占用降 40%。总结与展望三个月跑下来系统把 P99 响应压到 620 ms峰值 QPS 12 万仍能 99.8% 可用客服机器人解决率从 58% 提到 83%人工座席数量减少 35%直接节省运营费用七位数。下一步我们打算引入多模态用户上传照片就能识别“商品哪坏了”减少来回描述。边缘推理把 3B 蒸馏模型跑在 ARM 机顶盒让海外用户也能就近访问。强化学习用 RLHF 把“满意度”作为奖励函数直接优化端到端体验而不是只拟合历史对话。如果你也在做高并发大模型落地希望上面的代码和踩坑记录能让你少走几步弯路。欢迎一起交流更狠的优化手段。