当前位置:  开发笔记 > 编程语言 > 正文

如何编写简单的聊天机器人AI?

如何解决《如何编写简单的聊天机器人AI?》经验,为你挑选了3个好方法。

我想建立一个机器人,根据答案询问某人一些简单的问题和分支.我意识到从人类的反应中解析意义将具有挑战性,但是你如何设置程序来处理对话的"状态"?

这将是人与机器人之间的一对一对话.



1> 小智..:

您可能希望将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库非常容易,并且具有您所讨论的机器人类型的基础.



2> 小智..:

人们已经提到有状态不是典型聊天机器人的一个重要组成部分:

纯粹的马尔可夫实现可能表达一种非常松散的状态,如果它实时增长其词典和表格 - 人类对话者的早期话语可能会在后来的谈话中偶然反刍 - 但马尔可夫模型没有任何固有的选择或产生此类反应的机制.

基于解析的机器人(例如ELIZA)通常试图响应来自用户的最新输入的(一些)语义内容而不重视先前的交换.

也就是说,无论您使用的输入解析和语句合成模型如何,您当然可以向聊天机器人添加一些状态.如何做到这一点很大程度上取决于你想要通过你的状态实现什么,而且你的问题并不是很清楚.但是,有几个一般性的想法:

创建关键字堆栈.当你的人提供输入时,从他们的语句/问题中解析出关键词,并将这些关键词扔到某种堆栈中.当你的聊天机器人未能在最近的输入中提出令人信服的回应时 - 或者,或许,只是随意地将事情混合起来 - 回到你的堆栈,抓住以前的关键字,并使用它来播种你的下一个合成.对于奖励积分,让机器人明确承认它会回到之前的主题,例如"等待,人类,你提到foo之前.[foo播种的句子]".

在机器人中构建类似RPG的对话逻辑.作为您的解析人工输入,切换用户特定会话提示或内容的标记,并有条件地改变聊天机器人可以谈论的内容或其通信方式.例如,用粗言秽语聊天(或责骂或笑)的聊天机器人是相当普遍的; 一个会兴奋起来的聊天机器人,并且有条件地保持这种状态直到道歉,这将是一个有趣的有状态的变化.将输出切换到ALL CAPS,抛出对抗性言论或要求或抽泣等.

你能澄清一下你希望国家帮你完成什么吗?


向聊天机器人添加一些状态.如何做到这一点很大程度上取决于你想要通过你的状态实现什么,而且你的问题并不是很清楚.但是,有几个一般性的想法:
,这将是一个有趣的有状态的变化.将输出切换到ALL CAPS,抛出对抗性言论或要求或抽泣等.

3> Ralph M. Ric..:

想象一下神经网络在每个节点或神经元中具有解析功能.根据规则和解析结果,神经元会激发.如果某些神经元触发,你会对问题的主题和语义有一个很好的了解,因此可以给出一个很好的答案.

记忆是通过在会话中保持主题讨论,增加下一个问题的触发,从而指导最后可能答案的选择过程来完成的.

将您的规则和模式保存在知识库中,但在开始时将它们编译到内存中,每个规则都有一个神经元.您可以使用听众或事件函数等方法来设计突触.

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有