Agentes de chat/Texto completo

Un agente de chat (chatbot), es un programa que tiene un comportamiento como el de un robot, con la diferencia de que no tiene elementos ni acciones que requieran una forma física, sino puramente virtuales.

Pero no solamente existen agentes en los chats, también los hay en foros, en servidores de correo, servicios de mensajería instantánea, etc... En esta ocasión trataremos el tema de los agentes para chat, ya que el objetivo abstracto del proyecto es fomentar el sentimiento de equidad en las comunidades de chat por medio de un agente que informe a los usuarios nuevos y se encargue de dejarlo a la par con los antiguos miembros. Aquí nos basremos en Howie.

Contenido

editar

Para iniciarse en el mundo de los chatbots los más recomendable sería probar uno desarrollado previamente por alguien más. El website AgentLand posee una amplia base de datos con información sobre agentes de todo tipo, se podría buscar uno ahí. Sin embargo, este tutorial, aunque no esté en el título, se basa principalmente en el estudio, análisis, modificación y traducción del poderoso chatbot Howie

OpenCyc

editar

Uno de los principales puntos a tener en cuenta en la modificación de Howie, es la vinculación de su cerebro con la base da conocimientos de Cyc.

Cyc es una base de datos de conocimientos humanos con ciertos conceptos y relaciones definidas específicamente, que describen la unión o relación entre los conceptos. La ventaja de usar esta base en un proyecto de inteligencia artificial, es que ésto brindaría más sentido común al robot en cuestión. Recordemos que nuestro robot, en esa ocasión, es realmente un chatbot. La base de datos está escrita en un lenguaje formal llamado CycL, lo cual da ciertas facilidades para que una máquina pueda entenderlo, a diferencia de lo que ocurriría si se usara un lenguaje natural como el inglés en lugar de uno formal como el lenguaje matemático o CycL en este caso.

La empresa CyCorp tiene un proyecto llamado OpenCyc, cuya idea principal es dar acceso libre a la base de datos.

Instalar OpenCyc en Linux

editar

Lo primero por hacer sería descargar el archivo tgz de OpenCyc, en La página de descargas de Opencyc se encuentran varias direcciones, recomiendo usar la de SourceForge. Luego de haberlo descargado, sigue los siguientes pasos:

  • Descomprime el archivo descargado
tar xvfz opencyc-0.7.0.tgz
  • Ve al directorio:
cd opencyc-0.7.0/scripts/linux
  • Abre el servidor:
./run-cyc.sh
  • Después de algún tiempo cargando el mundo en la memoria, verás:
Loading statics.
Mapping in the memory image.
Running initializers ... PROCESS (1031), PROCESS (1053), done.
Copyright (C) 1995 - 2002 Cycorp, Inc.  All rights reserved.
RTL initialized.
CycL Initialized.
Enabling base TCP services to port 3600.

Ready for services.
System 1.2594 KB 567.
CYC(1):
  • Ahora que el servidor se está ejecutando, puedes acceder a él desde la siguiente dirección utilizando tu navegador favorito:
http://HOSTNAME:3602/cgi-bin/cyccgi/cg?cb-start

Donde HOSTNAME es reemplazado por la dirección del equipo donde está corriendo el servidor. Si estás usando el mismo equipo, reemplaza HOSTNAME por localhost, presiona enter y voilà, está listo el acceso al servidor OpenCyc

Login en el servidor

editar

Este es un punto importante, pues cuando accedes al servidor, éste te identifica automáticamente como Guest, lo cual es una ventaja realmente poco ventajosa, pues el acceso a la base de datos no es total. La manera de solucionar este problema es simple, Escribe CycAdministrator en la caja de texto del Login y habrás ingresado al sistema con todos los privilegios de un administrador. Una vez así, intenta loguearte con el nombre de usuario que desees utilizar y esta vez te dará una opción para crearlo (no como cuando lo intentaste sin haber leído esta explicación) y de esta manera accederás al sistema con un nombre con más estética que CycAdministrador (o al menos eso espero).

Consultando la información existente en la base de conocimiento

editar

Antes de añadir cualquier infomación a la base de conocimiento es importante saber como consultar información en la misma, de modo tal que la información que se agregue sea consistente con la ya existente. Esto es debido a que el motor inferencial de Cyc se basa en ontologías y estas presentan una descripción organizada y jerárquica del conocimiento, de modo que es conveniente saber en qué lugar de dicha jerarquía se ha de adicionar la información. Dado que el conocimiento en el motor inferencial está escrito en inglés, las búsquedas deben hacerse en este idioma, para aprovechar todo el conocimiento ya declarado.

Advertencia: Los ejemplos a continuación acerca de las consultas está inspirados en la documentación en inglés para el manual de la versión 0.7 pero están actualizados suponiendo que usted usa la última versión en desarrollo (la 0.9).

