首页 / 博客 / 机器人·功能实战

微信客服机器人怎么做?7×24自动应答+转人工方案

分类:机器人·功能实战 · 标签:微信客服机器人、微信机器人、Python

前言

电商、教育、本地生活服务……越来越多团队把微信当作主要的客服渠道。但人工客服的排班成本居高不下,凌晨咨询无人应答、重复问题反复解释,这些痛点几乎是每个运营团队都绕不开的难题。

微信客服机器人的思路并不复杂:用一个托管在服务器的微信账号接收用户消息,程序自动匹配关键词或调用大模型生成回复,超出能力范围或用户主动喊"人工"时再转接给真人坐席。本文完整拆解这套方案的技术实现——消息接收、智能应答、会话状态管理、转人工——并给出可直接参考的 Python 代码框架。


一、整体架构

一套可用的微信客服机器人至少包含四层:

层级职责关键技术点
微信消息通道收发消息、维持登录微信 Hook / HTTP 接口层
消息路由层判断会话状态,分发给机器人或坐席状态机 + Redis
智能应答层关键词匹配 + FAQ + LLM 兜底规则库 / 向量检索 / OpenAI API
坐席系统真人接管、消息转发、接管超时归还WebSocket 推送 + 后台 UI
用户消息
  │
  ▼
[消息回调接口 POST /wechat/callback]
  │
  ├─ 会话在"人工"状态 ──▶ 转发给坐席后台
  │
  └─ 会话在"机器人"状态
        │
        ├─ 命中"人工"关键词 ──▶ 切换状态,排队/通知坐席
        │
        ├─ 命中 FAQ 规则 ──▶ 直接回复
        │
        └─ 无命中 ──▶ 调用 LLM 生成回复

这个架构的好处:各层解耦,FAQ 库和 LLM 可以独立迭代,坐席系统可以用现成的工单工具替代,不必一次全建。实际部署时,可以先只实现关键词匹配和转人工,后续再逐步接入向量检索和大模型,降低初期开发成本。


二、消息通道:接收与发送

微信官方不开放个人号 API,生产环境通常通过对微信客户端进行 Hook(在 Windows 环境注入 DLL)或使用 iPad/安卓协议层方案来实现消息收发。这类工具统一暴露成 HTTP 接口,业务代码只需处理 HTTP,不必关心协议细节。

WechatApi 提供扫码登录、消息收发、好友与群管理等 REST 接口,HTTP 调用即可,适合快速搭建客服机器人的消息通道层。

2.1 设置消息回调

登录成功后,第一步是告诉平台把收到的消息 POST 到你自己的服务器地址。回调地址必须是公网可达的 HTTPS 地址,本地开发阶段可以用 ngrok 或 frp 做内网穿透,生产环境建议部署在有固定 IP 的云服务器上:

pythonimport requests

BASE    = "https://你的接口域名"   # 注册后在官方文档获取
TOKEN   = "你的Token"
APPID   = "你的appId"
HEADERS = {"token": TOKEN}        # 鉴权字段名以官方文档为准

def set_callback(callback_url: str):
    """设置消息回调地址,需公网可达"""
    resp = requests.post(
        f"{BASE}/login/setCallback",
        headers=HEADERS,
        json={"appId": APPID, "callbackUrl": callback_url},
    )
    data = resp.json()
    if data.get("ret") == 200:
        print("回调设置成功")
    else:
        print("设置失败:", data)

# 代码为示例,具体接口/字段以官方文档为准
set_callback("https://你的服务器/wechat/callback")

2.2 回调消息结构

平台会把用户消息 POST 到上面设置的地址,字段以文档为准,典型结构如下:

json{
  "appId": "你的appId",
  "fromWxid": "wxid_xxxxxxxxx",
  "toWxid": "wxid_yyyyyyyyy",
  "type": 1,
  "content": "你好,我想退款",
  "msgId": "123456789",
  "createTime": 1718000000
}

2.3 发送文本消息

pythondef send_text(to_wxid: str, content: str):
    """向指定微信 ID 发送文本消息"""
    resp = requests.post(
        f"{BASE}/message/postText",
        headers=HEADERS,
        json={"appId": APPID, "toWxid": to_wxid, "content": content},
    )
    return resp.json()

# 代码为示例,具体接口/字段以官方文档为准

三、会话状态管理

客服机器人最容易出错的地方就是"忘了这个用户上一步在干什么"。每个用户的会话需要有独立的状态,最简方案是用 Redis 存储。Redis 的过期机制天然契合会话超时场景:用户超过一定时长没有消息,状态自动清除,下次接入时重新从机器人模式开始:

pythonimport redis
import json
from enum import Enum

r = redis.Redis(host="localhost", port=6379, decode_responses=True)

