这是一个奇怪的周末,我难得在个人项目上取得了一点进展。
我花了很长时间思考如何让Athena可以记住东西。
毫无疑问,Athena的记忆就是我的,也可以说是她的数据库。而Athena比人类好的一点是,除非数据源挂掉,否则她不会失忆,任何存储在她脑海里的事情都会被记得。
之后再考虑记忆,人的记忆也类似于数据存储,抛开生物层面不谈。不过人会有短时和长久记忆的区分,不常用的事物,无关紧要的事物,会被选择性遗忘。而人究竟记住了什么呢?我和枫哥就此讨论了一番。最终,我偷懒的把记忆暂时的分为了——
概念:抽象的定义。可以看做是Class。比如,猫、波斯猫、一只波斯猫。
物体:具体的定义。可以看做是Object。由概念实体化而来。比如,我家的猫,路上看到的脏兮兮的土猫。物体是可以明确定义的。
人:由于人的属性会比物体多很多很多,所以我特别的将人拎出来了。
事件:event,枫哥说在新闻中,事件有五W要素:when where who why what。
我最初的设计中只有物体和事件两种,而他们共有entry, type, category和description四个属性,以及一个名为option的解释类属性。
在这个暂时区分后,我发现description这个属性非常的暧昧不清,于是我把它也去掉了。而四个分类依然可以共用剩下的属性。
随后我开始想,我要如何起手写这个逻辑——一想就是大半天。直到后来,我觉得,无法再拖下去了,随便写点吧,才开始真正动手。
经过一段时间的修改。我把memory_controller的大概写了出来。拥有momerize与recall两个方法,分别主管记忆(in)与回忆(out)。现在想来,push和pull可能更形象一点。——坑:memory在Mongoose自动转换时不是变成memorys而是memories。这就是为什么我可以用model查到数据但是在RoboMongo里找不到数据的原因。
之后要做的事情就很简单了——
我重写了资讯的获取逻辑,正式由实时爬取改为了取资讯记录库中的后十条。
然后由于Cheerio对RSS的解析实在是弱,同时旧的RSSFeed突然失效了。我用XMLReader这个库把整个资讯的获取部分翻修了一遍。另外由于CnBeta的RSS一次有100条数据,我觉得后台日志被刷屏实在是太无聊了,就用Async把咨询处理那一段也重写了一下。——虽然这个说的比较简单,但是我还是整整做了一上午。
再后来,我利用recall方法,把Athena的初始化方法更新了——Athena在醒来的时候先会去记忆库中寻找自己的资料,如果没有会把一份初始化的资料灌进去。
另外,我花了一点时间找了一点音频文件。然后研究了一下如何用JS操作audio。现在Athena在搜集到新的消息后,会发出非常销魂的一声“额~啊~~~~”——这个声音一开始非常棒,但是后来我开始写代码的时候,就不停的被吓到,一直到我写这篇文章的前几段,我还被吓到过一次,以至于我不得不把音响给关了……
随后我开始探索新的API,在百度的API库里找到了几个我还算中意的API,在测试动漫台词这个API的时候,遇到了Unicode编码无法转换的问题,一怒之下,看比赛去了,到现在还没有解决。
这大概就是这几天的工作了吧。
未来:
之后首先要解决的记忆的应用——我需要在探索(爬虫)模块中,让Athena自己知道应该去爬取哪些东西。
之后是记忆的关联——我认为,联想是一种非常重要的东西,Athena需要对记录的所有信息做关键词处理,然后做关键词归集和关联。这样当我再问一个事情的时候,她就可以从各种关联中取到所需的信息。
SM告诉我说,不要把她变成一个功能机器人,她是一个智能机器人。
我觉得很对。
Athena需要有自己的情感和思维。我其实非常希望她可以摆脱浏览器的束缚——然而我的第一次尝试,试图把她打包成一个APP的尝试,由于地址的问题,没有成功。
今天到现在,我非常的累。
感谢枫哥和我讨论记忆的模式,并提供了系统音效的选择。
以我这样的半吊子水平,去逼近人工智能,我觉得似乎很遥远啊。然而如果Athena能够确确实实的说出一句我没有编码过的话。我觉得,我还是会很开心的。