首页 文章

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

提问于
浏览
32

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

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

11 回答

  • 22

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

    编辑:这是马尔可夫链的Python中的一个最小例子,它接受来自标准输入的输入,并根据输入中彼此相继的单词的概率输出文本 . 它针对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库非常容易,并且具有您所谈论的机器人类型的基础 .

  • 0

    如果你只是涉猎,我相信Pidgin允许你编写聊天风格的行为 . 框架的一部分可能会解决何时发送消息的状态,以及最后N条消息中每条消息的内部状态 . 未来的州决策可以基于对先前状态的检查和最近几条消息的内容进行硬编码 . 或者你可以做类似马克夫链的讨论,并将其用于解析和生成 .

  • 14

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

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

  • 3

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

    Links:

    干杯,

    Ratnakar

  • 1

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

    记忆是通过保持会话中讨论的主题,添加到下一个问题的触发,并因此指导最后可能的答案的选择过程 .

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

  • 0

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

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

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

    这不是很现实,但我在此挑战任何人在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
    

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

  • 0

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

  • 0

    我正在寻找,但有一个名为ELIZA的旧程序,它可以通过执行一些简单的文本转换来获取您所说的内容并将其吐回到您的对话中 .

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

  • 5

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

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

    编辑:这是一个用红宝石编写的一个简单的,你可以开始:rubyBOT

  • 0

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

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

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

    也就是说,你可以在聊天机器人中添加一些状态,无论输入解析和语句合成模型如何,你的问题都不清楚 . 但是,有几个一般性的想法:

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

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

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

  • 2

    我想你可以查看Kooky的代码,而IIRC它也使用Markov Chains .

    另外看看kooky quotes,它们不久前在Coding Horror上有特色,有些很有趣 .

相关问题