class SessionState(Enum):
    BOT    = "bot"     # 机器人处理中
    QUEUE  = "queue"   # 等待人工接入
    HUMAN  = "human"   # 人工服务中

SESSION_TTL = 3600  # 会话超时 1 小时

def get_state(wxid: str) -> SessionState:
    raw = r.get(f"session:{wxid}:state")
    if raw is None:
        return SessionState.BOT
    return SessionState(raw)

def set_state(wxid: str, state: SessionState):
    r.setex(f"session:{wxid}:state", SESSION_TTL, state.value)

def get_agent(wxid: str) -> str | None:
    """获取当前负责该用户的坐席 ID"""
    return r.get(f"session:{wxid}:agent")

def assign_agent(wxid: str, agent_id: str):
    r.setex(f"session:{wxid}:agent", SESSION_TTL, agent_id)

会话状态流转只有三条主路径:

  1. BOT → QUEUE:用户触发"转人工"关键词
  2. QUEUE → HUMAN:坐席主动接单
  3. HUMAN → BOT:坐席挂起会话或超时未操作(自动归还机器人)

需要注意的是,QUEUE 状态期间仍需要定期给用户发送等待提示,避免用户以为消息发送失败。可以用定时任务扫描所有处于 QUEUE 状态的会话,超过 3 分钟没有坐席接入时主动推送一条"客服正在赶来"的安抚消息。


四、智能应答:三层匹配策略

单纯靠关键词匹配覆盖率太低,纯 LLM 又容易瞎说价格政策。推荐"精确关键词 → FAQ 相似度 → LLM 兜底"三层结构。

4.1 第一层:关键词精确匹配

python# 关键词配置,可从数据库或 YAML 加载
KEYWORD_RULES = {
    ("退款", "退钱", "退货"): "您好,退款申请请提供订单号,我们将在 1-3 个工作日处理。",
    ("发货", "快递", "物流"): "订单发货后会短信通知,一般 1-2 天内发出。",
    ("人工", "真人", "客服"): "__TRANSFER__",   # 特殊标记,触发转人工
}

def match_keyword(content: str) -> str | None:
    for keywords, reply in KEYWORD_RULES.items():
        if any(kw in content for kw in keywords):
            return reply
    return None

关键词规则建议存储在数据库或配置文件中,方便运营人员随时维护,不需要重启服务。同一个回复模板可以支持多个触发词,覆盖用户的不同表达习惯。

4.2 第二层:FAQ 向量检索

适合问题措辞多变但语义相近的场景,比如"怎么改地址""我要换收货地址"本质是同一问题。

python# 伪代码示意,向量库可用 faiss、milvus、pgvector 等
# 实际实现需先离线把 FAQ 问题向量化存入向量库

def match_faq(content: str, threshold: float = 0.85) -> str | None:
    """
    1. 将 content 向量化
    2. 在 FAQ 向量库中做近邻检索
    3. 相似度 >= threshold 则返回对应答案
    """
    vec = embed(content)                     # 调用向量化模型
    results = faq_index.search(vec, top_k=1)
    if results and results[0].score >= threshold:
        return results[0].answer
    return None

向量化模型可以选择开源的 text2vec-base-chinese 或调用在线 Embedding API,FAQ 库的更新只需重新向量化并写入向量库,不影响线上服务。相似度阈值建议从 0.85 开始调,实际运营中可以根据误召回率和漏召回率情况微调。

4.3 第三层:LLM 兜底

前两层都没命中时,调用大模型生成回复,但要用 system prompt 把它约束在业务范围内:

pythonimport openai  # 或其他 LLM SDK

SYSTEM_PROMPT = """
你是一个电商客服助手,只回答与订单、商品、退换货相关的问题。
如果用户问的内容与业务无关,礼貌说明你只能解答购物相关问题。
不要自行承诺具体时间或金额,涉及金额纠纷时引导用户联系人工客服。
"""

def llm_reply(content: str) -> str:
    resp = openai.chat.completions.create(
        model="gpt-4o-mini",
        messages=[
            {"role": "system", "content": SYSTEM_PROMPT},
            {"role": "user",   "content": content},
        ],
        max_tokens=300,
    )
    return resp.choices[0].message.content.strip()

LLM 兜底层需要关注两个风险:一是大模型有时会编造不存在的政策(幻觉),建议在 system prompt 中明确列出禁止承诺的内容;二是响应延迟,一般在 1-3 秒之间,可以先发一条"正在为您查询…"的占位消息,避免用户等待时认为系统无响应。


五、转人工逻辑

转人工是客服机器人的核心能力之一,需要考虑以下几个场景:

pythonTRANSFER_TRIGGERS = {"人工", "真人", "客服", "投诉", "举报"}
MAX_BOT_TURNS     = 5   # 连续机器人回合上限

def get_bot_turns(wxid: str) -> int:
    val = r.get(f"session:{wxid}:bot_turns")
    return int(val) if val else 0

