电商公司客服组六个姑娘,从早八点到晚十一点,每人每天要回三四百条消息。屏幕上一排排对话框,手指在键盘上飞快敲,旁边还贴着一张A4纸,上面密密麻麻写满了“标准话术”。
有天客服组长小周吐槽:“同一个问题,’这个奶瓶能不能放微波炉加热’,今天已经回了十七遍了。每次还得翻话术表,找到对应的回复,复制过来,改改语气,再发出去。一条消息快的话一分钟,慢的话三四分钟。”
她揉了揉手腕,说腱鞘炎又犯了。
当时就想,这事儿能不能用AI搞一下。
研究了几个国产大模型的API。DeepSeek的接口价格不贵,响应速度也快,用来做客服回复草稿正合适。思路很简单:把客户的消息丢给大模型,让它根据我们预设的客服人设和产品信息,生成一条得体的回复草稿。客服人员只需要看一眼,觉得没问题就直接发出去,不用从头打字了。
我用的是DeepSeek的Chat Completion接口,兼容OpenAI的格式,requests库就能搞定。
下面是完整代码。先搭了一个系统提示词,告诉AI它是一个母婴店的客服,语气要亲切、专业。然后做了一个带上下文记忆的多轮对话功能,这样AI能记住客户之前聊了什么,不会每句话都当新问题来处理。
import requestsimport json# DeepSeek API 配置API_KEY = "sk-your-deepseek-api-key"# 替换成你自己的API KeyAPI_URL = "https://api.deepseek.com/chat/completions"# 系统提示词:定义客服角色和回复风格SYSTEM_PROMPT = """你是"贝贝母婴旗舰店"的资深客服小贝。你的回复要求:1. 语气亲切自然,像朋友聊天,适当使用"亲"、"宝妈"等称呼2. 回答要专业准确,涉及产品材质、适用年龄等信息时要具体3. 回复控制在50字以内,简洁明了4. 如果客户问的问题你不确定,建议客户咨询产品详情页或联系品牌方5. 遇到退换货问题,引导客户提供订单号,告知7天无理由退换政策6. 不要用生硬的模板感,每条回复要有温度常见产品信息:- PPSU奶瓶:耐高温180度,可微波炉加热(中低火),不含BPA- 硅胶安抚奶嘴:食品级硅胶,建议3个月更换一次- 婴儿湿巾:99.9%纯水,无酒精无香精,新生儿可用"""def chat_with_customer(customer_message, conversation_history=None):""" 根据客户消息生成客服回复草稿 参数: customer_message: 客户发来的消息内容 conversation_history: 之前的对话记录(列表格式) 返回: AI生成的回复草稿 """# 构建消息列表,先放系统提示词messages = [{"role": "system", "content": SYSTEM_PROMPT}]# 如果有历史对话,加进去(记住之前聊了啥)if conversation_history:for item in conversation_history:messages.append({"role": item["role"],"content": item["content"] })# 把当前客户消息加到最后messages.append({"role": "user", "content": customer_message})# 请求头headers = {"Content-Type": "application/json","Authorization": f"Bearer {API_KEY}" }# 请求体payload = {"model": "deepseek-chat","messages": messages,"temperature": 0.7, # 稍微有点创造性,回复不那么死板"max_tokens": 200, # 客服回复不需要太长"top_p": 0.9 }# 发送请求response = requests.post(API_URL, headers=headers, json=payload, timeout=30)response.raise_for_status()result = response.json()# 提取回复内容reply = result["choices"][0]["message"]["content"]return replydef batch_generate_replies(customer_messages):""" 批量处理客户消息,每条都带上之前的对话上下文 参数: customer_messages: 客户消息列表,每条是字符串 返回: 包含所有回复的列表 """history = []results = []for msg in customer_messages:print(f"\n客户说:{msg}")# 带着前面的对话去生成回复reply = chat_with_customer(msg, conversation_history=history)print(f"AI草稿:{reply}")# 把这一轮对话记录到历史里history.append({"role": "user", "content": msg})history.append({"role": "assistant", "content": reply})results.append({"customer_msg": msg,"ai_reply": reply })returnresults# ============ 实际使用 ============if __name__ == "__main__":# 模拟一个客户的连续提问test_messages = ["你好,你们那个PPSU奶瓶能放微波炉加热吗?","中低火大概多久?我宝宝才3个月","好的,那奶嘴多久换一次呀","我家宝宝老是咬奶嘴,是不是该换了", ]print("="*50)print("客服回复草稿生成器 - 开始工作")print("="*50)replies = batch_generate_replies(test_messages)print("\n"+"="*50)print("所有回复生成完毕")print("="*50)
跑完之后,效果是这样的:
==================================================客服回复草稿生成器 - 开始工作==================================================客户说:你好,你们那个PPSU奶瓶能放微波炉加热吗?AI草稿:亲,可以的呢~咱们的PPSU奶瓶耐高温180度,微波炉中低火加热完全没问题哦。不过建议加热后摇匀试试温度再给宝宝喝,安全第一呀~客户说:中低火大概多久?我宝宝才3个月AI草稿:宝妈,3个月的宝宝肠胃比较娇嫩,建议中低火加热30-40秒就够了。加热后记得滴几滴奶在手腕内侧试试温度,不烫手再喂宝宝哦~有其他问题随时问我呀!客户说:好的,那奶嘴多久换一次呀AI草稿:亲,咱们的硅胶奶嘴建议3个月更换一次哦。如果奶嘴出现发黄、变形或者小洞变大的情况,就要提前换啦~为了宝宝健康,定期更换更放心呢!客户说:我家宝宝老是咬奶嘴,是不是该换了AI草稿:宝妈,宝宝咬奶嘴可能是出牙期的表现呢~如果奶嘴被咬出裂痕或变形了就要马上换哦。出牙期可以给宝宝准备牙胶,减少咬奶嘴的情况。需要我推荐适合的牙胶吗?==================================================所有回复生成完毕==================================================
光有这个脚本还不够。实际工作中,客服不会跑来跑Python代码。所以我又花了一个下午,把这个功能包了一层Flask接口,对接到了她们的客服工作台里。
from flask import Flask, request, jsonifyapp = Flask(__name__)# 存储每个会话的历史记录(实际生产中应该用Redis或数据库)session_store = {}@app.route("/api/generate_reply", methods=["POST"])def generate_reply():""" 供客服工作台调用的接口 请求体: {"session_id": "客户会话ID", "message": "客户消息"} """data = request.jsonsession_id = data.get("session_id", "default")message = data.get("message", "")if not message:return jsonify({"error": "消息不能为空"}), 400# 获取或初始化会话历史if session_id not in session_store:session_store[session_id] = []history = session_store[session_id]# 生成回复reply = chat_with_customer(message, conversation_history=history)# 更新会话历史(只保留最近10轮,避免上下文过长)history.append({"role": "user", "content": message})history.append({"role": "assistant", "content": reply})session_store[session_id] = history[-20:]return jsonify({"reply": reply,"session_id": session_id })@app.route("/api/clear_session", methods=["POST"])def clear_session():""" 清除会话历史(客户结束对话时调用) """session_id = request.json.get("session_id", "")if session_id in session_store:del session_store[session_id]return jsonify({"status": "ok"})if __name__ == "__main__":app.run(host="0.0.0.0", port=5000)客服工作台那边加个按钮,点一下就把客户消息发到这个接口,返回的草稿直接显示在输入框里。客服看一眼,觉得没问题就点发送。觉得需要改,就手动调几个字。
用了两周之后,我又根据客服的反馈做了几个优化。
第一个是分类处理。不同类别的问题,系统提示词应该不一样。退换货问题要严谨,引导客户提供订单号。产品咨询可以轻松一点,带点推荐。投诉类的问题要安抚情绪,措辞得更小心。我加了一个简单的意图识别,根据关键词先分类,再选对应的提示词。
# 问题分类和对应的提示词CATEGORY_PROMPTS = {"product": "你是产品顾问,语气轻松专业,重点介绍产品特性和使用方法。","refund": "你是售后专员,语气诚恳耐心,引导客户提供订单号,说明退换政策。","complaint": "你是客户关怀经理,先表达歉意和理解,再给出解决方案。绝不推卸责任。","logistics": "你是物流查询助手,提供快递单号查询方法,说明发货时效。"}def detect_category(message):""" 简单的关键词分类(也可以用大模型做意图识别,更准但更慢) """if any(kwinmessage for kw in ["退款", "退货", "退换", "不想要"]):return "refund"elif any(kwinmessage for kw in ["投诉", "差评", "举报", "工商"]):return "complaint"elif any(kwinmessage for kw in ["快递", "发货", "物流", "到货"]):return "logistics"else:return "product"第二个优化是控制上下文长度。聊久了历史记录会越来越长,token费用也跟着涨。我设了个上限,只保留最近10轮对话,更早的就丢掉。对于客服场景来说,10轮之前的内容基本不会再提到了。
第三个是加了个“安全阀”。如果AI返回的回复里出现了敏感词(比如“赔偿”、“法律责任”这类),就自动标记为“需人工审核”,不让客服直接发送。
你看,四条连续提问,AI都记住了之前的上下文。第二条回复提到了“3个月的宝宝”,第四条还联想到了出牙期。这些回复客服人员扫一眼就能直接发出去,不用再从头打。
小周她们组用了这个工具之后,每条消息的处理时间从平均两分钟降到了四十秒左右。一天下来,每人能多处理将近一百条消息,加班时间也少了。小周的腱鞘炎倒是没好,但至少不用那么拼命敲键盘了。
说几个踩过的坑。提示词里的产品信息一定要准确,AI会照着编。我最初在提示词里写了“奶瓶耐温200度”,其实只有180度,AI就直接告诉客户可以高温消毒两小时,这要是客户真这么干了,奶瓶就废了。后来我改成了精确的参数,AI才不会再瞎编。
另外,temperature这个参数别设太高。客服回复不是写小说,不需要太多创造性。0.5到0.7之间比较合适,太高了回复会飘,有时候还会编造不存在的产品功能。
代码里那个SYSTEM_PROMPT是整个方案的关键,你可以根据自己的业务场景改。把产品信息、常见问题、回复风格都写进去,越具体越好,AI生成的回复就会贴合你的实际需求。
“无他,惟手熟尔”!有需要的用起来!关注微信公众号「Nicholas与Pypi」获取更多Python实战!------加入知识库与更多人一起学习------https://ima.qq.com/wiki/?shareId=f2628818f0874da17b71ffa0e5e8408114e7dbad46f1745bbd1cc1365277631c