本文主要目的是插件思路分享与讨论,也许更适合有python编写经验的人观看

前言

此节含有强烈的个体特色,俗称私货

一直想给骰娘接入语言大模型,奈何钱包不允许。

deepseek出来后,看着api的价格,又动起了对接骰娘的念头,也引发了思考:骰娘应该在什么时候生成回复?接入deepseek是为了达到什么样的效果?

经过思考,终于得出了结论:(基本就是私货)

  • 除测试外不需要白名单,故回复频率不能太高

  • 不能影响作为主业的跑团

  • 被喊到的时候、或是被发言引起兴趣的时候才会生成回复

第一第二点都可以通过软件流程实现,难度不高,重点在于第三点。

希望是骰娘能像有“独立的人格”一样,在跑团时不多嘴影响跑团,在团外能够回应用户的吐槽,作为跑团的一份子更为人格化。

似乎最好的方法还是让骰娘自己判断发言是否和自己有关,但是这也决定了门槛不会太低。

实现的方法

基于上一节,要实现让骰娘自己判断发言是否和自己有关,可以有以下方法:

  • 关键词匹配

通过设置与骰娘名字相关的关键词或短语,当群聊内容中包含这些关键词时生成回复。

单独使用这个似乎显得过于简单,一点都不酷,而且简单的关键词匹配容易在不应该回复的场合生成回复,影响跑团。

  • 使用 deepseekapi 判断

专门写一份让 deepseek 判断发言是否与骰娘有关的 prompt,每次收到回复即调用。

钱包不同意。

  • 文本分类

使用文本分类模型,分析用户发言的语义,判断是否与骰娘相关。

需要一定量的数据进行训练,而且需要考虑模型推理硬件性能要求与响应速度。

而文本分类模型又有两种选择:fastTextBERT模型。

  • 1. fastText算法

fastText是一个快速文本分类算法,适合大规模数据集。用于文本分类任务配置要求低,响应快而精度高。

测试发现响应确实快,但是对于我所能提供的小规模数据集来说,效果很不理想,放弃。

  • 2. BERT模型

BERT(Bidirectional Encoder Representations from Transformers)是NLP领域的里程碑,可通过微调快速适应新任务,但是训练和推理需要大量计算资源,模型参数量大,内存需求高。

租了张4090d训练,发现训练几分钟就能练上百轮,部署于本地(CPU环境)后所用硬件资源比想象的少的多,响应速度也没比fastText慢多少。


最终采用BERT模型来进行文本分类任务,输入用户发言,输出该发言是否与骰娘有关。

训练过程见此博客

测试于2c2g的轻量应用服务器上推理模型,模型占用内存约1g,即使在多条消息并发请求处理时cpu占用也不超过20%

数据集准备

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

随着公开测试进行,记录下来的日志进行格式转换后修正一下,又能作为新的训练数据,慢慢数据越来越多,效果也越来越好。

这里是我到目前版本训练所使用的数据集。

效果展示

插件收到用户发言会先调用BERT模型,判断是否需要进行回复,是则调用deepseekapi生成回复。

一些小问题

说到底,什么样的发言才是 “被喊到、或是被发言引起兴趣” 并没有一个标准。但是训练数据都是人工打标的,所以训练出来的模型自然也就是按照骰主心中的标准进行分类的,效果好不好也都是看骰主自己认为。

也许模型就是这样罢。

另外,我在插件测试阶段选择保守一些,在调用BERT模型前会先进行关键词检测,如果检测到骰娘称呼才会调用,这也导致有时看起来反而像是“只要在发言前面带有骰娘称呼,骰娘就会回应”的简单关键词检测方式。

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

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

说点什么吧...