Как я могу запрограммировать простой чат-бот AI?

Я хочу создать бота, который задает кому-то несколько простых вопросов и ветвей на основе ответа. Я понимаю, что разбор значения из человеческих ответов будет сложным, но как вы настраиваете программу, чтобы справиться с "состоянием" разговора?

Это будет разговор один на один между человеком и ботом.

11 ответов


вы, вероятно, хотите посмотреть в Цепи Маркова как основы для бота AI. Я написал что-то давным-давно (код, которым я совсем не горжусь, и нуждается в некоторых модах для работы на Python > 1.5), что может быть полезным стартовым местом для вас: http://sourceforge.net/projects/benzo/

EDIT: вот минимальный пример в 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 и иметь основу типа бота, о котором вы говорите.


люди уже упоминали, что статичность не является большим компонентом типичных чат-ботов:

  • a основанный на синтаксическом анализе бот (например, ELIZA) обычно пытается ответить на (часть) семантического содержания последнего ввода от пользователя без существенного учета предыдущих обменов.

Что сказал, Вы, конечно можете добавьте некоторое количество состояния в чат-бот, независимо от используемой модели ввода-анализа и синтеза операторов. Как это сделать, во многом зависит от того, чего вы хотите достичь своей статичностью, и это не совсем ясно из свой вопрос. Пара общих идей, однако:

  • создать стек сайта. Когда ваш человек предлагает ввод, разберите ключевые слова из своих заявлений / вопросов и бросьте эти ключевые слова в стек. Когда ваш чат-бот не может придумать что-то убедительное, чтобы ответить на самый последний ввод-или, возможно, просто наугад, чтобы смешать вещи-вернитесь к своему стеку, возьмите предыдущее ключевое слово и используйте его для посева следующего синтеза. За бонусные баллы, попросите бота явно признать, что он возвращается к предыдущей теме, например: "подождите, человек, ранее вы упомянули foo. [Предложение, засеянное foo]".

  • постройте RPG-подобную диалоговую логику в бота. В качестве парсинга человеческого ввода переключайте флаги для конкретных разговорных подсказок или контента от пользователя и условно изменяйте, о чем может говорить чат-бот или как он общается. Например, чатбот, ощетинившийся (или ругающийся, или смеющийся) на нецензурную брань, довольно распространенный; чат-бот, который получит het up, и условно до тех пор, пока не извинился перед, была бы интересная статусная вариация на этот счет. Переключите выход на все колпачки,бросьте конфронтационную риторику или требования или рыдания и т. д.

можете ли вы немного прояснить, что вы хотите, чтобы государство помогло вам достичь?


представьте себе нейронную сеть с возможностями синтаксического анализа в каждом узле или нейроне. В зависимости от правил и результатов анализа нейроны срабатывают. Если определенные нейроны срабатывают, вы получаете хорошее представление о теме и семантике вопроса и поэтому можете дать хороший ответ.

память выполняется путем сохранения тем, о которых говорят в сеансе, добавляя к стрельбе для следующего вопроса и, следовательно, направляя процесс выбора возможных ответов в конце.

держите ваши правила и шаблоны в базе знаний, но компилировать их в память во время запуска, с нейроном на правило. Вы можете создавать синапсы, используя что-то вроде прослушивателей или функций событий.


Я думаю, вы можете посмотреть код для закидонами, и IIRC он также использует цепи Маркова.

также проверить закидонами кавычки, они были показаны на кодировании ужасов не так давно, и некоторые из них веселые.


Я думаю, чтобы начать этот проект, было бы хорошо иметь базу данных с вопросами (организованными как дерево. В каждом узле один или несколько вопросов). На эти вопросы можно ответить "да"или " нет".

если бот начинает задавать вопросы, он может начать с любого вопроса из базы данных yuor вопросов, помеченных как start-question. Ответ - путь к следующему узлу дерева.

редактировать: вот непростых написан на Ruby, вы можете начать с: rubyBOT


наивная программа chatbot. Нет синтаксического анализа, нет ума, просто учебный файл и вывод.

сначала он тренируется на тексте, а затем использует данные этого обучения для генерации ответов на ввод собеседника. Процесс обучения создает словарь, где каждый ключ-это слово, а значение-список всех слов, которые последовательно следуют за этим словом в любом месте учебного текста. Если слово имеет более одного раза в этом списке, то это отражает, и это больше вероятно, будет выбран ботом, нет необходимости в вероятностных вещах, просто сделайте это со списком.

бот выбирает случайное слово из вашего ввода и генерирует ответ, выбирая другое случайное слово, которое было замечено как преемник его удерживаемого слова. Затем он повторяет процесс, находя преемника этого слова в свою очередь и продолжая итеративно, пока не сочтет, что сказал достаточно. Он приходит к этому выводу, останавливаясь на слове, которое было до знака препинания в обучении текст. Затем он снова возвращается в режим ввода, чтобы вы могли ответить, и так далее.

это не очень реалистично, но я настоящим призываю всех сделать лучше в 71 строке кода !! Это большой вызов для любого начинающего питониста, и я просто хочу, чтобы я мог открыть вызов для более широкой аудитории, чем небольшое количество посетителей, которых я получаю в этом блоге. Чтобы закодировать бота, который всегда гарантированно будет грамматическим, наверняка должен быть ближе к нескольким сотням строк, я сильно упростил, просто пытаясь подумайте о простейшем правиле, чтобы дать компьютеру простой удар, чтобы что-то сказать.

его ответы довольно импрессионистские, чтобы не сказать больше ! Также вы должны поместить то, что вы говорите, в одинарные кавычки.

Я использовал 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

у тебя склонность к сверхъестественной чувство, когда он говорит что-то, что, кажется, частично имеет смысла.


Я бы предложил взглянуть на байесовские вероятности. Затем просто контролируйте чат в течение определенного периода времени, чтобы создать дерево вероятностей.


Я не уверен, что это то, что вы ищете, но есть старая программа, которая называется Элиза который мог бы провести разговор, взяв то, что вы сказали, и выплюнув его обратно на вас после выполнения некоторых простых текстовых преобразований.

Если я правильно помню, многие люди были убеждены, что они "разговаривают" с человеком, и давно продуманной беседы с ним.


Если вы просто балуетесь, я верю пиджин позволяет создавать сценарии поведения стиля чата. Часть фреймворка, вероятно, отслеживает состояние того, кто отправил сообщение, и вы хотите сохранить журнал внутреннего состояния вашего бота для каждого из последних N сообщений. Будущие решения государств могут быть жестко закодированы на основе инспекций предыдущих государств и содержания последних нескольких сообщений. Или вы можете сделать что-то вроде обсуждаемых цепей Маркова и использовать его как для синтаксического анализа, так и для генерирующий.


Если вам не требуется обучающий бот, используйте AIML (http://www.aiml.net/), скорее всего, даст результат, который вы хотите, по крайней мере, в отношении ввода синтаксического анализа бота и ответа на его основе.

вы будете повторно использовать или создавать "мозги" из XML (в формате AIML) и анализировать/запускать их в программе (парсер). Есть Парсеры, сделанные на нескольких разных языках на выбор, и, насколько я могу судить, код в большинстве случаев является открытым исходным кодом.


вы можете использовать "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