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

时间:2020-03-05 18:51:00  来源:igfitidea点击:

我想构建一个机器人,该机器人问一个人一些简单的问题,并根据答案进行分支。我意识到从人的回应中解析含义将具有挑战性,但是我们如何设置该程序来处理对话的"状态"?

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

解决方案

回答

我建议看一下贝叶斯概率。然后,只需监视聊天室一段时间即可创建概率树。

回答

我们可能希望将Markov Chains作为bot AI的基础知识。我很久以前写了一些东西(我一点都不引以为豪的代码,并且需要一些mods才能在Python> 1.5上运行),可能对我们来说是一个有用的起点:http://sourceforge.net/项目/苯并/

编辑:这是马尔可夫链的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库非常容易,并且具有我们所讨论的bot类型的基础。

回答

我认为我们可以查看Kooky的代码,而IIRC也使用Markov Chains。

还请查看怪异的引号,它们在不久前就出现在了《编码恐怖》中,其中的一些引人入胜。

回答

我想开始这个项目,最好有一个包含问题的数据库(组织成树。在每个节点中有一个或者多个问题)。
这些问题用"是"或者"否"回答。

如果机器人开始提问,它可以从数据库中标记为开始问题的任何问题开始。答案是到达树中下一个节点的方式。

编辑:这是一个用ruby编写的松软的代码,我们可以从以下代码开始:rubyBOT

回答

我不确定这不是我们要查找的内容,但是有一个名为ELIZA的旧程序可以通过进行简单的文本转换将我们所说的内容吐出来并与我们进行对话,从而进行对话。

如果我没记错的话,许多人都相信他们是在与真实的人"交谈",并与之进行了长时间的精心交谈。

回答

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

  • 如果纯马尔可夫实现实时地增加其词典和表格,则人类对话者的早期话语可能会在稍后的对话中被偶然地反感,但是马尔可夫模型没有任何固有的机制来选择或者产生这样的反应。
  • 基于解析的漫游器(例如ELIZA)通常尝试响应来自用户的最新输入的(某些)语义内容,而无需过多考虑先前的交换。

就是说,无论我们使用的是输入解析还是语句综合模型,我们当然都可以向聊天机器人添加一些状态。如何做到这一点在很大程度上取决于我们希望通过有状态来完成什么工作,而从问题中并不清楚。但是,有两个基本概念:

  • 创建一个关键字堆栈。当人员提供输入时,请从其陈述/问题中解析出关键字,然后将这些关键字放入某种堆栈中。当聊天机器人未能提出令人信服的东西来回应最新的输入器时,可能只是随机地将事情混在一起回到堆栈中,获取上一个关键字,并使用它来播种下一个综合信息。为了获得奖励积分,请机器人明确确认它可以回到上一个主题,例如"等等,人类,我们之前提到过foo。[由foo植入的句子]"。
  • 在机器人中构建类似于RPG的对话逻辑。在解析人工输入时,切换用于特定会话提示或者来自用户的内容的标志,并有条件地更改聊天机器人可以谈论的内容或者通信方式。例如,聊天机器人对粗口语言发疯(或者责骂或者大笑)是很普遍的。一个聊天机器人,它将变得活跃起来,并有条件地保持这种状态,直到向道歉为止,这将是一个有趣的有状态变化。将输出切换为ALL CAPS,使用对抗性言论或者要求或者抽泣等。

我们能否澄清一下我们想要的状态来完成?

回答

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

记忆是通过在会话中保持讨论的话题,增加对下一个问题的激发,从而最终指导选择可能答案的方式来完成的。

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

回答

如果我们只是尝试,我相信Pidgin允许我们编写聊天风格的行为脚本。该框架的一部分可能会确定何时发送消息的人的状态,并且我们希望针对最近N条消息中的每条记录机器人内部状态的日志。可以根据对先前状态的检查和最近几条消息的内容来对将来的状态决策进行硬编码。或者,我们可以做类似讨论的马尔可夫链的操作,并将其用于解析和生成。