¿Cómo puedo programar un simple chat bot AI?


Quiero construir un bot que le haga a alguien algunas preguntas simples y ramas basadas en la respuesta. Me doy cuenta de que analizar el significado de las respuestas humanas será un desafío, pero ¿cómo configurar el programa para lidiar con el "estado" de la conversación?

Será una conversación uno a uno entre un humano y el bot.

Author: Rakete1111, 2008-09-10

11 answers

Probablemente quieras buscar en Markov Chains como los fundamentos para el bot AI. Escribí algo hace mucho tiempo (el código del que no estoy orgulloso en absoluto, y necesita algunos mods para ejecutarse en Python > 1.5) que puede ser un punto de partida útil para usted: http://sourceforge.net/projects/benzo /

EDIT: Aquí hay un ejemplo mínimo en Python de una cadena de Markov que acepta entrada desde stdin y genera texto basado en las probabilidades de que las palabras se sucedan entre sí en la entrada. Está optimizado para registros de chat estilo IRC, pero ejecutar cualquier texto de tamaño decente a través de él debería demostrar los conceptos:

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()

Es bastante fácil desde aquí conectar persistencia y una biblioteca de IRC y tener la base del tipo de bot del que estás hablando.

 22
Author: argv0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-05 20:19:35

La gente ya ha mencionado que el estado no es un gran componente de los chatbots típicos:

  • Las implementaciones de un Markov puro pueden expresar un tipo de estado muy suelto si está creciendo su léxico y tabla en tiempo real-las declaraciones anteriores del interlocutor humano pueden regurgitarse por casualidad más adelante en la conversación-pero el modelo de Markov no tiene ningún mecanismo inherente para seleccionar o producir tales respuestas.

  • Un bot basado en análisis (por ejemplo, ELIZA) generalmente intenta responder a (parte del) contenido semántico de la entrada más reciente del usuario sin tener en cuenta los intercambios anteriores.

Dicho esto, ciertamente puede agregar cierta cantidad de estado a un chatbot, independientemente del modelo de análisis de entrada y síntesis de sentencias que esté utilizando. Cómo hacer eso depende mucho de lo que quieras lograr con tu estado de estado, y eso no está muy claro en tu pregunta. Un par de ideas generales, sin embargo:

  • Crea una pila de palabras clave. A medida que su humano ofrece información, analice las palabras clave de sus declaraciones/preguntas y arroje esas palabras clave en una pila de algún tipo. Cuando su chatbot no logra encontrar algo convincente para responder en la entrada más reciente,o, tal vez, al azar, para mezclar las cosas, regrese a su pila, tome una palabra clave anterior y use eso para sembrar su próxima síntesis. Para los puntos de bonificación, haga que el bot reconozca explícitamente que va a volvamos a un tema anterior, por ejemplo: "Espera, HUMANO, antes mencionaste foo. [Sentence seeded by foo]".

  • Construir RPG-como la lógica de diálogo en el bot. A medida que analiza la entrada humana, altere los indicadores para indicaciones de conversación específicas o contenido del usuario y altere condicionalmente de qué puede hablar el chatbot o cómo se comunica. Por ejemplo, un chatbot que se enfurece (o regaña, o se ríe) por el lenguaje grosero es bastante común; un chatbot que se levantará, y condicionalmente permanecer así hasta que se le pida disculpas a, sería una interesante variación stateful sobre esto. Cambie la salida a MAYÚSCULAS, agregue retórica de confrontación o demandas o sollozos, etc.

¿Puedes aclarar un poco lo que quieres que el estado te ayude a lograr?

 14
Author: Josh Millard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-18 17:53:27

Imagine una red neuronal con capacidades de análisis en cada nodo o neurona. Dependiendo de las reglas y los resultados del análisis, las neuronas se disparan. Si ciertas neuronas se disparan, se obtiene una buena idea sobre el tema y la semántica de la pregunta y por lo tanto puede dar una buena respuesta.

La memoria se hace manteniendo los temas de los que se habla en una sesión, agregando al disparo para la siguiente pregunta, y por lo tanto guiando el proceso de selección de posibles respuestas al final.

Mantenga sus reglas y patrones en un base de conocimiento, pero compilarlos en la memoria a la hora de inicio, con una neurona por regla. Puede diseñar sinapsis usando algo como oyentes o funciones de eventos.

 5
Author: Ralph M. Rickenbach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-20 09:20:26

Creo que puedes mirar el código para Kooky, y IIRC también usa Cadenas de Markov.

También echa un vistazo a la kooky quotes, que se presentaron en la codificación de horror no hace mucho tiempo y algunos son hilarantes.

 3
Author: Joel Coehoorn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-10 19:09:13

