上一章把机器人环境跑通之后,这一章就该啃词库了。很多第一次接触词库的朋友容易把词库理解成“一堆自动回复的文本”,其实远远不止。词库是机器人的行为逻辑,它决定了机器人看到什么消息就回什么内容、在什么场景下触发什么动作、优先级怎么排、正则怎么匹配、要不要调用接口返回动态数据。这一章我会围绕手机端管理词库这条主线,把文件结构、触发规则、常用语法、高频场景、排错手段和一些维护心得一次性讲清楚。
这章内容比较长,但我建议你边看边动手改,因为词库这种东西光看是记不住的。你装好编辑器、翻到词库目录、亲手改一条词条、再发一条测试消息看它有没有命中,这个过程走一遍,后面所有细节都顺了。
1. 词库不是一堆回复文本,而是机器人的行为逻辑
1.1 没有词库的机器人等于一个空壳
机器人本身只是一个消息收发框架,真正让它“像个人”的,是词库。比如群里有人说“你好”,机器人回一句“你好呀”,这是词库;有人说“查天气 北京”,机器人返回一条天气信息,这也是词库;有人在群里刷屏,机器人提醒“发言频率太快,请冷静一下”,这依然是词库。
所以词库实际承担了三件事:人设、知识库、功能入口。
- 人设:回复的语气、口头禅、表情风格,都由词库里的回复文本决定。
- 知识库:能回答什么问题、能聊什么话题,本质上是词条覆盖范围的集合。
- 功能入口:很多机器人的扩展功能(查天气、查物流、签到、抽签)都需要靠词库里的触发词来“唤起”,词库负责把用户的话术翻译成机器人能执行的命令。
手机端管理词库时,这三件事如果混在同一个文件里,后期维护会非常痛苦。我的习惯是:按功能拆文件,不按人设拆文件。人设相关的词条虽然分散在各个文件里,但命名上统一加“语气”前缀,后面会讲到具体命名方案。
1.2 静态词库、规则词库和接口词库
手机端改词库时,先要判断你正在改的是哪一类词条,因为它们的写法完全不同:
| 类型 | 本质 | 例子 | 维护难度 |
|---|---|---|---|
| 静态词库 | 触发词对应固定回复 | “你好” -> “你好呀” | 低 |
| 规则词库 | 用正则或通配符匹配一类消息 | “今天XX” -> “今天也要加油哦” | 中 |
| 接口词库 | 触发后调用外部数据或脚本 | “天气 北京” -> 返回天气 | 高 |
很多人把规则词库和接口词库混为一谈,其实不是一回事。规则词库是“匹配逻辑”,接口词库是“数据来源”。一条完整的接口词条往往由“触发词 + 参数提取 + 接口调用 + 结果格式化”四部分组成,词库能写好的只是触发词和格式化部分,接口调用得靠框架的扩展模块提供。
在第二章这个阶段,我建议你先吃透静态词库和规则词库,接口词库放到下一章讲。我的理由是:静态词库打底,规则词库练正则思维,这两个都熟了,接口词库只是加一层“取数据”的动作,水到渠成。
1.3 手机端管理词库和电脑端到底差在哪
电脑端管理词库,直接打开文件、搜索、批量替换、用本地正则工具验证,都很方便。手机端最大的问题是:编辑器弱、路径隐蔽、编码易错、难以批量操作。
我用手机管理词库快两年了,最大的感受是:手机端不是不能做,而是必须建立一套“手机友好”的维护习惯。比如文件名尽量用英文和数字,不搞中文长名字;触发词前后不要留空格;保存时指定UTF-8无BOM;改完立刻在群里发一条测试消息。这些习惯一旦养成,手机端管词库的速度并不比电脑端慢很多。
接下来的内容全部以“手机端操作”为主线,但原理部分同样适用于电脑端,你对照着自己的环境看就行。
2. 文件结构与触发规则:先把手机端的目录布局弄清楚
2.1 一份词库文件在目录里长什么样
不同框架的词库目录结构略有差异,但核心思路一致。以我用的这套环境为例,词库放在配置目录下的wordLibrary文件夹里,每个.txt文件代表一类词条:
data/ bots/ qq/ wordLibrary/ welcome.txt chat_fun.txt weather.txt guard.txt手机端打开文件管理器后,很多朋友容易迷路,因为这类目录往往藏在应用私有目录或子目录里。我的建议是:先在电脑端登录机器人后台,看词库目录到底在哪个绝对路径下,再用手机文件管理器跳转。不要靠记忆一层层找,安卓文件管理器首页的“快速访问”能省不少时间。
词库文件本身的格式很关键。我用的规则是:一行一条词条,用=>把触发词和回复内容分开。下面是一个简单的例子:
你好=>你好呀,今天心情不错吧 早上好=>早安,新的一天也要元气满满哦有些框架用#做分隔符,有些用固定段落格式。这个没有统一标准,你以自己环境的文档为准。但第二章里我会用=>演示,因为它在手机上更好辨认,不容易把触发词和回复内容看混。
2.2 从消息进来到词条被命中,到底发生了什么
手机端调词库最常犯的错,是不知道机器人为什么没回你。所以你得先理解触发链路。
一条消息进入机器人后,大致会经历这几步:
- 消息到达框架的消息处理器;
- 框架判断消息类型(群消息、私聊、事件);
- 匹配器开始扫描词库文件中的每一行;
- 按优先级顺序逐条尝试匹配触发词;
- 命中某条词条后,取出对应的回复文本;
- 替换回复文本中的变量(如昵称、日期),然后发送。
手机端排错时可以按这个链路倒推:消息有没有到达机器人?有没有匹配到词条?回复有没有被拦截?这三个问题对应三个不同的排查方向。后面第六章我会给一份完整的排错流程。
2.3 触发优先级和群/全局作用域
词库不是“谁先出现谁就命中”的,它有一套优先级规则。不同框架细节不同,但大方向一致:
- 精确匹配优先于模糊匹配;
- 前缀精确匹配优先于包含匹配;
- 事件触发优先于普通文本触发;
- 用户自定义词库优先于框架默认词库;
- 同一词库内,排在前面的词条优先于后面的。
手机端改词库时最要命的场景是:你加了一个“你好”词条,但机器人回的还是旧内容。大概率不是没生效,而是有一条优先级更高的词条“你好呀”先命中了。这种问题肉眼很难发现,我的做法是:新增词条前,先在词库目录里全局搜一遍触发词,看看有没有重复。搜不到再新增。
作用域同样重要。全局词库在所有群里生效,分组词库只对指定群生效,私聊词库只在一对一聊天时生效。很多新人在全局词库里写了“早上好”,又在一个测试群里写了另一条“早上好”,结果测试群里永远只回测试群那份,全局那份好像在“失效”。其实逻辑没毛病,就是作用域优先级在起作用。手机端管多级词库时,文件名一定要写清楚作用域,否则过两周你自己都不记得哪个是哪个。
3. 手机端编辑与上传:编码、命名、换行这类细节能坑掉半天时间
3.1 手机选编辑器要注意什么
我见过不少朋友直接用手机自带的“文本查看器”打开词库文件,看完直接编辑保存,结果机器人那边一片乱码。不是文件坏了,而是编码错了。
词库文件在绝大多数框架里都要求UTF-8 无 BOM编码。手机自带笔记类应用保存时,很可能保存成带 BOM 的 UTF-8,或者更糟糕,保存成本地系统默认编码。带 BOM 的文件在加载时,文件头那几个特殊字节会被当成字符混进第一条词条的触发词里,导致第一条永远匹配不上。
所以手机端首选支持手动选择编码的文本编辑器,不要用系统自带查看器。至少要支持以下三项:
- 打开文件时能显示文件编码;
- 能按 UTF-8 无 BOM 保存;
- 能显示不可见字符(空格、回车),方便排查触发词前后多余空格。
配置完编辑器后,先做一个测试:新建一个只有一行测试=>测试成功的文本文件,保存为 UTF-8 无 BOM,传到词库目录里,让机器人加载,发一条“测试”看是否回复“测试成功”。这一步能确认你的编辑器、传输方式、文件路径全是通的,后面再大批量改就放心了。
3.2 路径导航和手机上传的几种方式
手机上传词库文件,我试过三种方式,按省事程度排序:
- 局域网文件管理:电脑和手机连同一个 WiFi,在机器人框架后台开启文件管理入口,用手机浏览器上传
.txt文件到词库目录。这是最推荐的,路径不容易错。 - FTP/SFTP 工具:在手机装第三方 FTP 客户端,直接连接机器人所在主机的文件服务。适合机器人部署在局域网服务器上的情况。
- 云盘中转:电脑改好文件传到网盘,手机从网盘下载后再放入本地目录。优点是通用,缺点是流程长,而且下载到“下载目录”后还得手动移动,路径容易乱。
我个人强烈建议优先走第一种。因为手机浏览器上传到机器人后台,文件直接就落在正确目录了,不存在“文件管理器找不到目录”的尴尬。
安卓手机自带的文件管理器默认不显示隐藏目录,词库文件夹名字又不带点,还算好找。但如果你在目录里死活找不到wordLibrary,大概率是当前路径不对,而不是文件夹不存在。去机器人后台看一眼实际路径,别瞎猜。
3.3 高频踩坑:UTF-8 BOM、CRLF、中文文件名
手机端改词库翻车主要集中在三个点,我挨个说:
第一个是编码问题。前面说过,UTF-8 带 BOM 会让第一条词条触发词多出不可见字符。判断方法很简单:在文本编辑器里看文件信息,如果显示UTF-8 BOM,就重新保存为UTF-8 无 BOM。部分编辑器显示的是 “UTF-8 with signature”,也是同一个意思。
第二个是换行符问题。很多框架对词库文件的行末换行符敏感,Windows 记事本编辑过的文件容易带 CRLF 换行,而手机上常见的是 LF 换行。有些框架在加载 CRLF 文件时,会在某些词条后面多带一个不可见字符,导致匹配失败。手机端改完文件后,我建议在编辑器里把换行符统一成 LF。这个选项通常在“换行符类型”设置里,选 LF 保存即可。
第三个是中文文件名问题。手机端很方便建中文文件名,但部分框架在读取中文文件名时会出现编码错乱,导致整个文件加载失败。如果你发现“某个文件里的词条全都不生效”,先检查文件名是不是纯中文。我的习惯是:文件名一律用英文小写加数字前缀,例如01_welcome.txt、02_chat_fun.txt,中文说明写在文件里的注释行。
有一个细节容易被忽略:手机输入法会自动补齐标点。你在词库文件里写正则表达式时,输入一个左中括号[,输入法可能自动补一个右中括号],多出来这个字符直接导致正则语法错误。所以手机上写正则,我建议直接关闭“符号自动配对”,或者写完保存前整行检查一遍。
4. 词库语法从入门到够用:精确匹配、正则、随机回复与变量
4.1 基础语法:触发词加回复文本
先别急着上复杂语法,把最基本的写对再说。词库文件每一行是一条规则,用=>分隔触发词和回复:
你好=>你好呀 我回来了=>欢迎回家 晚安=>做个好梦,明天见手机端操作时,最容易出问题的是触发词前后多了空格。比如你复制文本时带上一个空格:
你好=>你好呀看起来没区别,但触发词实际上是你好而不是你好,机器人永远匹配不上。这个问题在手机屏幕上非常难发现,因为空格太隐蔽。所以我一直强调:在文本编辑器里打开“显示空格”选项,一眼就能扫出问题。
另外,触发词不要写太长,不要带标点。手机端一句话触发词,匹配率最高的是 2 到 6 个字的短语。超过 8 个字,用户手一抖打错一个字就没法命中了。
4.2 正则表达式的基本写作方法
词库真正做到“聪明”,靠的是正则。用正则你可以匹配一类消息,而不是一条固定消息。
在我这套词库语法里,以regex:开头的行会被当成正则规则:
regex:^今天天气.*$=>今天天气整体不错,适合出门走走 regex:^我想看(.+)$=>你想看$1对吧,这个我记下了 regex:^连吃个饭都不会吗$=>干饭才是第一生产力正则几个最常用的符号,我用大白话解释一下:
.:匹配任意一个字符。比如今.能匹配“今天”“今晚”“今晚”。*:重复前面的字符任意次。比如.*就是“任意内容”。^:匹配开头。^你好只匹配以“你好”开头的消息。$:匹配结尾。晚安$只匹配以“晚安”结尾的消息。[]:匹配中括号里的任意一个字符。比如[上中下]午能匹配“上午”“中午”“下午”。():捕获分组,把匹配到的内容存起来,方便在回复里引用。|:或。比如你好|您好匹配其中任意一个。
手机端写正则最大的问题是:输入法打反斜杠很麻烦。正则里常用的\d、\s这类转义字符,在手机上切换符号键盘很费劲。我的建议是:固定几个常用正则模板,复制粘贴修改,而不是每次手打。比如匹配数字就用\d+,匹配任意内容就用.*,这两个够应付大多数场景。
4.3 随机回复与占位变量
词库如果每一条都固定回复,机器人会显得很机械。所以几乎所有词库系统都支持随机回复。拟合法的写法有差异,但逻辑相同。我用的写法是在回复内容里放多个选项,用|分隔,加一个随机标记:
你好=>$随机|你好呀|嗨,你来啦|今天想聊点什么 我饿了=>$随机|去吃饭吧|我也饿了,要不一起点外卖|干饭第一注意这里的|是随机分隔符,所以回复内容里本身不要用|,否则会把一条回复拆成两条候选。手机端输入中文时,如果你用的是某种带智能断句的输入法,打完|后可能会自动加空格,保存后随机分隔逻辑就乱了。所以保存前一定检查整行。
变量方面,最常用的是日期、星期、群号、昵称。比如:
今天是$week$=>今天是$week$,好好上班也要记得休息哦 欢迎新朋友$nick$=>欢迎新朋友$nick$,记得看群公告变量名外面是$符号,具体可用变量每个框架不同。手机端调词库时,如果变量名拼错,机器人会直接把原样字符串发出去,比如“欢迎新朋友 $nick$”。所以每次新增变量后,我在心里记一遍完整变量名,不凭记忆缩写。
4.4 用真实词条把语法串起来
语法干讲没意思,我放一组实际在用的词条,你可以直接抄走改:
你好=>你好呀,欢迎来聊天 你好呀=>$随机|你今天气色不错|有什么新鲜事 在吗=>在的,随时可以聊 找谁=>你说,我帮你叫 你是机器人吗=>我是机器人,但今天也可以当你的树洞 你吃饭了吗=>$随机|吃了,你呢|还没,想约饭吗这一组全部是静态词库,加上两条正则,你会发现机器人突然“活”了不少。手机端分批改的时候,建议一次只加 5 到 10 条,加完立刻测试。一次加几十条,如果报错你根本不知道是哪一条出的问题。
5. 几个高频场景的词库写法
5.1 群欢迎和群活跃场景:让机器人融进群体
群欢迎词是词库最常见的场景。但严格来说,欢迎新成员属于“事件触发”,不是普通文本触发。很多框架里这种事件要走专门的事件词库,而不是普通关键词匹配。词条大概长这样:
event:member_in=>欢迎新朋友$nick$,进群先看公告哦普通聊天场景里,高频词条往往围绕群成员日常互动展开。比如“龙王”梗在群里特别常见,就可以放一条:
龙王=>$随机|龙王在此,今日水群谁也别跟我抢|你们先聊,我快交班了|这位龙王大人,请手下留情这种词条没有技术含量,但胜在贴合群氛围。我的经验是:娱乐向词条优先级不要设太高,否则一进群就乱回,容易被群友讨厌。
5.2 咨询查询场景:把用户的话术转成命令
查天气、查物流、查快递这类需求,严格讲不是词库单独能搞定的。词库在这件事里扮演的是“翻译官”,把用户口语化的一句话转成机器人扩展模块能识别的命令。
以天气查询为例,词库里会写:
regex:^天气\s*([\u4e00-\u9fa5]+)$=>weather query city=$1 regex:^查一下(.+)的天气$=>weather query city=$1第一行匹配“天气 北京”,第二行匹配“查一下北京的天气”。两行命中后,触发词后面的内容会作为参数传给天气扩展模块。我在这里不展开接口实现,因为那是下一章的事。但你要记住:词库要做的是一句话翻译成命令,不要期望它自己去取数据。
手机端写这类带参数的正则时,注意中文字符范围。上面例子里的[\u4e00-\u9fa5]是中文匹配的通用写法,但不同框架的正则引擎对 Unicode 的支持程度不一样。如果发现“天气北京”命中不了,先确认是不是\u4e00这种写法不被支持,改成.也可以。
5.3 安全合规提醒类词条:必须写但容易忽略
词库不光是用来聊天搞笑,也该承担一部分“安全看门”的职责。比如群内如果有人发广告、发不当内容,词库可以命中并给出提醒。但这类提醒词条有个大坑:不要写得太阴阳怪气,也不要直接怼人。比如:
regex:.*加微信.*=>请勿在群里发布引流信息,合作请私聊群主 regex:.*代开发票.*=>该内容可能涉及违规广告,已提醒管理员留意这类词条本质上不是“骂人”,而是“守护群聊环境”,所以回复语气要中立克制。手机端维护这类词条时特别注意:触发词里不要包含具体个人任何信息,也不要写可能引发争议的内容,宁可漏判,不要误伤。
还有一个很关键的原则:不要在词库里存放任何隐私内容。词库加载后,每个群成员都有可能通过触发词间接看到回复,把敏感信息写进词库等于把秘密贴到了公告栏。这条务必记住。
6. 调试和排错:机器人没回复时,你该按什么顺序查
6.1 手机端日志怎么看
词库加载和匹配的日志一般会输出到机器人运行目录下的logs文件夹。手机端查看日志,我通常用文本编辑器直接打开当天的日志文件,关键字搜“命中”或“matched”。不同框架日志格式不同,但关键字都差不多。
如果你连日志在哪个目录都找不到,回后台设置页面翻一下“日志目录”,别自己猜。有些框架支持在手机浏览器后台直接查看实时日志,那种更省事。
手机屏幕看日志有个技巧:拉到最后几条,从下往上读。因为最新发生的匹配记录都在文件尾部,从头看会被无关信息淹没。
6.2 完整的排查链路:从消息到回复的逐个检查
很多朋友遇到“机器人不回消息”就一脸懵,其实按链路排查非常快。我按优先级排了一遍:
- 机器人本身在不在线?先随便发一条固定的系统命令,比如
查看状态,确认机器人进程没有挂。如果压根没收到任何东西,就不是词库问题。 - 消息是否进入匹配器?看日志里有没有收到这条消息。连日志里都没有,说明消息被上层拦截了,可能是群设置或权限配置问题。
- 是否有词条命中?搜日志里的触发词,看有没有匹配记录。没有命中记录,去检查词库文件编码、文件是否加载、触发词是否前后带空格。
- 命中后有没有回复?如果日志显示命中但没发出去,看回复文本里变量是否正确,看是否触发了发言频率限制,看是不是被管理员权限覆盖。
- 优先级是否被抢占?如果命中了一条,但不是你想要的那条,检查全局词库和分组词库的优先级设置。
这套流程在手机端也能走,只是你需要在文件管理器和日志之间来回切换。但我建议你第一次排错时老老实实走一遍完整流程,比瞎改词库快得多。
6.3 改词库前的备份和恢复
手机端改词库比电脑端更容易误操作,因为屏幕小、编辑区显示不全,很容易把一整行内容删掉而不自知。所以备份不是可选步骤,是必选步骤。
我改任何词库文件之前,都会复制一份原文件到同级目录,文件名加一个.bak后缀。万一改乱了,直接删掉当前文件,把.bak复制回原名,一条命令都不用敲。
如果连.bak都没弄,框架后台一般也会自动生成若干天前的备份。去找“备份”目录,按时间恢复最近一份即可。这里提醒一句:恢复备份后一定要重启加载词库,否则旧文件不会自动生效,你会以为备份也坏了。
手机端恢复备份还有一个细节:.bak文件复制回原名后,检查一下文件编码,因为有些复制过程会把编码改掉。用你前面设置的编辑器重新确认一下编码和换行符,再加载。
7. 进阶心得:如何设计一套别人维护起来不骂你的词库
7.1 用文件名和注释管理词库
词库文件多了以后,最怕的情况是“看着文件名不知道里面是什么”。所以我推荐一套命名法,目前我一直在用:
- 数字前缀表示模块顺序;
- 英文小写表示用途;
- 作用域写在文件名末尾。
举个例子:
01_welcome_global.txt 02_chat_fun_global.txt 03_weather_cmd_global.txt 04_guard_group1.txt这样无论谁打开目录,一眼就能看出这个文件是干什么的、影响哪些群。手机端文件排序按名称排列时,数字前缀还能保证文件按顺序排好,不会有“chat”跑到“welcome”前面的情况。
文件内部的注释也很重要。注释行写法各框架不同,一般是以#或//开头。我会在文件头部写三行注释:
# 文件功能:群欢迎词 # 维护人:me # 最后更新时间:2025-02-01手机端不在电脑上,维护人的信息尤其重要。一个人维护还好,一旦多个人维护,你看到一条不生效的词条时,能通过注释定位到“上一次谁改的、什么时候改的”,省一大圈时间。
7.2 兜底回复和触发词去重
机器人最尴尬的状态是“冷不丁收到一条消息,然后沉默”。为了避免冷场,我建议在最后一个词库里加一条兜底回复:
regex:.*=>$随机|嗯嗯,收到|我在呢|这个话题我有点接不住,你换个话题吧注意这条正则匹配所有消息,所以只适合放在一个作用域的最底部,或者放在优先级最低的词库文件里。你要是把这个放在最上面,那所有其他词条全部失效。手机端非常容易犯这个错,因为你在文件末尾加一行是最顺手的位置,但它其实影响全局。
去重逻辑前面提过一次,这里再加强调。新增词条前,先在词库目录里全局搜一遍触发词。手机端如果没有全局搜索功能,就一个个打开txt文件用编辑器自带搜索。这一步确实麻烦,但能避免“两条词条互相打架”的玄学问题。
7.3 性能和规模:手机端词库别贪大
手机端管词库,文件太多、正则太复杂,最终会导致两件事:加载变慢和匹配变慢。机器人每收到一条消息,都要把规则过一遍。规则越复杂,消耗越大。
我的经验是:正则规则控制在 50 条以内,静态词条控制在 500 条以内。超出这个规模,大部分问题不是功能不够,而是你该停下来想想匹配逻辑能不能简化。比如大量.*开头的正则,能改成前缀精确匹配就改;大量相似触发词,能合并成正则就合并。手机上编辑慢,所以高效表达比堆量更重要。
最后说一句实在话:手机端管理词库不是最优解,但它胜在方便。你在地铁上、午休时,掏出手机就能改词条,这个生产力是不可替代的。所以别觉得“手机改词库是临时方案”,把它当成一种正经的维护方式,前面说的那套习惯都做到位,体验不会比电脑差多少。
我自己的习惯是每次改完词条后,都会在测试群里发一条触发消息,确认回复正确才放下手机。热重载通常秒级生效,如果没生效就手动重载一次,千万别直接杀进程,杀进程在手机端经常把词库目录权限搞乱,得不偿失。