资讯动态

Day 15 | AI 智能客服:7×24 小时不下班

发布时间:2026/10/23 2:41:21 来源:尧图企业网站定制
摘要今天来搞一个每个电商项目都需要的东西——AI 智能客服。用 RAG 架构把商品 FAQ 和订单数据灌进向量库对接 GLM-4.7-Flash永久免费 200K做对话生成再配上多轮对话记忆和人工兜底。一套完整的 7×24 小时不下班的客服系统成本约等于零。代码全部可运行直接集成到 Django 项目里。人工客服太贵了做电商的朋友都知道客服是最吃人力的一环。算一笔账一个客服月薪 5000-8000三班倒至少 3 个人。一年下来光人力成本就 20 万。而且人总会犯错——回复慢了、态度差了、信息搞混了都是投诉的导火索。更头疼的是凌晨 2 点有人问你们怎么退换货没人回。第二天用户可能就不买了。订单系统稳了商品系统也跑起来了。下一步就是让 AI 把客服这活儿接过来。今天我们就搭一个完整的 AI 客服系统意图识别先判断用户想干嘛查订单问 FAQ还是想骂人知识检索从 FAQ 知识库里找到最相关的回答LLM 生成让 AI 基于检索结果组织语言回答人工兜底搞不定的转人工不让 AI 瞎说整个系统的成本≈ ¥0。GLM-4.7-Flash 永久免费额度 200K tokens日常咨询量完全够用。RAG 是什么为什么需要 RAG你可能会问直接把 FAQ 塞给大模型不就行了问题在于大模型不知道你的商品信息。它不知道商城支持微信支付、不知道退换货政策是 7 天无理由。Prompt 有长度限制。把 100 条 FAQ 全塞进去token 爆了。回答不可控。模型可能幻觉——编造一个不存在的优惠政策。RAGRetrieval-Augmented Generation检索增强生成就是为了解决这三个问题。RAG 的工作流程画成图就是四步用户提问你们怎么退换货 │ ▼ ┌─────────────────┐ │ ① 向量化查询 │ 把用户问题编码成向量768 维 └────────┬────────┘ │ ▼ ┌─────────────────┐ │ ② 语义检索 │ 在知识库中找最相似的 3 条 FAQ │ 余弦相似度 │ → 命中怎么退换货相似度 0.92 └────────┬────────┘ │ ▼ ┌─────────────────┐ │ ③ 拼接 Prompt │ 系统人设 检索到的 FAQ 用户问题 └────────┬────────┘ │ ▼ ┌─────────────────┐ │ ④ LLM 生成回答 │ GLM-4.7-Flash 基于参考资料生成自然语言回答 └─────────────────┘ │ ▼ 收到商品 7 天内可申请无理由退换货~ 操作步骤我的订单 → 申请售后 → 选择退换原因 → 提交一句话总结 RAG先查资料再回答问题。就像考试翻书——你不一定要记住所有知识点但你要知道去哪翻。意图识别客服的前门不是所有问题都要走 RAG。用户说转人工你不需要检索知识库用户说查订单你需要的是查数据库不是查 FAQ。所以我们加一层意图识别用户输入 │ ├─ 转人工 ──────→ 转人工客服兜底 ├─ 查订单 ──────→ 查订单数据库业务逻辑 ├─ 快递到哪了 ──→ 查物流接口业务逻辑 └─ 其他问题 ─────→ RAG 检索 LLM 生成简单场景用关键词匹配就够了不需要额外训练分类模型。动手实战环境准备pipinstallzhipuai sentence-transformers numpy三个核心依赖库作用zhipuai调用 GLM-4.7-Flash永久免费sentence-transformers中文文本向量化numpy向量计算余弦相似度对接 GLM-4.7-FlashGLM-4.7-Flash 是智谱 AI 的轻量模型永久免费额度 200K tokens。客服场景的回答通常就 100-200 字200K 额度能覆盖大量日常咨询。fromzhipuaiimportZhipuAI clientZhipuAI(api_keyyour-api-key-here)defcall_glm4_flash(messages:list,temperature:float0.3)-str: 调用 GLM-4.7-Flash 生成回答 客服场景 temperature 建议 0.1~0.3低温度 回答更稳定 responseclient.chat.completions.create(modelglm-4-flash,# 永久免费模型messagesmessages,temperaturetemperature,max_tokens1024,# 客服回答不需要太长)returnresponse.choices[0].message.content为什么 temperature 设 0.3客服回答要的是准确不是创意。温度太高模型可能会发挥想象力编造优惠政策那就闯祸了。构建知识库知识库是 RAG 的大脑。把商城的 FAQ 整理成结构化数据FAQ_KNOWLEDGE_BASE[{id:faq_001,question:你们支持哪些支付方式,answer:商城支持微信支付、支付宝、银行卡三种支付方式。,category:支付,},{id:faq_002,question:发货到全国要多久,answer:普通订单 3-5 个工作日送达偏远地区 5-7 个工作日。支持顺丰加急。,category:物流,},{id:faq_003,question:怎么退换货,answer:收到商品 7 天内可申请无理由退换货。我的订单 → 申请售后 → 选择退换原因 → 提交。,category:售后,},# ... 更多 FAQ]实际项目中这些 FAQ 从哪来三个来源人工整理客服团队把高频问题整理成文档历史工单挖掘从过去的客服聊天记录中提取高频问答对AI 生成用大模型根据商品信息自动生成 FAQ后面会讲向量检索引擎这是 RAG 的核心组件。把每条 FAQ 转成向量查询时算余弦相似度fromsentence_transformersimportSentenceTransformerimportnumpyasnp# 加载中文语义向量模型embedding_modelSentenceTransformer(shibing624/text2vec-base-chinese)classVectorStore:轻量级向量存储——把知识库变成可检索的向量空间def__init__(self):self.documents[]# 原始文档self.vectorsNone# 向量矩阵defadd_documents(self,docs:list):把 FAQ 批量编码为向量self.documentsdocs texts[f{doc[question]}{doc[answer]}fordocindocs]self.vectorsembedding_model.encode(texts,normalize_embeddingsTrue)defsearch(self,query:str,top_k:int3)-list:语义检索找到和用户问题最相关的 FAQquery_vectorembedding_model.encode([query],normalize_embeddingsTrue)# 归一化后点积 余弦相似度similarities(self.vectors query_vector.T).flatten()top_indicessimilarities.argsort()[::-1][:top_k]results[]foridxintop_indices:docself.documents[idx].copy()doc[score]float(similarities[idx])results.append(doc)returnresults为什么用shibing624/text2vec-base-chinese这是专门针对中文优化的轻量向量模型只有 400MB本地就能跑。退换货和退货流程能被识别为相似含义。检索效果示例用户问东西坏了怎么办 → 检索结果 1. [售后] 商品质量有问题怎么办相似度 0.87✅ 2. [售后] 怎么退换货相似度 0.81✅ 3. [物流] 发货到全国要多久相似度 0.34❌ 过滤东西坏了和商品质量有问题虽然用词完全不同但语义相似度很高。这就是向量检索比关键词匹配强的地方。意图识别# 意图规则表关键词 → 意图类型INTENT_RULES{转人工:transfer_human,人工客服:transfer_human,我要投诉:transfer_human,查订单:query_order,我的订单:query_order,快递到哪了:query_logistics,}defidentify_intent(user_message:str)-dict:关键词匹配意图——简单但有效forkeyword,intentinINTENT_RULES.items():ifkeywordinuser_message:return{intent:intent,need_rag:False}return{intent:general_qa,need_rag:True}关键词匹配能覆盖 80% 的场景。剩下 20% 的边界情况用户说我不想要了想退货但没说关键词RAG 也能兜住。多轮对话 上下文记忆用户不会一句话把问题说清楚。典型的对话是多轮的用户帮我查一下最近的订单 AI为您查询到 2 笔订单... 用户第二笔什么时候发货 ← 这里的第二笔需要上下文 AI第二笔订单MYD20260102002目前待支付支付后 24 小时内发货~实现多轮对话的关键是对话历史管理classConversationMemory:多轮对话记忆管理def__init__(self):self.sessions{}# session_id → 对话历史defget_system_prompt(self)-dict:客服人设 Promptreturn{role:system,content:(你是商城的智能客服小梅请遵守以下规则\n1. 语气亲切友好像朋友聊天\n2. 回答简洁准确控制在 200 字以内\n3. 只回答购物相关问题\n4. 不确定的问题诚实说不要编造\n5. 退款/投诉等敏感操作建议联系人工客服),}defadd_message(self,session_id:str,role:str,content:str):添加消息到对话历史最多保留最近 10 轮 20 条self.sessions.setdefault(session_id,[]).append({role:role,content:content})iflen(self.sessions[session_id])20:self.sessions[session_id]self.sessions[session_id][-20:]为什么要截断历史一方面控制 token 用量另一方面太久远的对话对当前问题没帮助。保留最近 10 轮足够。组装完整的客服系统把所有模块串起来核心框架完整实现见配套代码classMeiYaDaChatbot:AI 客服——完整系统def__init__(self):self.vector_storeVectorStore()self.memoryConversationMemory()self.vector_store.add_documents(FAQ_KNOWLEDGE_BASE)defchat(self,session_id:str,user_message:str)-str:处理一次用户消息# ① 记录用户消息self.memory.add_message(session_id,user,user_message)# ② 意图识别intentidentify_intent(user_message)[intent]# ③ 根据意图走不同分支ifintenttransfer_human:replyself._handle_transfer_human()elifintentquery_order:replyself._handle_order_query(user_message)elifintentquery_logistics:replyself._handle_logistics_query(user_message)else:replyself._handle_rag_query(session_id,user_message)# ④ 记录 AI 回复self.memory.add_message(session_id,assistant,reply)returnreplydef_handle_rag_query(self,session_id:str,user_message:str)-str:RAG 核心检索 → 拼接 → 生成# ① 检索知识库 top-3过滤低相似度score 0.3# ② 拼接【分类】问题答案为上下文# ③ 组装消息系统人设 参考资料 最近 6 条对话历史# ④ call_glm4_flash(messages, temperature0.3) 生成回答...Django 集成在 Django 项目中暴露成 API 接口fromrest_framework.decoratorsimportapi_view,permission_classesfromrest_framework.permissionsimportIsAuthenticatedfromrest_framework.responseimportResponse chatbotMeiYaDaChatbot()api_view([POST])permission_classes([IsAuthenticated])defchat_view(request):AI 客服对话接口 POST /api/chat/user_messagerequest.data.get(message,).strip()session_idfuser_{request.user.id}replychatbot.chat(session_id,user_message)returnResponse({reply:reply,session_id:session_id})前端只需要一个输入框 一个消息列表往/api/chat/POST 消息就行。AI 加速让 AI 帮你建知识库手动写 FAQ 太累了。我们可以用 AI 来批量生成用 GLM-4.7-Flash 自动生成 FAQdefgenerate_faq_from_product(product_info:str)-list: 根据商品信息让 AI 自动生成 FAQ 输入商品描述文本 输出FAQ 列表 [{question: ..., answer: ...}, ...] promptf 根据以下商品信息生成 5 个用户最可能问的问题和回答。 格式要求每行一个 QA用 Q: 问题\nA: 回答 的格式。 商品信息{product_info}responsecall_glm4_flash([{role:user,content:prompt}],temperature0.5)# 解析 AI 返回的 QA 对逐行匹配 Q: / A: 前缀...returnfaq_list# 使用示例把商品描述丢进去5 条 FAQ 自动生成直接灌入知识库new_faqsgenerate_faq_from_product(梅雅达自营蓝牙耳机 Pro Max\n- 主动降噪 40dB\n- 续航 36 小时\n- 价格 ¥399)这个方法的核心思路让 AI 站在用户的角度想问题。用户看到续航 36 小时会问什么“充电要多久”“能用几天”——这些问题人工客服天天在回答AI 一扫商品描述就能批量生成。优化客服人设 Prompt客服的回答质量 80% 取决于 Prompt 写得好不好# ❌ 差的 Prompt你是一个客服请回答用户的问题。# ✅ 好的 PromptGOOD_SYSTEM_PROMPT 你是商城的智能客服小梅~ 【性格】 - 亲切友好像朋友聊天 - 适当使用 emoji 和~让对话更温暖 【规则】 - 回答简洁控制在 200 字以内 - 只回答购物相关的问题 - 不确定的问题诚实说这个我需要确认一下 - 退款/投诉建议联系人工客服 【参考资料】 如果有提供参考资料优先基于参考资料回答不要编造资料里没有的信息。 关键区别好的 Prompt 有人设、有边界、有兜底策略。AI 不会乱说话也不会死机——遇到不会的就引导到人工。学完来练练手 入门给知识库加上会员等级相关的 FAQ银卡/金卡/钻石卡不同权益 进阶把 VectorStore 改成持久化存储用pickle或numpy.save把向量矩阵存到磁盘启动时直接加载避免每次重启都重新跑 embedding 模型 挑战接入真实的订单数据库让查订单功能从 Django ORM 查询真实数据而不是返回 mock 数据配套文件day15_chatbot.py完整实现可参考学习。GLM-4.7-Flash 文档sentence-transformers 文档。本系列为梅雅达编程笔记原创首发于 CSDN。有问题评论区见

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