在构建 WhatsApp 聊天机器人时,单次消息响应往往不足以满足复杂业务需求。用户可能在多问轮中逐步补充信息,也可能在对话中切换意图。如果没有一套可靠的上下文管理机制,机器人容易出现答非所问、重复提问、状态丢失等问题。本文结合 WhatsApp 消息特点,分享一种多轮对话上下文管理方案的设计与落地经验。

一、为什么上下文管理是核心能力

WhatsApp 作为即时通讯工具,用户习惯以自然语言连续表达。例如:

  1. 用户先问:“你们的系统支持群发吗?”
  2. 接着问:“一天能发多少条?”
  3. 再问:“怎么收费?”

第二句和第三句都省略了主语,但人类客服可以自然理解。聊天机器人如果没有上下文,就会把它当作三条独立的问题分别回答,体验割裂。

上下文管理的核心价值在于:

  • 保持对话连贯性:让机器人在多轮交互中记住用户状态、意图和已收集字段。
  • 减少重复提问:避免已经确认过的信息反复询问。
  • 支持复杂任务流:如表单填写、订单查询、售后服务等需要多步推进的场景。
  • 提升转化率与满意度:在客户管理场景中,流畅的对话体验直接影响用户对产品的信任。

二、上下文数据结构的设计

上下文本质上是一个会话状态机。我们为每个 WhatsApp 会话维护一个独立的上下文对象,核心字段包括:

class ChatContext:
    def __init__(self, session_id: str, phone: str):
        self.session_id = session_id          # 会话唯一标识
        self.phone = phone                    # 用户 WhatsApp 号码
        self.intent = None                    # 当前意图
        self.entities = {}                    # 已提取的实体
        self.history = []                     # 最近消息历史
        self.turn_count = 0                   # 当前轮数
        self.last_active_at = time.time()       # 最后活跃时间
        self.completed = False                  # 当前流程是否完成
        self.metadata = {}                      # 扩展字段,如来源、标签等

其中 history 字段用于保存最近 N 轮消息,通常保留 5 到 10 轮即可。entities 存放已识别字段,例如 {"product": "群发", "volume": "1000"}

在 WADesk 这类 WhatsApp 多账号客户管理系统中,上下文还需要与账号绑定。因为用户可能同时向多个企业账号发送消息,每个会话的上下文必须隔离,避免串号或信息泄露。

三、上下文的生命周期管理

上下文不是永久保存的,需要根据业务规则设定有效期和清理策略:

阶段 触发条件 处理动作
创建 收到用户首条消息 初始化上下文,记录来源账号和手机号
更新 每轮对话结束时 更新意图、实体、历史记录和活跃时间
休眠 超过 10 分钟无交互 标记为休眠,下次唤醒时恢复
过期 超过 24 小时未活跃 归档或清理上下文,释放存储
重置 用户输入"重新开始"等明确指令 清空当前上下文,回到初始状态

清理策略建议采用 TTL + 显式重置相结合的方式。例如:

def should_expire(ctx: ChatContext, ttl_seconds: int = 86400) -> bool:
    return time.time() - ctx.last_active_at > ttl_seconds

def reset_context(ctx: ChatContext):
    ctx.intent = None
    ctx.entities = {}
    ctx.turn_count = 0
    ctx.completed = False
    ctx.history.clear()

合理的过期时间能减少存储压力,同时保证次日用户再次对话时不会携带过时的状态。

四、意图识别与槽位填充

上下文更新的前提是准确理解用户当前意图。常见做法有两种:

1. 基于规则的关键词匹配

适合意图固定、表达相对规范的场景。例如:

INTENT_RULES = {
    "pricing": ["价格", "多少钱", "收费", "费用"],
    "群发": ["群发", "批量发送", "一起发"],
    "试用": ["试用", "体验", "demo"],
    "售后": ["问题", "故障", "用不了", "报错"]
}

def detect_intent(text: str) -> str | None:
    for intent, keywords in INTENT_RULES.items():
        if any(k in text for k in keywords):
            return intent
    return None

