2026/3/28 1:49:10
网站建设
项目流程
网站做实名验证,智慧团建网站登录平台官网,70 网站制作,公司网站建设方案模板基于LLM与RAG的AI智能客服实战#xff1a;高精度意图识别与Prompt优化指南 背景痛点#xff1a;长尾意图的“规则盲区”
传统客服系统大多靠正则关键词的“规则引擎”或轻量级 ML 模型#xff08;如 TextCNN、FastText#xff09;做意图识别。 在头部高频 query 上表现尚可…基于LLM与RAG的AI智能客服实战高精度意图识别与Prompt优化指南背景痛点长尾意图的“规则盲区”传统客服系统大多靠正则关键词的“规则引擎”或轻量级 ML 模型如 TextCNN、FastText做意图识别。在头部高频 query 上表现尚可一旦遇到口语化、省略、倒装、领域黑话等长尾表达就会出现召回空规则覆盖不到直接丢给“人工坐席”误召回相似关键词触发错误流程用户被“答非所问”维护噩梦每周新增 200 语料规则文件膨胀到上万行冲突与优先级难以梳理实测某头部电商客服长尾意图占比 18%却贡献了 52% 的投诉单。仅靠堆人力补规则边际收益趋近于零——这是引入 LLMRAG 的直接动因。技术对比纯 LLM vs LLMRAG指标纯 LLMgpt-3.5-turboLLMRAG同一底座备注意图准确率82%94%测试集 3.2k 条含 21 类长尾意图平均延迟1.8 s0.9 s检索 200 docs → top-5GPU A10单轮成本0.42 分0.13 分减少 69%RAG 用 6B 小模型做判别幻觉率9%2%人工抽检 500 轮对话结论RAG 把“知识”外置到向量库LLM 只负责“理解生成”在准确率、速度、成本三角里取得更优平衡。核心实现1. 微调意图分类模型PyTorch 版以bert-base-chinese为底座加一层 21 分类 FC。训练数据业务日志 28w 条清洗标注后 9.4w 条。# dataset.py class IntentDataset(Dataset): def __init__(self, df, tok, max_len128): self.tok, self.max_len tok, max_len self.text df[query].values self.label df[label_id].values def __getitem__(self, idx): enc self.tok( self.text[idx], max_lengthself.max_len, truncationTrue, paddingmax_length, return_tensorspt ) return { input_ids: enc[input_ids].squeeze(0), attention_mask: enc[attention_mask].squeeze(0), labels: torch.tensor(self.label[idx], dtypetorch.long) } # train.py model BertForSequenceClassification.from_pretrained( bert-base-chinese, num_labels21 ) trainer Trainer( modelmodel, argsTrainingArguments( output_dir./ckpt, per_device_train_batch_size64, num_train_epochs3, learning_rate2e-5, weight_decay0.01, evaluation_strategyepoch, save_strategyepoch, metric_for_best_modeleval_f1, load_best_model_at_endTrue ), train_datasettrain_ds, eval_datasetval_ds, compute_metricslambda p: {f1: f1_score(p.label_ids, p.predictions.argmax(-1), averagemacro)} ) trainer.train()微调后 F10.93比原始 zero-shot 提升 12 个点模型大小 440 MB推理 20 msT4。2. 动态更新 RAG 检索模块向量数据库选型Milvus 2.3分布式、支持标量过滤社区活跃pgvector如果已有 PG 基建0 运维成本本次 demo 用 Milvusdim768索引 IVF_FLAT nlist2048检索流程用户 query → 微调 Bert 做 encoder → 768 向量Milvus top-5召回阈值 0.72→ 拼接段落标题内容按“业务优先级”重排序订单类 售后类 咨询类返回 JSON{candidates: [...], score: [...]}动态更新运营后台新增 QA 对 → 异步任务 encode → upsert Milvus延迟 3 分钟线上可见。3. 业务 Prompt 模板采用 system / assistant / user 三段式把“角色背景约束”一次给全减少 LLM 自由发挥。system: 你是**品牌官方客服**只使用**知识库内容**回答禁止编造。若知识库无答案请严格回复“暂未查询到相关信息将为您转接人工”。回答控制在 80 字以内语气亲切。 assistant: 好的我将依据官方资料回复。 user: {{query}} context: {{retrieved}}实测该模板幻觉率从 9% 降到 2%平均长度下降 30%用户满意度提升 8 个百分点。代码示例带限流/熔断/异步的 API 封装# service.py import asyncio, backoff from fastapi import FastAPI, HTTPException from aiobrakelimit import Limiter from circuitbreaker import circuit app FastAPI() limiter Limiter(500) # 每秒 500 请求 circuit(failure_threshold10, timeout30) backoff.on_exception(backoff.expo, Exception, max_tries3) async def rag_retrieve(query: str): 异步检索失败自动重试 vec await encoder.encode(query) return await milvus_client.search(vec, top_k5) app.post(/chat) limiter async def chat(req: ChatRequest): # 1. 敏感词过滤 if sensitive_hit(req.query): raise HTTPException(403, 输入包含敏感内容) # 2. 幂等校验 if await redis.exists(req.msg_id): return await redis.get(req.msg_id) # 3. RAG LLM candidates await rag_retrieve(req.query) prompt build_prompt(req.query, candidates) answer await llm.agenerate(prompt) # 4. 落库缓存 await asyncio.gather( save_dialog(req.msg_id, req.query, answer), redis.set(req.msg_id, answer, ex3600) ) return {answer: answer, msg_id: req.msg_id}要点使用aiobrakelimit做令牌桶单节点 5k QPS 压测 CPU 60%10 次异常即熔断30 s 后自动半开幂等 key 用前端生成的 uuid避免用户重试导致重复下单/发货生产环境考量1. 对话状态幂等性每条消息带 msg_id服务端先查 Redis 再落库对“支付”“退货”等写操作再叠加订单号维度锁SET NX EX2. 敏感信息过滤采用 DFA 每日更新词表延迟 2 ms对手机号、地址做正则脱敏日志打印统一打码3. 模型版本灰度流量按 uid 尾号分桶10% 走新模型观测 24h 准确率、投诉率通过 Kubernetes 双 deployment header 染色回滚 30 s 完成避坑指南坑现象解决未做 query 改写用户说“我那个东西裂开了”检索不到“商品破损”引入同义词拼写纠错层召回率提升 18%向量维度与索引不匹配升级模型后维度 768→1024线上检索全失败在 Milvus 新建 collection双写 7 天平滑切换知识库段落过长超过 LLM 4k 限制prompt 被截断按“标题中心句”二次摘要平均长度 120 token性能优化小结向量缓存Redis 缓存高频 query命中率 35%P99 延迟再降 40 ms批量推理把 8 条候选段落拼一次 LLM 请求QPS 提升 2.7 倍模型蒸馏用 12 层 Bert 蒸馏到 4 层准确率下降 1%速度×3效果复盘上线 4 周数据意图识别准确率 94.2% → 目标 90%平均响应 0.9 s → 目标 1.2 s 内人工转接率 23% → 11%节省坐席 200 人/日单轮成本 0.13 分比纯 LLM 方案年省 180 万开放性问题当用户意图存在多重语义既要“开发票”又抱怨“物流慢”时如何设计 fallback 机制既保证核心诉求被优先解决又不陷入多轮空转期待你的思考与分享。