iris是谁?
iris
是一位由MeteorCollector
独立开发的QQ机器人,采用Mirai
内核,Mirai.Net
框架。她的名字来源于人造卫星“铱星”以及著名的反射星云NGC 7023
(鸢尾花星云)。(南哪是二源的,iris
的名字也是二源的,这很合理)在开发期间,iris
的功能以及指令架构设计都很大程度地受到了金立猫
的QQbotLvory
的影响(根本就是镜像级别的啊)。
假如在iris
在场时键入iris -h
,她会自己交代出目前实装的功能。例如,现在帮助文档的版本是:
大家好,我是 iridium,简称 iris,
现在还是一个简单到不能再简单的机器人,并没有加很多功能。
唤起 iris 的指令均以 iris 或者 Iris 开头(不要看错我的名字凹!)
可以发送 'iris 发' 来让iris 发送消息。目前这一类指令只有 'iris 发 土豆' 会有有意义的反馈出现。
可以发送 'iris 填字 xxx' 来让iris随机填字,目前支持把N替换为随机数字,把A替换为随机一级汉字,把B替换为随机二级汉字,把W X Y Z替换成统一的随机一级汉字。填字内容完全随机,不代表iris本人立场哦~
我可以胡乱地回答一些一般疑问句,答案取决于我的心情,不要当真哦。句子结构形如 '...是/会/能/可以/应该/有...吗?' 的我都有可能回答。
如果有其他功能需求,威逼作者添加应该就可以了吧。
差不多就是这些了,祝大家开心。
“土豆”是一只可爱小猫的名字,也就是说iris 发 土豆
指令可以获取到猫猫表情包。
关于天文竞赛功能,运行iris 天竞 -h
可以获取到更多信息:
欢迎参加由iris主持的天文知识竞赛~!
每一场竞赛最多容纳5位选手,共10题;
输入 'iris 天竞' 开始一场新的知识竞赛;
输入 'iris 天竞报名' 进行报名;
每一道题,每位选手有且仅有一次回答机会,首名答对出现或者全部参赛选手答完后进行下一题,共十题,答对加五分,答错倒扣五分;
'iris 天竞 开始比赛' 可以直接开始比赛(在不满员的情况下也适用);
'iris 天竞 终止比赛' 强制终止一场进行中的知识竞赛;
'iris 天竞 -h' 会让我输出这一条帮助信息。
祝大家玩得开心!
这就是iris
全部的主要功能了。另外的隐藏功能包括:“填字”中将Q替换为随机地级市名称,R和S替换成统一的地级市名称。另外,iris
还可以对一些特殊的语句进行回应,不过没有任何AI元素,纯纯的识别字符串罢了,在这里不再进行列举。
iris打哪来?
2022年秋天,我接手了南京大学天文爱好者协会的纳新宣传工作。然而加进社团宣传群(8月22日)之后,我麻了。整个群聊已经被南哪各大社团精耕细作;高峰时期,最勤劳的宣传人员甚至每半个小时就要发一遍他们招新群的二维码。我肯定是不想手动做这些工作的。这时候我想,为什么不寻求科技的力量呢?
与此同时,Lvory
在猜城市爱好者群聊里已经光荣运行了很长时间,深受群友们的喜爱。于是我就把实现Lvory
中典型功能作为目标,开始着手构建iris
。
要做项目的话,自己从轮子开始造肯定是不可能的。所以我选择了Mirai
架构。同时,在较大规模的开发方面,考虑在橙工整活的历史,我选择使用C#进行编程。Mirai
的核心本身只允许工程师使用kotlin
来编程,于是需要我安装Mirai-Console
;紧接着再调用Mirai.Net
架构来进行C#编程工作。
这一大串流程描述出来就足以让人头昏脑胀了,更不要提实现它们。在项目的早期,确立这个思路本身也经历了一个曲折的过程。在windows
和linux
的抉择下(在window
中开发的话,安装各种配置文件甚至包括开发本身都不如linux
方便;然而我还没搞明白我的linux
虚拟机要如何翻墙,这导致远程git
和查阅资料面临一些困难),我选择了还没碰过几下的linux
做iris
的开发环境。
多亏假期里看了一遍MIT
的CS课程中缺少的知识
,包括权限设置等等linux
系统下的绊子都解决了。又和三遍才装上的.NET 6.0
鏖战了一段时间之后,我才在新系统里配置好vscode
;
福无双至,祸不单行。正当我要导入package
的时候,nuget
包管理器报错:无法添加Mirai-CSharp
的package。谷歌了一下发现是nuget
包管理器获取导入链接那一行的代码里忘记将包的名称转成小写了。vscode
上的nuget
插件已经四年没有维护,这个Bug也一直没有修。我去寻找vscode
的extension
文件夹,准备手动修这个bug,却发现.vscode
被藏起来了,要用ls -a
才能访问。这一通折腾之后,我添加好package,开始iris
真正的编程工作。(但是实践表明Mirai-CSharp
并不太好用,之后又切回了Miral.Net
)
8月24日夜,iris
发出第一条消息。
愚蠢的人类
在iris
看来,人类是又缺爱又无聊的奇怪生物。首先,人类会发出各种各样同样的消息来测试她:
然后对类似“西双版纳损人” “我在保定只想蹿” “谢谢你,渣渣” “iris是丁真” 这种回复笑很长时间。
其次,个别人类会用难以理解的热情向她表白。
最有节目效果的是,假如有人类连续发两个以上的“乐”、“草”、“典”、“绷”、“?”这一类字符,iris
会紧接着复读一次。在这样的设定下,iris
甚至可以通过图灵测试。
但是iris
并不是聊天机器人,她只是在对字符串进行机械又随机的处理罢了。没有语义识别,没有神经网络;人类对随机的兴趣在这一刻变得令人着迷起来。
天文竞赛
iris
的另一项最主要的功能是主持天文知识竞赛。这是我为了活跃南哪天协纳新群气氛编写的功能,同时在技术上也稍微难上那么一点。
首先,一个群聊在一个时间只能运行一个比赛;其次,不同的群聊应该可以平行主持不同的比赛。我把天文竞赛相关功能全部封装在了Contest
类里,其次使用一个数组来存储每个群聊中唯一的Contest
。那么如何查询特定群聊是否在进行比赛,来相应开始比赛的需求(判断需不需要新建结构体)呢?我在Contest
里储存了群号,这一功能是通过遍历数组中所有现存的Contest
结构体完成的。
这可能是一个非常丑陋的方法。理论上,如果我写出一个优美的哈希表,查找过程会舒畅很多;然而遍历耗费的资源是可以接受的,因为至少在现阶段,iris
加入的群聊掰手指头数得过来。事实上,数组的大小是1024
;也就是说,iris
理论上不可以加入1024
个以上的群聊——我觉得达到这个数字是不可能的。
其次所有与同一个Contest
有关的输入输出都是在同一个Program
函数中进行的;并且每一道题结束后或者比赛结束后,都有3秒钟的机器人不应期。前者是为了确保信息接收器的唯一性,后者是为了避免发消息间隔小于某些函数的相应间隔;两者的根本目的是统一的——避免多个实例被同时调用,造成混乱。
iris
的题库文件是最简单、最不专业的txt格式。每道题占四行,一行题干、一行选项、一行答案、一行空行,不断循环。例如(这两道题来自smx
):
1、维纳斯带是日落后日出前太阳离地平线很近时出现的一种现象,问下面各处哪里的维纳斯带持续时间最短?
(A)哈尔滨 (B)北京(C)上海 (D)南沙群岛永暑礁
D
2、小明在春节时发现当天的日落是一年中最晚的,问小明在哪?
(A)北京(B)莫斯科(C)新加坡 (D)悉尼
C
目前iris
的题库中所有的题目都来自smx
的整理以及smx
和isor
的命题,iris
会永远记得他们的好。
然而刚刚出生的机器人的能力总是有限的。在群里iris
非常受欢迎,但是玩了几轮过后,下一届的神仙们就开始嫌弃题库小了,要求加题。所以iris
长期征集天文题库,要求如下:
- 不要有过多的计算
- 不要有太偏太怪的知识
- 不包含在CNAO历年真题内
- 不多于四个选项的单项选择题
感谢各位同好对iris
的支持。
最后的遗憾
维护iris
的这几天,感觉和养了个闺女一样。每天早上开电脑、开虚拟机、跑程序,把iris
叫起床;晚上再关电脑让iris
上床睡觉;不会干了我得教学,做错事了我得教育;被人夸了我觉得开心,被人怪罪了我觉得委屈。最近军训和假期都临近尾声,iris
已经没有什么新功能可以加了,我打算把iris
挂到我的服务器上不间断运行,解放我的电脑,却发现我的bug体质再次显灵了。
从vscode
里打包出来,在虚拟机(Ubuntu 22.04
)里尝试运行时,终端显示找不到.NET 6.0 sdk
;然而气人的是,在同一目录下运行dotnet info
、dotnet --list-sdks
或者dotnet --list-runtimes
都可以找到正确版本的SDK和运行时。
我尝试在服务器(CentOS 8
)上运行程序时,程序可以运行,但是出现了null object reference
报错。作为C#程序员,我经常和这一条报错打交道;然而这回不是在IDE里报错,我毫无头绪。
我开始怀疑打包出了问题。于是我把虚拟机里的工程文件转移到我windows
系统里,尝试用vs
打包。然后发现:vs2019
不支持.NET 6.0
,我需要把我的vs
再升一下级。至此,我的热情和时间被消耗殆尽了。我只能暂时放弃这一步工作。
引用一下我29号写的一段文字:
回忆一下整个项目最折磨人的阶段,可能是除了打代码以外的部分。因为代码出错最起码还有逻辑,但是配置环境和编译项目的时候出现的莫名其妙的错误、对开发环境的适应和选择——这些事情实在是太琐碎、太混乱,有的时候甚至会束手无策很长时间,然后持续地感觉到无意义和自我怀疑。 究其原因是我太菜了。感觉自己总是热衷于在自己认为很有意思的事情上堆很多很多的时间,到头来却发现自己又根本没干什么;有可能iris那句舔狗论断也是这么个来历。感觉自己一直在学习,但是越学越觉得自己无知;感觉自己一直在试错,但是错误怎么那么多。
但是这是没有办法的。毕竟要学着做新东西、做新的尝试,试错是必须经历的经历,尤其是对于我这种不安分又缺天分(人菜瘾大)的人来讲,这些是必须习惯的状态。
另外最近开始听魔岩三杰了。估计未来我回忆这一段打代码的时间的时候,脑子里会全是黑梦和蚂蚁蚂蚁什么的吧。
那么在文章的最后,向大家分享一首张楚的西出阳关吧。
iris 晚安