Как я могу запрограммировать простой чат бот AI? - PullRequest
32 голосов
/ 10 сентября 2008

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

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

Ответы [ 11 ]

23 голосов
/ 10 сентября 2008

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

14 голосов
/ 18 сентября 2008

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

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

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

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

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

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

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

5 голосов
/ 20 октября 2008

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

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

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

3 голосов
/ 10 сентября 2008

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

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

2 голосов
/ 10 сентября 2008

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

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

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

1 голос
/ 28 мая 2014

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

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

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

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

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

Я использовал «Войну и мир» для своего «корпуса», который занял пару часов на тренировочном заезде, используйте более короткий файл, если вы нетерпеливы…

вот тренер

#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 голосов
/ 17 августа 2018

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

0 голосов
/ 09 октября 2012

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

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

0 голосов
/ 06 августа 2009

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

0 голосов
/ 11 сентября 2008

Я не уверен, что это то, что вы ищете, но есть старая программа под названием ELIZA , которая может поддерживать разговор, беря то, что вы сказали, и выплевывая его вам после выполнения некоторого простого текстовые трансформации.

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

...