def incr_bot_turns(wxid: str):
    key = f"session:{wxid}:bot_turns"
    r.incr(key)
    r.expire(key, SESSION_TTL)

def reset_bot_turns(wxid: str):
    r.delete(f"session:{wxid}:bot_turns")

def needs_transfer(content: str, wxid: str) -> bool:
    """判断是否需要转人工"""
    if any(trigger in content for trigger in TRANSFER_TRIGGERS):
        return True
    if get_bot_turns(wxid) >= MAX_BOT_TURNS:
        return True
    return False

def transfer_to_human(wxid: str):
    """将会话切换到等待人工状态,并通知坐席"""
    set_state(wxid, SessionState.QUEUE)
    reset_bot_turns(wxid)
    notify_agents(wxid)   # 通过 WebSocket 或钉钉/企业微信推送给坐席
    return "已为您转接人工客服,请稍等,坐席会尽快接入。"

转人工通知坐席的方式需要根据团队工具选择:小团队可以直接推送到企业微信群或钉钉群,规模较大的团队建议搭配坐席后台(带排队、接单、挂起功能),避免多个坐席同时接入同一个用户。


六、主流程组装

把前面各模块串起来,形成完整的消息处理入口:

pythonfrom flask import Flask, request, jsonify

app = Flask(__name__)

@app.route("/wechat/callback", methods=["POST"])
def wechat_callback():
    msg  = request.json
    wxid = msg.get("fromWxid", "")
    text = msg.get("content", "").strip()
    mtype = msg.get("type", 0)

    # 只处理文本消息
    if mtype != 1:
        return jsonify({"code": 200})

    state = get_state(wxid)

    if state == SessionState.HUMAN:
        # 人工模式:转发给坐席,不自动回复
        forward_to_agent(wxid, text)
        return jsonify({"code": 200})

    if state == SessionState.QUEUE:
        # 排队中
        send_text(wxid, "正在为您排队,请耐心等待...")
        return jsonify({"code": 200})

    # BOT 模式处理
    if needs_transfer(text, wxid):
        reply = transfer_to_human(wxid)
        send_text(wxid, reply)
        return jsonify({"code": 200})

    # 三层应答
    reply = (
        match_keyword(text)
        or match_faq(text)
        or llm_reply(text)
    )

    send_text(wxid, reply)
    incr_bot_turns(wxid)
    return jsonify({"code": 200})

# 代码为示例,具体接口/字段以官方文档为准
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8080)

七、7×24 稳定运行的注意事项

机器人能跑起来是第一步,跑稳才是重点。以下几点是生产环境必须处理的:

7.1 微信在线维护

7.2 回调服务高可用

用户消息 → 负载均衡 → 多实例回调服务
                          │
                          └─ Redis(共享会话状态)
                          └─ 消息队列(削峰)

回调接口必须快速返回 200,把实际处理逻辑丢进消息队列(Celery / RQ / Kafka 均可),避免处理慢导致平台重复推送。高峰期间消息队列可以起到削峰作用,防止 LLM 接口并发过高导致超时。

7.3 监控告警

指标阈值参考告警动作
回调接口响应时间P99 > 2s钉钉告警
微信掉线任意实例立即通知人工
转人工队列积压> 20 条通知调度员加班
LLM 接口错误率> 5%降级到兜底话术

7.4 内容安全


小结

搭建微信客服机器人的难点不在于单个技术点,而在于把消息通道、状态管理、多层应答、转人工这几个模块正确地串联起来。常见的踩坑点包括:回调接口响应慢导致消息丢失、会话状态没有持久化导致重启后行为异常、LLM 回复越界承诺引发客诉。建议先以最小化实现上线,用真实用户数据验证关键词库的覆盖率,再逐步引入向量检索和大模型能力,分阶段降低人工介入比例。


总结

微信客服机器人的核心是三件事:稳定的消息通道、清晰的会话状态机、合理的人机协作边界。把关键词匹配、FAQ 向量检索、LLM 兜底三层串起来,配合转人工阈值控制,就能在降低人力成本的同时保持服务质量。

想动手试试?

WechatApi 提供扫码登录、消息收发、好友与群管理等 REST 接口,注册后几分钟跑通。

立即免费注册查看开发文档

相关产品页

🔗 微信机器人开发(产品页)🔗 微信客服机器人(产品页)🔗 微信群管理机器人(产品页)

相关文章

30 分钟做一个微信自动回复机器人(完整实战)微信机器人接入 GPT,实现智能自动回复微信群管理机器人开发实战:自动迎新、答疑、踢人微信机器人自动加好友、自动通过好友实战(含防封频率)
© 2025 WechatApi · 企业级微信智能机器人接入平台
官网价格帮助文档博客
苏ICP备2024128799号 · 苏ICP备2023038368号