这种方式实现简单,但扩展性差,容易被同义词或口语化表达绕过。

2. 基于 LLM 的意图理解

对于表达灵活的场景,可以调用大语言模型进行意图识别和槽位抽取。输入包括当前消息和最近几轮历史,输出结构化的 JSON:

{
  "intent": "pricing",
  "entities": {"product": "群发"},
  "needs_clarification": true,
  "clarification_question": "您指的是哪个功能的收费标准?"
}

结合上下文,模型能更好地识别指代和省略。例如用户只发"多少钱?",模型可以结合上文判断是在问群发功能的价格。

五、多轮对话的状态推进

复杂任务往往需要按流程推进。以客户信息采集为例,流程可以设计为:

  1. 问候与意图确认
  2. 询问行业
  3. 询问团队规模
  4. 询问核心需求
  5. 给出建议并结束

每一轮结束时,根据已填充的槽位决定下一步动作。代码示例:

def next_action(ctx: ChatContext) -> dict:
    if not ctx.intent:
        return {"action": "ask_intent"}
    if ctx.intent == "demo_request":
        if "industry" not in ctx.entities:
            return {"action": "ask", "field": "industry"}
        if "team_size" not in ctx.entities:
            return {"action": "ask", "field": "team_size"}
        if "need" not in ctx.entities:
            return {"action": "ask", "field": "need"}
        return {"action": "complete"}
    return {"action": "fallback"}

这种方式把对话逻辑和回复生成分离,便于后续维护和扩展。WADesk 的消息自动回复模块就采用了类似的状态机设计,支持关键词、AI 和默认回复三级策略。

六、上下文与消息系统的集成

在 WhatsApp 聊天机器人架构中,上下文通常部署在消息网关和回复生成模块之间:

用户消息 → Webhook → 消息网关 → 上下文管理器 → 意图识别 → 回复生成 → 消息发送

上下文管理器负责:

  • 读取当前会话的上下文
  • 根据新消息更新状态
  • 决定下一步动作
  • 将回复和状态更新一起返回

当使用 WhatsApp Business API 时,每条消息都带有 fromid 等字段,可以稳定地作为会话标识。需要注意不同消息类型的处理,例如文本、图片、语音、按钮回复等,都可能影响上下文状态。

七、常见问题与踩坑

1. 并发消息导致状态冲突

用户可能连续发送多条消息,或 Webhook 重试导致同一轮消息被处理多次。解决方法包括:

  • 使用消息 ID 去重
  • 在更新上下文时加锁或采用乐观锁
  • 限制单轮处理窗口,避免高频覆盖

2. 上下文膨胀

长期保存所有历史消息会导致查询变慢。建议:

  • 只保留最近 N 轮摘要
  • 定期归档历史到独立表或日志系统
  • 对过期上下文进行清理

3. 跨账号状态隔离

在多账号管理场景中,必须确保每个账号的上下文独立。会话 ID 建议包含账号标识和用户标识,例如:

session_id = f"{account_id}:{phone}"

4. 用户主动跳出流程

用户可能突然切换话题。如果上下文过于强势,会强制把新话题拉回旧流程。可以设计一个"意图漂移检测"机制,当新消息与当前意图差异较大时,提示用户是否重新开始。

八、总结

上下文管理是 WhatsApp 聊天机器人从"问答工具"升级为"业务助手"的关键能力。通过合理设计数据结构、生命周期、意图识别和状态推进机制,可以显著提升多轮对话体验。在 WADesk 等 WhatsApp 客户管理系统中,上下文能力与账号隔离、自动回复、快捷回复等模块结合,能够支撑更复杂的客户服务场景。

未来可以进一步探索的方向包括:基于向量的长期记忆、多语言上下文的统一表示、以及上下文与 CRM 客户画像的深度融合。这些能力将帮助企业在外贸和跨境场景中建立更稳定、更智能的客户沟通体系。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