本文主要目的是插件思路分享与讨论,也许更适合有python编写经验的人观看
前言
一直想给骰娘接入语言大模型,奈何钱包不允许。
deepseek出来后,看着api的价格,又动起了对接骰娘的念头,也引发了思考:骰娘应该在什么时候生成回复?接入deepseek是为了达到什么样的效果?
经过思考,终于得出了结论:(基本就是私货)
第一第二点都可以通过软件流程实现,难度不高,重点在于第三点。
希望是骰娘能像有“独立的人格”一样,在跑团时不多嘴影响跑团,在团外能够回应用户的吐槽,作为跑团的一份子更为人格化。
似乎最好的方法还是让骰娘自己判断发言是否和自己有关,但是这也决定了门槛不会太低。
实现的方法
基于上一节,要实现让骰娘自己判断发言是否和自己有关,可以有以下方法:
通过设置与骰娘名字相关的关键词或短语,当群聊内容中包含这些关键词时生成回复。
单独使用这个似乎显得过于简单,一点都不酷,而且简单的关键词匹配容易在不应该回复的场合生成回复,影响跑团。
专门写一份让 deepseek 判断发言是否与骰娘有关的 prompt,每次收到回复即调用。
钱包不同意。

使用文本分类模型,分析用户发言的语义,判断是否与骰娘相关。
需要一定量的数据进行训练,而且需要考虑模型推理硬件性能要求与响应速度。
而文本分类模型又有两种选择:fastText
与BERT
模型。
fastText
是一个快速文本分类算法,适合大规模数据集。用于文本分类任务配置要求低,响应快而精度高。
测试发现响应确实快,但是对于我所能提供的小规模数据集来说,效果很不理想,放弃。
BERT(Bidirectional Encoder Representations from Transformers)
是NLP领域的里程碑,可通过微调快速适应新任务,但是训练和推理需要大量计算资源,模型参数量大,内存需求高。
租了张4090d训练,发现训练几分钟就能练上百轮,部署于本地(CPU环境)后所用硬件资源比想象的少的多,响应速度也没比fastText
慢多少。
最终采用BERT
模型来进行文本分类任务,输入用户发言,输出该发言是否与骰娘有关。
训练过程见此博客。
—
测试于2c2g的轻量应用服务器上推理模型,模型占用内存约1g,即使在多条消息并发请求处理时cpu占用也不超过20%

数据集准备
通过测试群聊的数据收集和自己瞎编,收集到了几百条数据进行训练,测试效果还算不错。

随着公开测试进行,记录下来的日志进行格式转换后修正一下,又能作为新的训练数据,慢慢数据越来越多,效果也越来越好。
这里是我到目前版本训练所使用的数据集。
效果展示

插件收到用户发言会先调用BERT模型,判断是否需要进行回复,是则调用deepseekapi生成回复。
一些小问题
说到底,什么样的发言才是 “被喊到、或是被发言引起兴趣” 并没有一个标准。但是训练数据都是人工打标的,所以训练出来的模型自然也就是按照骰主心中的标准进行分类的,效果好不好也都是看骰主自己认为。
也许模型就是这样罢。
另外,我在插件测试阶段选择保守一些,在调用BERT模型前会先进行关键词检测,如果检测到骰娘称呼才会调用,这也导致有时看起来反而像是“只要在发言前面带有骰娘称呼,骰娘就会回应”的简单关键词检测方式。

不过大部分时候表现还是挺好的,(骰主认为)不该回复的不会回复。

训练相关代码在这,插件文件过两天有空发。