Creo que para comenzar este proyecto, sería bueno tener una base de datos con preguntas (organizadas como un árbol. En cada nodo una o más preguntas). Estas preguntas deben responderse con "sí"o " no".

Si el bot comienza a preguntar, puede comenzar con cualquier pregunta de la base de datos yuor de preguntas marcadas como una pregunta inicial. La respuesta es el camino al siguiente nodo en el árbol.

Editar: Aquí hay un somple escrito en ruby con el que puedes empezar: rubyBOT

 2
Author: nutario,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-10 19:33:12

Programa chatbot ingenuo. Sin análisis, sin inteligencia, solo un archivo de entrenamiento y salida.

Primero se entrena en un texto y luego utiliza los datos de ese entrenamiento para generar respuestas a la entrada del interlocutor. El proceso de entrenamiento crea un diccionario donde cada clave es una palabra y el valor es una lista de todas las palabras que siguen esa palabra secuencialmente en cualquier lugar del texto de entrenamiento. Si una palabra aparece más de una vez en esta lista, entonces eso se refleja y es más probable que ser elegido por el bot, no hay necesidad de cosas probabilísticas solo hacerlo con una lista.

El bot elige una palabra aleatoria de tu entrada y genera una respuesta eligiendo otra palabra aleatoria que ha sido vista como sucesora de su palabra retenida. Luego repite el proceso encontrando un sucesor de esa palabra a su vez y continuando iterativamente hasta que piensa que ya se ha dicho lo suficiente. Llega a esa conclusión deteniéndose en una palabra que era anterior a un signo de puntuación en el texto de entrenamiento. Entonces vuelve al modo de entrada de nuevo para que pueda responder, y así sucesivamente.

No es muy realista, pero por la presente desafío a cualquiera a hacerlo mejor en 71 líneas de código !! Este es un gran desafío para cualquier pitonista en ciernes, y me gustaría poder abrir el desafío a una audiencia más amplia que el pequeño número de visitantes que recibo en este blog. Para codificar un bot que siempre se garantiza que sea gramatical seguramente debe estar más cerca de varios cientos de líneas, simplifiqué enormemente solo tratando de pensar en el más simple regla para darle a la computadora una simple puñalada por tener algo que decir.

Sus respuestas son bastante impresionistas por decir lo menos ! También tienes que poner lo que dices entre comillas simples.

Usé Guerra y Paz para mi "corpus" que tomó un par de horas para el entrenamiento, use un archivo más corto si está impaciente {

Aquí está el entrenador

#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()

Aquí está el bot

#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

Tiendes a tener una sensación extraña cuando dice algo que parece parcialmente hacer sentido.

 1
Author: user3513316,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-28 01:31:02

Yo sugeriría mirar las probabilidades bayesianas. Luego solo monitorea la sala de chat durante un período de tiempo para crear tu árbol de probabilidades.

 0
Author: EBGreen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-10 19:03:42

No estoy seguro de que esto sea lo que estás buscando, pero hay un viejo programa llamado ELIZA que podría mantener una conversación al tomar lo que dijiste y escupírtelo después de realizar algunas transformaciones textuales simples.

Si no recuerdo mal, muchas personas estaban convencidas de que estaban "hablando" con una persona real y tuvieron largas conversaciones elaboradas con ella.

 0
Author: Ferruccio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-10 23:03:14

Si solo estás incursionando, creo que Pidgin te permite crear scripts de comportamiento de estilo de chat. Parte del framework probablemente señala el estado de quién envió el mensaje y cuándo, y querrás mantener un registro del estado interno de tu bot para cada uno de los últimos N mensajes. Las decisiones futuras de los Estados podrían codificarse en forma rígida sobre la base de la inspección de los Estados anteriores y el contenido de los mensajes más recientes. O podrías hacer algo como las cadenas de Markov discutidas y usarlo tanto para analizar y generar.

 0
Author: dlamblin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-05 20:40:54

Si no necesita un bot de aprendizaje, utilice AIML ( http://www.aiml.net / ) probablemente producirá el resultado que desea, al menos con respecto al bot que analiza la entrada y responde en función de ella.

Podría reutilizar o crear "cerebros" hechos de XML (en el formato AIML) y analizarlos/ejecutarlos en un programa (parser). Hay analizadores hechos en varios idiomas diferentes para elegir, y por lo que puedo decir, el código parece ser de código abierto en la mayoría de los casos.

 0
Author: Erk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-09 00:45:43

Puede usar "ChatterBot", y alojarlo localmente usando - 'flask-chatterbot-master"

Enlaces:

  1. [Instalación de ChatterBot] https://chatterbot.readthedocs.io/en/stable/setup.html
  2. [Host localmente usando-flask-chatterbot-master]: https://github.com/chamkank/flask-chatterbot

Salud,

Ratnakar

 0
Author: Ratnakar Chinchkar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-17 13:10:04