Supongamos acabas de comprar un par de gatos llamados Tom y Silvestre y quieres indicar esto en OpenCyc. Lo primero que debes hacer entonces es buscar qué existe acerca de estos animales dentro de la base de conocimiento. Para hacer consultas en la base de conocimiento haz lo siguiente:

Carga la página de Inicio. Eligiendo cualquiera de estos dos enlaces:

Verás algo como esto (Para ver la captura de pantalla más grande haz click sobre la misma):

 
Página de inicio de Opencyc (en su versión 0.9)

En la parte superior izquierda existe una caja de texto donde puedes colocar un palabra que desees buscar y luego le das click en "Search".

Añadir constantes a la base de conocimiento

editar

Una vez logueado como algo diferente a Guest, haz click en el botón Create (en la parte superior) y en el cuadro de texto de la parte central, escribe el nombre de la constante que deseas crear, por ejemplo Terminator y presiona Create Constant o Enter. Pero, ¿qué sucede si el Terminator que deseas agregar no es la película sino el guión? En OpenCyc existe una forma predeterminada de identificar las constantes que consiste en escribir una raya y algo que caracterize a la constante, por ejemplo Terminator-ElGuión o Terminator-LaPelícula.

Algo del código de OpenCyc

editar

Como ya se ha mencionado antes, la base de conocimientos de OpenCyc está escrita en CycL, un lenguaje derivado del Lisp y del cálculo de predicados. El problema es que después de analizar los archivos dentro del directorio src de OpenCyc, nos encontramos con una serie de archivos de Java... ¿qué hacer ante ésto? La verdad es que se vive un cambio de paradigma bastante inesperado, pero éste realmente no debería ocurrir, pues si miramos con atención el código utilizando algún editor como jEdit, notaremos que se utilizó Java para interpretar el código CycL... Algo así como el método de interpretación de AIML de Howie. Los verdaderos archivos .lisp no están en la carpeta src, sino por fuera, en el resto de directorios de OpenCyc.

AIML es una extensión del XML (Extensible Markup Language). El XML fue diseñado para describir datos, no para mostrarlos como el html. El XML se concentra en lo que los datos son. La mayoría de procesos para comprender y responder realizados por Howie están descritos utilizando un grupo específico de etiquetas de XML denominado AIML. En Python, lo único realmente programado es la interpretación de ese código y el control de algunas funciones básicas como guardar registro de las conversaciones o acceder a servidores de chat. En el XML el diseñador define las etiquetas propias que usará en su proyecto, escribiéndolas como así lo desee, lo importante es que el programa que lea el código XML sepa cómo se interpreta cada una de las etiquetas.

  • He aquí un ejemplo:
<mensaje>
<de>Luis</de>
<para>Offray</para>
<cuerpo>¡No olvide revisar el Wiki del proyecto!</cuerpo>
</mensaje>
  • Un programa que interpretara este código, debería hacerlo de la siguiente manera:
MENSAJE
De: Luis
Para: Offray
¡No olvide revisar el Wiki del proyecto!

Aunque realmente la forma en que se mostraría depende de cómo el programador desee que sean interpretadas las etiquetas.

El código AIML de Howie

editar

En Howie, declarar nuevos conocimientos por el medio de diálogo es bastante simple, basta con escribir alguna afirmación y luego decir: "Remember that.". Si todo sale bien, Howie debería responder: "Don't worry, I will remember it.". Sim embargo, esta forma de enseñarle al programa nuevo conocimiento no permite entrelazar algunas sentencias con otras, de manera que deberás modificar el código AIML.

  • Una muestra del código de Howie es:


<category>
<pattern>NO</pattern>
<template>
<random>
<li>OK.</li>
<li>I understand.</li>
<li>I see.</li>
<li>Why so negative?</li>
<li>Is that all you have to say?</li>
<li>"<that/>"?  Not?</li>
</random>
</template>
</category>

Donde <pattern> define lo que se la ha de decir a Howie para que responda lo que está en <li>. La etiqueta <random> sirve para que las respuestas listadas a continuación se seleccionen de manera aleatoria antes de ser enviadas. Pero estas etiquetas no fueron creadas por los primeros desarrolladores de Howie (¡o quién sabe!), sino que hacen parte del código estándar AIML, por lo cual un interpretador de AIML escrito en Python, como el que utiliza Howie, podría leer cualquier código XML que utilice las etiquetas del AIML. Una buena manera de agregar categories, o sea conocimientos a Howie, o de hecho, a cualquier chatbot que use AIML, es utilizando el Program N, una sencilla aplicación OpenSource diseñada para interactuar con chatbots, puedes encontrarla en la página de Daxtron Labs.

Cyn: Cyc y Program N

editar

Como ya se ha explicado previamente, Program N es una aplicación para interactuar con chatbots y Cyc es el motor de inferencia cuyo hijo, OpenCyc, usaremos en este proyecto. Cyn no es otra cosa que la unión entre esos dos programas, con el fin de modificar con OpenCyc por medio de AIML. En pocas palabras: Modificar la base de conocimientos utilizando lenguaje natural y no formal.

