我想建立一个机器人,根据答案询问某人一些简单的问题和分支.我意识到从人类的反应中解析意义将具有挑战性,但是你如何设置程序来处理对话的"状态"?
这将是人与机器人之间的一对一对话.
您可能希望将Markov Chains视为机器人AI的基础知识.我很久以前写过一些东西(我根本不感兴趣的代码,需要一些在Python上运行的mod> 1.5),这对你来说可能是一个有用的起点:http://sourceforge.net/projects/benzo/
编辑:这是一个马尔可夫链的Python中的一个最小例子,它接受来自stdin的输入,并根据输入中彼此相继的单词的概率输出文本.它针对IRC风格的聊天记录进行了优化,但通过它运行任何体面大小的文本都应该演示以下概念:
import random, sys NONWORD = "\n" STARTKEY = NONWORD, NONWORD MAXGEN=1000 class MarkovChainer(object): def __init__(self): self.state = dict() def input(self, input): word1, word2 = STARTKEY for word3 in input.split(): self.state.setdefault((word1, word2), list()).append(word3) word1, word2 = word2, word3 self.state.setdefault((word1, word2), list()).append(NONWORD) def output(self): output = list() word1, word2 = STARTKEY for i in range(MAXGEN): word3 = random.choice(self.state[(word1,word2)]) if word3 == NONWORD: break output.append(word3) word1, word2 = word2, word3 return " ".join(output) if __name__ == "__main__": c = MarkovChainer() c.input(sys.stdin.read()) print c.output()
从这里插入持久性和IRC库非常容易,并且具有您所讨论的机器人类型的基础.
人们已经提到有状态不是典型聊天机器人的一个重要组成部分:
纯粹的马尔可夫实现可能表达一种非常松散的状态,如果它实时增长其词典和表格 - 人类对话者的早期话语可能会在后来的谈话中偶然反刍 - 但马尔可夫模型没有任何固有的选择或产生此类反应的机制.
基于解析的机器人(例如ELIZA)通常试图响应来自用户的最新输入的(一些)语义内容而不重视先前的交换.
也就是说,无论您使用的输入解析和语句合成模型如何,您当然可以向聊天机器人添加一些状态.如何做到这一点很大程度上取决于你想要通过你的状态实现什么,而且你的问题并不是很清楚.但是,有几个一般性的想法:
创建关键字堆栈.当你的人提供输入时,从他们的语句/问题中解析出关键词,并将这些关键词扔到某种堆栈中.当你的聊天机器人未能在最近的输入中提出令人信服的回应时 - 或者,或许,只是随意地将事情混合起来 - 回到你的堆栈,抓住以前的关键字,并使用它来播种你的下一个合成.对于奖励积分,让机器人明确承认它会回到之前的主题,例如"等待,人类,你提到foo之前.[foo播种的句子]".
在机器人中构建类似RPG的对话逻辑.作为您的解析人工输入,切换用户特定会话提示或内容的标记,并有条件地改变聊天机器人可以谈论的内容或其通信方式.例如,用粗言秽语聊天(或责骂或笑)的聊天机器人是相当普遍的; 一个会兴奋起来的聊天机器人,并且有条件地保持这种状态直到道歉,这将是一个有趣的有状态的变化.将输出切换到ALL CAPS,抛出对抗性言论或要求或抽泣等.
你能澄清一下你希望国家帮你完成什么吗?
想象一下神经网络在每个节点或神经元中具有解析功能.根据规则和解析结果,神经元会激发.如果某些神经元触发,你会对问题的主题和语义有一个很好的了解,因此可以给出一个很好的答案.
记忆是通过在会话中保持主题讨论,增加下一个问题的触发,从而指导最后可能答案的选择过程来完成的.
将您的规则和模式保存在知识库中,但在开始时将它们编译到内存中,每个规则都有一个神经元.您可以使用听众或事件函数等方法来设计突触.