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

时间:2008-09-10 19:00:41

标签: language-agnostic artificial-intelligence chat chatbot

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

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

11 个答案:

答案 0 :(得分:23)

您可能希望将Markov Chains作为机器人AI的基础知识。很久以前我写了一些东西(我根本不感兴趣的代码,需要一些mod在Python上运行> 1.5),这对你来说可能是一个有用的起点: {{ 3}}

编辑:这是马尔可夫链的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库非常简单,并且具有您所讨论的机器人类型的基础。

答案 1 :(得分:14)

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

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

  • 基于解析的僵尸程序(例如ELIZA)通常会尝试响应来自用户的最新输入的(某些)语义内容,而不会考虑先前的交换。

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

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

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

您能否澄清一下您希望州政府帮您完成的事情?

答案 2 :(得分:5)

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

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

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

答案 3 :(得分:3)

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

另请查看kooky quotes,它们不久前在Coding Horror上有特色,有些很热闹。

答案 4 :(得分:2)

我认为,要开始这个项目,最好有一个带问题的数据库(按树组织。在每个节点中有一个或多个问题)。 这些问题可以用“是”或“否”来回答。

如果机器人开始质疑,它可以从标记为开始问题的问题的yuor数据库中的任何问题开始。答案是通往树中下一个节点的方法。

编辑:这是一个用红宝石编写的文字,你可以从rubyBOT

开始

答案 5 :(得分:1)

天真的聊天机器人程序。没有解析,没有聪明,只有训练文件和输出。

它首先在文本上训练,然后使用该训练中的数据生成对话者输入的响应。训练过程创建一个字典,其中每个键都是一个单词,值是在训练文本中的任何位置顺序跟随该单词的所有单词的列表。如果一个单词在此列表中不止一次出现,那么这反映了它更可能由机器人选择,不需要概率性的东西就可以用列表来做。

机器人从您的输入中选择一个随机单词,并通过选择另一个被视为其保留单词的后继单词的随机单词来生成响应。然后通过依次找到该单词的后继者并反复进行直到它认为已经说得足够重复该过程。通过停止在训练文本中的标点符号之前的单词来达到该结论。然后它再次返回到输入模式以让您响应,依此类推。

这不太现实但我在此挑战任何人在71行代码中做得更好!对于任何崭露头角的Python主义者来说,这是一个巨大的挑战,我希望我能够向更广泛的受众开放挑战,而不是我访问此博客的少数访问者。要编写一个总是保证语法化的机器人肯定会接近几百行,我只是想通过一个最简单的规则来简化计算机只是为了让计算机只需要说些什么就可以了。

至少可以说它的反应相当印象派!你也必须把你说的用单引号括起来。

我使用War and Peace作为我的“语料库”,花了几个小时进行训练,如果你不耐烦则使用较短的文件......

这是培训师

#lukebot-trainer.py
import pickle
b=open('war&peace.txt')
text=[]
for line in b:
    for word in line.split():
        text.append (word)
b.close()
textset=list(set(text))
follow={}
for l in range(len(textset)):
    working=[]
    check=textset[l]
    for w in range(len(text)-1):
        if check==text[w] and text[w][-1] not in '(),.?!':
            working.append(str(text[w+1]))
    follow[check]=working
a=open('lexicon-luke','wb')
pickle.dump(follow,a,2)
a.close()

这是机器人

#lukebot.py
import pickle,random
a=open('lexicon-luke','rb')
successorlist=pickle.load(a)
a.close()
def nextword(a):
    if a in successorlist:
        return random.choice(successorlist[a])
    else:
        return 'the'
speech=''
while speech!='quit':
    speech=raw_input('>')
    s=random.choice(speech.split())
    response=''
    while True:
        neword=nextword(s)
        response+=' '+neword
        s=neword
        if neword[-1] in ',?!.':
            break
    print response

当它说出一些似乎有意义的东西时,你往往会有一种不可思议的感觉。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

我不确定这是你在寻找什么,但是有一个名为ELIZA的旧程序可以通过记录你所说的内容并在执行一些简单的文本转换后将它吐回来对话来进行对话

如果我没记错的话,很多人都相信他们正在与一个真实的人“交谈”,并与之进行了长时间的精心对话。

答案 8 :(得分:0)

如果您只是涉猎,我相信Pidgin允许您编写聊天风格行为的脚本。框架的一部分可能会解决何时发送消息的状态,并且您希望为最后N条消息中的每条消息记录机器人的内部状态。未来的州决策可以基于对先前状态的检查和最近几条消息的内容进行硬编码。或者你可以做一些像所讨论的Markov链一样的东西,并将其用于解析和生成。

答案 9 :(得分:0)

如果您不需要学习机器人,使用AIML(http://www.aiml.net/)很可能会产生您想要的结果,至少就机器人解析输入和基于它的应答而言。

您将重用或创建由XML构成的“大脑”(以AIML格式)并在程序(解析器)中解析/运行它们。有几种不同语言的解析器可供选择,据我所知,在大多数情况下代码似乎是开源的。

答案 10 :(得分:0)

您可以使用“ ChatterBot”,并使用-'flask-chatterbot-master”在本地托管

链接:

  1. [ChatterBot安装] https://chatterbot.readthedocs.io/en/stable/setup.html
  2. [使用-flask-chatterbot-master在本地托管]:https://github.com/chamkank/flask-chatterbot

干杯

Ratnakar