Cómo hacer que Cyn funcione

editar

Primero que todo, hay que correr el servidor de OpenCyc como se explica más arriba. Al ejecutar Cyn vemos que hay un menú llamado AIML, al seleccionarlo encontramos una opción llamada Learn... Sirve para cargar información de archivos AIML a la memoria de Cyn. Sleccionaremos el archivo AIML/AAA/filelist.txt y esperaremos a que la información se cargue. Al parecer algunos de los archivos contienen información suministrada en AIML acerca del acceso a OpenCyc por parte de Cyn y cuando la carga termina y activamos el Chat, listo, estamos hablando con el motor de inferencia de OpenCyc por medio de lenguaje natural (inglés).

Cyn en Linux

editar

Ya que Cyn es una aplicación desarrollada para la plataforma Microsoft Windows, hay que ejecutarla con el emulador Wine de Linux. Bastará con haber descomprimido los archivos correctamente en algún directorio de la partición de Linux para que funcione. Escribe wine nombredelarchivo en la terminal de comandos y si es la primera vez que ejecutas Wine, tendrás que configurarlo, recuerda mirar cada una de las opciones, especialmente las que sirven para ubicar los directorios del sistema Windows.

El único problema es que, al parecer, es imposible para Wine emular el msagent que utilizó el programador de Cyn para darle interactividad al programa. Al no funcionar el msagent, el chatbot nos responde con un error de aspecto un tanto desagradable. Por ende, la única solución posible que veo es modificar el código de Cyn, aprovechando que es OpenSource, y quitar el msagent...

Cómo añadir nuevo conocimiento a la base de datos

editar

El asunto es bastante sencillo, ya que estamos usando lenguaje natural gracias a Cyn, lo adecuado para crear nuevas constantes es escribiendo Make La Constante Lo Que Sea.

  • Un buen ejemplo sería el siguiente:
Make Simon a Dog
  • Donde Cyn debería responder:
200 #$Simon
200 T

...y listo, ya has creado una nueva constante utilizando lenguaje natural.

AIML y OpenCyc

editar

Para acceder a OpenCyc desde afuera, la forma más simple es utilizando la API (Application Program Interface) de CycL, que define una serie de funciones y módulos que permiten una conexión entre OpenCyc y aplicaciones externas escritas en C, Python, Lisp, etc, por medio del protocolo TCP/IP. Algunas de las funciones más básicas incluidas en este set son:

  • (fi-complete "cadena")
devuelve una lista de símbolos que se relacionen con "cadena"
  • (cyc-find-or-create cycsymbol)
devuelve el símbolo si lo encuentra, si no entonces lo crea
  • (cyc-assert '(cycformula) #$MicrotheoryMt)
agrega (cycformula) a los hechos especificados en MicrotheoryMt
  • (cyc-unassert '(cycformula) #$MicrotheoryMt)
elimina (cycformula) de los hechos especificados en MycrotheoryMt
  • (cyc-ask '(fórmula) #$MicrotheoryMt)
pide a Cyc que encuentre las respuestas a la fórmula en una Microteoría específica.
Nota que Cyc utilizará sus habilidades inferenciales para hallar las respuestas.

Las microteorías son pequeños racimos de datos desprendidos de otros y asociados entre sí

Literate Programming

editar

Programación literata es, según ciertos criterios semánticos, la traducción más atinada de Literate Programming, término utilizado para referirse a cierta metodología para el desarrollo de programas que consiste en darle prelación a la documentación de un programa frente el código. Es decir, se concentra en describir el problema para resolver con el programa, las posibles soluciones, la descomposición del programa en fragmentos más sencillos, la descripción de cada fragmento y, finalmente, el código de cada fragmento. En otras palabras, para trabajar con la programación literata, el primer paso a llevar a cabo es concentrarse en explicarle a un ser humano lo que uno quiere que el programa haga en lugar de explicarle a un computador. Para ésto es necesario mezclar el lenguaje formal de programación con el natural de la documentación, de tal manera que uno complemente al otro y escoger con criterio los nombres de las variables.

CWEB: sistema de documentación estructurada

editar

La estructura de un programa puede ser vista como una serie de piezas interconectados en un red (WEB). Para documentar un programa se debe explicar cada pieza de la red y su relación con las demás. La filosfía CWEB indica que todo buen programador necesita dos herramientas a la hora de escribir su código: una herramienta de formato como TeX y una herramienta para escribir el código como C, pues ninguno de los dos proveerá al programador de utilidades adecuadas para documentar el programa, pero juntos pueden convertirse en una poderosa arma. Las habilidades tipográficas de TeX o LaTeX nos permiten ofrecer al lector del código una explicación de la estructura de cada parte del programa haciendo esta estructura visible. Las herramientas de programación de las que nos proveen lenguajes como C, hacen posible la especificación de algoritmos formalmente y sin dar paso a ambigüedades.