簡體   English   中英

如何編寫一個簡單的聊天機器人 AI?

[英]How can I program a simple chat bot AI?

我想構建一個機器人,根據答案向某人詢問一些簡單的問題和分支。 我意識到從人類反應中解析意義將具有挑戰性,但是您如何設置程序來處理對話的“狀態”?

這將是人和機器人之間的一對一對話。

您可能希望將馬爾可夫鏈作為機器人 AI 的基礎。 我很久以前寫過一些東西(我一點也不引以為豪的代碼,需要一些 mod 才能在 Python > 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)通常會嘗試響應用戶最近輸入的(某些)語義內容,而無需考慮先前的交換。

add some amount of state to a chatbot, regardless of the input-parsing and statement-synthesis model you're using.也就是說,您當然向聊天機器人添加一些狀態,而不管您使用的是哪種輸入解析和語句合成模型。 如何做到這一點在很大程度上取決於您想通過狀態實現什么,而您的問題並不清楚。 但是,有一些一般性想法:

  • 創建關鍵字堆棧。 當您的人提供輸入時,從他們的陳述/問題中解析出關鍵字並將這些關鍵字扔到某種堆棧中。 當您的聊天機器人無法在最近的輸入中提出令人信服的回應時——或者,可能只是隨機地將事情混在一起——回到你的堆棧,獲取上一個關鍵字,並用它來播種你的下一個合成。 對於獎勵積分,讓機器人明確承認它正在返回上一個主題,例如“等等,人類,你之前提到過 foo。[由 foo 播種的句子]”。

  • 將類似 RPG 的對話邏輯構建到機器人中。 在解析人工輸入時,切換特定對話提示或用戶內容的標志,並有條件地改變聊天機器人可以談論的內容或交流方式。 例如,聊天機器人對粗言穢語大發雷霆(或責罵或大笑)是相當普遍的; , would be an interesting stateful variation on this.一個聊天機器人會變得興奮,並有條件地,這將是一個有趣的有狀態變體。 將輸出切換為全部大寫,加入對抗性的言辭或要求或抽泣等。

你能澄清一下你希望國家幫助你完成什么嗎?

想象一個在每個節點或神經元中具有解析能力的神經網絡。 根據規則和解析結果,神經元會觸發。 如果某些神經元激活,您就可以很好地了解問題的主題和語義,因此可以給出很好的答案。

記憶是通過在會話中保持討論的主題來完成的,添加到下一個問題的觸發中,從而指導最后可能的答案的選擇過程。

將您的規則和模式保存在知識庫中,但在開始時將它們編譯到內存中,每個規則都有一個神經元。 您可以使用諸如偵聽器或事件函數之類的東西來設計突觸。

我認為您可以查看Kooky的代碼,而 IIRC 也使用了馬爾可夫鏈。

還可以查看古怪的引語,不久前它們出現在 Coding Horror 上,有些還很搞笑。

我認為開始這個項目時,最好有一個帶有問題的數據庫(組織為樹。在每個節點中都有一個或多個問題)。 這些問題應以“是”或“否”來回答。

如果機器人開始提問,它可以從您的問題數據庫中標記為開始問題的任何問題開始。 答案是到樹中下一個節點的方式。

編輯:這是一個用 ruby​​ 編寫的簡單的,你可以從: rubyBOT

天真的聊天機器人程序。 沒有解析,沒有聰明,只是一個訓練文件和輸出。

它首先在文本上訓練自己,然后使用來自該訓練的數據來生成對對話者輸入的響應。 訓練過程創建一個字典,其中每個鍵是一個單詞,值是訓練文本中任何位置順序跟隨該單詞的所有單詞的列表。 如果一個詞在這個列表中出現不止一次,那么這反映了它更有可能被機器人選擇,不需要概率性的東西,只需用一個列表來做。

機器人從您的輸入中選擇一個隨機詞,並通過選擇另一個被視為其保留詞的后繼詞的隨機詞來生成響應。 然后它通過依次找到該單詞的后繼並迭代地進行重復該過程,直到它認為它已經說得夠多了。 它通過在訓練文本中標點符號之前的單詞處停止來得出該結論。 然后它再次返回到輸入模式讓您響應,依此類推。

這不是很現實,但我在此挑戰任何人在 71 行代碼中做得更好!! 對於任何初出茅廬的 Python 愛好者來說,這都是一個巨大的挑戰,我只是希望我能向更廣泛的受眾開放挑戰,而不是我訪問這個博客的少數訪問者。 為了編寫一個始終保證符合語法的機器人代碼,它肯定接近幾百行,我只是試圖想出最簡單的規則,讓計算機能夠有話要說,從而大大簡化了程序。

它的反應至少可以說是相當印象派的! 此外,您必須將您所說的放在單引號中。

我使用戰爭與和平作為我的“語料庫”,訓練運行需要幾個小時,如果您不耐煩,請使用較短的文件......

這是教練

#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

當它說一些似乎有道理的東西時,你往往會有一種不可思議的感覺。

如果你只是涉足,我相信Pidgin允許你編寫聊天風格的行為。 框架的一部分可能會跟蹤誰何時發送消息的狀態,並且您希望為最后 N 條消息中的每一條保留機器人內部狀態的日志。 未來的狀態決策可以基於對先前狀態和最近幾條消息的內容的檢查進行硬編碼。 或者你可以做一些類似於討論過的馬爾可夫鏈的事情,並將它用於解析和生成。

如果您不需要學習機器人,使用 AIML ( http://www.aiml.net/ ) 很可能會產生您想要的結果,至少在機器人解析輸入和基於它的回答方面。

您將重用或創建由 XML(以 AIML 格式)組成的“大腦”,並在程序(解析器)中解析/運行它們。 有幾種不同語言的解析器可供選擇,據我所知,在大多數情況下,代碼似乎是開源的。

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

鏈接:

  1. 【ChatterBot 安裝】 https://chatterbot.readthedocs.io/en/stable/setup.html
  2. [Host Locally using - flask-chatterbot-master]: https : //github.com/chamkank/flask-chatterbot

干杯,

拉特納卡

我建議查看貝葉斯概率。 然后只需監視聊天室一段時間即可創建您的概率樹。

我不確定這是否是您要查找的內容,但是有一個名為ELIZA的舊程序,它可以通過執行一些簡單的文本轉換后將您所說的內容吐還給您來進行對話。

如果我沒記錯的話,很多人都相信他們是在和一個真實的人“交談”,並與他進行了長時間的精心對話。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM