Как я могу запрограммировать простого чат-бота с искусственным интеллектом?

StackOverflow https://stackoverflow.com/questions/55042

Вопрос

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

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

Это было полезно?

Решение

Вы, вероятно, хотите заглянуть в Цепи Маркова как основы для искусственного интеллекта бота.Я написал кое-что давным-давно (код, которым я совсем не горжусь, и для запуска которого нужны некоторые моды на 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()

Отсюда довольно легко подключить persistence и библиотеку IRC и получить основу для типа бота, о котором вы говорите.

Другие советы

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

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

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

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

  • Создайте стек ключевых слов.Когда ваш человек предложит ввод, выделите ключевые слова из его утверждений / вопросов и поместите эти ключевые слова в какой-нибудь стек.Когда вашему чат-боту не удается придумать что-то убедительное для ответа в самом последнем вводе - или, возможно, просто наугад, чтобы все перепутать, — вернитесь к своему стеку, возьмите предыдущее ключевое слово и используйте его для следующего обобщения.Для получения бонусных баллов попросите бота явно подтвердить, что он возвращается к предыдущей теме, например- Подожди, ЧЕЛОВЕК, ранее ты упоминал фу.[Предложение заполнено foo]".

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

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

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

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

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

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

Также ознакомьтесь с странные цитаты, не так давно они были показаны в "Coding Horror", и некоторые из них очень забавные.

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

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

Редактировать:Вот пример, написанный на ruby, с которого вы можете начать: Рубиновый бот

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

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

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

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

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

Я использовал “Войну и мир” для своего "корпуса", на тренировку которого ушло пару часов, используйте более короткий файл, если вам не терпится…

вот этот тренер

#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. [Установка чат-бота] https://chatterbot.readthedocs.io/en/stable/setup.html
  2. [Размещайте локально, используя - flask-chatterbot-master]: https://github.com/chamkank/flask-chatterbot

Ваше здоровье,

Ратнакар

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top