
关键词触发是最基础的机器人功能——用户发菜单返回菜单发客服转人工。单个关键词好办关键词一多问题就来了——匹配效率下降、一个消息命中多个词、触发结果不稳定。本文讲关键词触发的三个关键点匹配算法、优先级冲突、动作编排。一、匹配算法选型关键词规模决定算法。几十个关键词直接遍历列表逐个判断包含关系就够了简单可靠。上千个关键词遍历就有性能问题——每条消息都要跑上千次字符串比较消息量一上来CPU吃不住。这时候要用Trie树或AC自动机一次扫描消息文本就能命中所有关键词。还有一层是模糊匹配。用户输入往往不规范——该发菜单发成菜单呢菜单位置严格相等匹配就漏了。用包含匹配关键词是消息的子串即命中能覆盖大部分情况。同义词也要处理——客服人工找个人指同一件事做同义词归并成同一个触发词。关键词匹配和消息接收的接口在 Eyun 开发文档 中有对应说明。二、优先级与冲突解决一条消息可能命中多个关键词。用户发客服电话多少同时命中客服和电话。两个关键词对应两个不同的动作先执行哪个必须定规则否则触发结果随机用户体验不稳定。优先级规则按这个顺序定精确匹配优先于包含匹配长关键词优先于短关键词专属关键词优先于通用关键词。规则定完要落成配置不能靠代码里的书写顺序决定书写顺序一改行为就变。触发条件和动作配置的接口在 Eyun 开发文档 中有对应能力。三、命中动作编排关键词命中后执行动作——回复固定文本、转人工、调业务接口。动作可以是多个串联比如先回复正在为你转接再触发转人工。动作要有超时和失败处理。调外部接口的动作可能超时超时后要有降级回复不能用户发了消息机器人没反应。动作执行结果要记录方便排查为什么这次触发没生效。关键词触发方案对照关键词规模匹配算法复杂度适用场景几十个遍历包含简单基础功能上千个Trie/AC自动机中等高频消息含同义词归并包含中等用户口语化关键词触发与优先级实现class KeywordTrigger: def __init__(self): self.keywords [] # [(关键词, 动作, 优先级)] self.synonyms {} # 同义词映射 def normalize(self, text): # 同义词归并统一成标准词 for alias, std in self.synonyms.items(): if alias in text: text text.replace(alias, std) return text def match(self, text): # 匹配收集所有命中词 text self.normalize(text) hits [] for kw, action, priority in self.keywords: if kw in text: # 包含匹配 hits.append((len(kw), priority, kw, action)) if not hits: return None # 优先级长词优先再按配置优先级 hits.sort(keylambda x: (-x[0], -x[1])) return hits[0] # 取最高优先级 def trigger(self, msg): result self.match(msg.content) if not result: return None # 无命中正常处理 _, _, kw, action result return self.execute(action, msg) def execute(self, action, msg): # 动作编排可串联多个动作 for act in action[steps]: try: if act[type] reply: send_wechat(msg.wxid, act[content]) elif act[type] transfer: self.to_human(msg) elif act[type] api: self.call_business_api(msg, act[params]) except TimeoutError: send_wechat(msg.wxid, 处理超时请稍后重试) return timeout # 超时降级 except Exception as e: self.log_action_error(msg, act, e) return error return ok def register(self, keyword, action, priority0): # 注册关键词和动作 self.keywords.append((keyword, action, priority))落地建议匹配算法按规模选——几十个关键词遍历够用上千个必须上Trie或AC自动机。模糊匹配要处理——包含匹配覆盖口语化输入同义词归并避免漏触发。优先级要定规则——精确优先、长词优先规则落配置不靠书写顺序。动作要能降级——外部接口超时给降级回复不能用户发消息没反应。微信侧的消息接收和发送由Eyun这类个人微信API平台 提供匹配算法和动作编排在自建服务实现接口字段以平台开发文档为准。