
微信机器人处理单轮对话够了——问一句答一句不需要记前面说过什么。处理连续对话就不行——用户先问这个面膜多少钱再问有货吗第二句的有货吗指代的是第一句的面膜不记上一轮就无法理解。连续对话的核心不是记住所有历史是管理好上下文窗口——决定进上下文什么、淘汰什么、超载时怎么降级。上下文管理做不好要么信息缺失导致理解错误要么信息过载导致推理质量下降。一、上下文窗口管理——进什么留什么淘汰什么上下文窗口不是越大越好。把所有历史对话塞进上下文模型推理质量会下降——无关信息干扰判断重要信息被稀释。窗口管理的核心是选择性保留进上下文的信息分三类关键实体讨论的商品、涉及的订单、决策状态用户在评估阶段还是决策阶段、未解决问题用户问了但没答完的。淘汰策略按信息类型分级。闲聊内容最早淘汰——你好谢谢不携带业务信息。已完成的话题次早淘汰——问完价格转去问物流了价格话题可以淘汰。关键实体和未解决问题最后淘汰——即使用户切换话题前面提到的商品ID、订单号要保留用户可能随时回来。上下文加载和会话历史查询的接口在 Eyun 开发文档 中有对应支撑。二、跨轮指代消解——它这个那个指代什么连续对话里用户大量使用指代——它多少钱这个有货吗那个能退吗。指代消解是把指代词还原为指代对象——它指代上一轮的面膜这个指代当前选中的商品那个指代之前讨论过但已切走的订单。指代消解做不好模型理解的它和用户说的它不是同一个东西回答南辕北辙。工程实现是实体追踪指代映射。实体追踪——每轮对话中提到的实体都登记到实体表记录首次出现的位置和上下文。指代映射——遇到指代词时从实体表中找最近提及且语义匹配的实体。映射优先级是当前话题实体 上一轮实体 更早的实体。指代消解依赖实体追踪的质量——实体没追踪到指代词无处可映射。会话实体追踪和上下文管理的接口在 Eyun 开发文档 中有对应能力。三、话题切换检测——什么时候可以淘汰旧上下文连续对话中用户会切换话题——先聊面膜再聊手机。话题切换检测决定旧话题的上下文何时可以淘汰。检测信号有三个话题关键词完全不同从面膜到手机、显式切换词对了另外换个话题、长时间间隔后再发言超1小时可能换了话题。话题切换的上下文处理不是全量清空——旧话题的关键实体保留用户可能切回来但旧话题的决策状态淘汰评估状态不延续到新话题。检测做不好会导致两类问题检测过敏感——用户插了一句闲聊就被判定切换上下文被错误清空检测过迟——用户明显换了话题旧上下文还留着干扰推理。上下文管理三环节对照环节处理对象淘汰策略留存原则窗口管理历史对话闲聊先淘汰关键实体最后淘汰指代消解指代词无映射时澄清当前话题优先话题切换话题边界状态淘汰实体留支持切回旧话题上下文窗口管理与指代消解实现class ContextWindow: def __init__(self): self.entities {} # 实体追踪表 self.messages [] # 上下文消息列表 self.topic None # 当前话题 def update(self, raw): if self.is_topic_switch(raw): # 话题切换检测 self.evict_state() # 淘汰旧状态留实体 ents self.extract_entities(raw) for e in ents: self.entities[e.id] e # 实体追踪 resolved self.resolve_pronouns(raw) self.messages.append(resolved) if len(self.messages) self.MAX: self.evict_chitchat() # 窗口超载先淘汰闲聊 def resolve_pronouns(self, raw): for pron in raw.pronouns: target self.find_entity(pron, self.topic) if target: raw.bind(pron, target) # 绑定指代 else: raw.mark_clarify(pron) # 无映射需澄清 return raw def is_topic_switch(self, raw): if raw.has(对了|另外|换个): # 显式切换词 return True return self.topic and not self.topic.overlap(raw.keywords)落地建议上下文窗口别贪大——窗口越大推理质量越不稳定选择性保留比全量塞入更有效。指代消解依赖实体追踪先把实体追踪做扎实——实体没追踪到指代词无处可映射。话题切换检测宁迟勿早——误判切换导致上下文错误清空比迟判多留几轮的代价高。微信侧的会话上下文加载、实体追踪和消息历史查询由Eyun这类个人微信API平台 提供上下文窗口管理和指代消解在自建服务实现接口字段以平台开发文档为准。