Lo de la IA

En esta época de hype, se ve que no puede haber nada sin Inteligencia Artificial. Está en todas partes y no hay innovación posible si no pasa porque tengas que hablar con un agente automático (el bot de toda la vida, que ahora parece más listo), o si no lleva la etiqueta IA (o AI) como coletilla.

Para no ser yo menos que nadie, a pesar de que en general lo de la IA no me gusta demasiado, voy a entrar en materia, a mi estilo, explicando las cosas de un modo claro y conciso. Creo que es un buen modo de volver a escribir sobre tecnología, entrar en un tema tan omnipresente y a la vez tan desconocido.

A pesar de que en agosto se cumplirán 5 años desde que la médica me dijo aquello de «te tengo que dar la baja, no puedes seguir trabajando así», creo que todos mis años de experiencia desarrollando soluciones de lo más variado me acreditan lo suficiente como para no decir demasiadas tonterías. Tened en cuenta que mucho de lo que viene es una opinión, un modo de ver las cosas, que irá en contra de lo que hayáis leído hasta ahora, puede que por mi simplificación absurda 🙂

Vamos al lío.

¿Qué es?

¿Qué es la Inteligencia Artificial? Menuda preguntita, tiene muy mala leche. Podríamos entrar en que es un tipo nuevo de inteligencia que acerca a las máquinas al conocimiento humano, con todas las implicaciones filosóficas que conlleva. Sin embargo, eso me parece meternos en un auténtico barrizal.

A mí me gusta verlo como que es un «nuevo» paradigma de programación.

Para los ajenos al mundo del desarrollo de software, un paradigma de programación no es más que un modo de hacer programas. Algunos de ellos son:

  • Imperativo: se especifica qué y cómo se tiene que ejecutar un programa paso a paso.
  • Declarativo: se especifica el qué ha de hacer el programa, pero no el cómo.
  • Funcional: el programa se forma por la composición de funciones de manipulación de datos.
  • Dinámico: algunas cosas como los tipos de datos se establecen en el momento de ejecución y no cuando se hace (compila) el programa.
  • Orientado a objetos: se definen tipos de datos complejos que encapsulan la información junto a las funciones que se les puede aplicar.

MovGP0, CC BY-SA 3.0, via Wikimedia Commons

Hay muchos paradigmas de programación y varios se pueden aplicar a la vez, o se puede aplicar distintos paradigmas con una única tecnología. Por ejemplo, en PHP se suele ver mucho script dinámico e imperativo, aunque se pueden crear programas estáticos y orientados a objetos.

Pues bien, la IA no es más que otro paradigma. Específicamente, es uno en el que se le da al sistema un conjunto (masivo) de datos y se le marca un modo de aprendizaje automático, y el sistema aprende por sí mismo a trabajar con los datos para crear un programa que los procese en adelante. A ese programa resultante se le llama modelo*.

* No el 100% de lo de la IA es esto, pero permitidme la reducción para facilitar la explicación.

Al usar términos distintos de los habituales se puede caer en el error de que es algo totalmente distinto, pero no, si lo piensas con detalle verás que definir un conjunto de datos y decidir que se use K-means para catalogarlos, no es muy distinto de declarar una lógica en Prolog, o definir un conjunto de clases y sus interacciones.

Las principales diferencias con los paradigmas más habituales son:

  • Los recursos (tiempo y potencia) que se requieren para la «compilación» (la creación del modelo).
  • En el momento de la declaración (cuando estableces los datos y los algoritmos estadísticos a usar) no se puede predecir el resultado. Ni siquiera usando lógica difusa se puede aventurar la exactitud del modelo, aunque con experiencia se pueda intuir una aproximación.

Ahora, como con todo paradigma, se puede conocer a varios niveles, desde ser un experto a no tener ni idea, pasando por infinitos puntos intermedios. Del mismo modo que puedes conocer lo básico de programación funcional sin saber lo que son las mónadas, o hacer programación dinámica sin siquiera entender lo que hace la reflexión, puedes usar sistemas y librerías de IA para crear modelos (programas) sin conocer, por ejemplo, cómo funcionan las redes neuronales.

¿Es nueva? ¿Por qué este boom?

La Inteligencia Artificial es un campo de estudio que existe desde hace décadas, casi desde el momento de alumbramiento de la informática. La mayoría de técnicas usadas ya existían el siglo pasado. Entonces ¿por qué ahora?

Creo que influyen dos circunstancias muy concretas que se han dado en las últimas décadas y han hecho que surja este auge actual:

  • El boom del Big Data, que también estuvo hasta en la sopa aunque ya nadie se acuerde de él, que hizo que se almacenasen cantidades ingentes de información que luego se intentaban explotar con las técnicas de la época.
  • Los avances en procesamiento paralelo que se dieron principalmente desde el surgimiento de la PlayStation 2, con los chips de tarjetas gráficas que han permitido usar técnicas de programación concurrente (otro paradigma) para procesar el Big Data en un tiempo computacional aceptable.

Parafraseando a aquella: «mezclando ácido clorhídrico con sulfato de sodio, ha hecho una reacción que flipas».

¿Es inteligente?

Deberíamos, primero, filosofar sobre qué es la inteligencia y qué tipos hay, pero muy a grosso modo podemos concretar en: NO.

Hablando de Inteligencia Artificial es seguro que todos tenemos en mente ChatGPT que es un LLM (modelo «largo» de lenguaje). Parece muy inteligente, pero en EGB un profesor (hablando con él de un niño que memorizaba la enciclopedia) me dijo que la memoria es muy diferente de la inteligencia entendida como la capacidad de razonar y resolver problemas.

ChatGPT recuerda muchas cosas, en concreto recuerda especialmente bien la cercanía estadística entre unas palabras y otras. También puede simular cierto razonamiento, haciendo deducciones básicas a partir de datos, pero le falta mucho para que podamos llamarlo inteligente en cuanto a un caso general.

Por ejemplo, las IAs generativas actuales que crean respuestas de texto, música o imágenes, no pueden actualizar sus modelos insertando en ellos nuevos casos aprendidos mientras se usan (aunque sí que se aprovechan esos datos para entrenamientos de futuras versiones del modelo). Esto es, no pueden aprender sobre la marcha (por ahora).

IA General

Lo que entendemos por inteligencia (inteligencia cognitiva al nivel de un humano), es lo que en el campo se conoce como Inteligencia Artificial General.

Es SkyNet en Terminator, la «voz del pinganillo» de Her, o el científico de Trascendence. Esa que Hollywood nos ha mostrado innumerables veces, que es capaz de realizar razonamientos lógicos y dado su acceso a todo el conocimiento humano puede convertirse en una super inteligencia que lo arregle todo.

Como el resto de la gente, no puedo ver el futuro, pero ahora mismo esa IAG no existe y estamos lejos de conseguirla.

De hecho, hace poco Apple sacó un controvertido paper (The illusion of thinking) en el que explicaba que lo que hay ahora no es más que una «burda» imitación de pensamiento. ¡No se podía saber!

Aunque es muy probable que en este caso la opinión de Apple tenga un gran sesgo por estar quedándose muy atrás en el campo de la IA y de los agentes (LLMs) con su otrora popular Siri y sus experimentos no demuestren nada, eso no hace falsa a la conclusión: los sistemas de inteligencia artificial actuales no piensan como lo haríamos los humanos.

¿Acabará con los trabajos?

¡Ojalá! Un sistema capitalista como es el mundo actual, requiere necesariamente que la gente tenga ingresos para poder ser consumidores. Si se acaba con los trabajos, el sistema debería reformularse para que la gente siga teniendo ingresos, o bien abandonar el capitalismo de manera inmediata. ¡Doble win!

Desde el momento en el que el luteranismo calvinista instauró ese «amor» por el trabajo, por el progreso (económico) y prosperar, el sistema se ha alimentado de la mano de obra que era a la vez productora y consumidora. No me pondré muy anarquista con esto, pero el «trabajo» remunerado es un pilar del capitalismo y no se puede acabar con uno sin hacerlo con el otro.

Sí que es cierto que introducirán modificaciones. Del mismo modo que la máquina de vapor cambió, por ejemplo, cómo se producían tejidos en las fábricas inglesas, la Inteligencia Artificial y los agentes conversacionales están cambiando algunos procesos que se irán depurando con el tiempo y afectará significativamente a algunas profesiones.

Sin embargo, toda introducción de una nueva tecnología ha traído cambios de este tipo y ha hecho que los profesionales se especialicen o se conviertan en artesanos, dando un nuevo valor a la producción. Volviendo al ejemplo inglés, tras la revolución industrial hubo (además de hambre y miseria) quienes se especializaron en controlar y arreglar las máquinas, y quienes siguieron haciendo las telas de un modo tradicional dándoles un extra de valor por la exclusividad.

Uno de los campos que más rápido está adoptando estas tecnologías es la programación de software, pero esto dudo que vaya a tener más implicaciones que el dejar de ver valor en el número de líneas de código, centrándose en lo importante: entender el problema y determinar la mejor solución. Esto dejaría la profesión de programador relegada a ser operadores y supervisores de estos nuevos sistemas de generación de código (especialización) o a seguir haciendo las cosas como «antiguamente» de un modo artesano que tendrá más valor simplemente por la componente «artística».

Ahora que lo dices ¿Y el arte?

Bien, hemos dado con una piedra bien gorda. Es una de las críticas más grandes que hay de las IAs generativas (además del gran consumo de recursos).

¿Se puede considerar arte algo hecho por una Inteligencia Artificial? ¿No deja de tener alma? ¿Para que queremos que las IAs hagan arte en lugar de recoger la basura?

A estas alturas de la batalla, todos hemos escuchado argumentos en una línea y su contraria. Desde que las técnicas que se usan para crear imágenes son las mismas que se usan para predecir la forma de plegar proteínas, hasta que es un robo y un plagio a los artistas.

Sin entrar en gustos, el arte generativo existe hace mucho tiempo. Es una modalidad artística en el que el artista crea máquinas o algoritmos que a partir de datos pseudoaleatorios producen piezas de arte. Por ejemplo, ahora mismo en el Centro Botín (un museo de Santander) se puede ver una exposición en la que el artista ha generado unas pistas de audio a partir del análisis de datos de la bahía de Santander como la altura de las mareas o la velocidad del viento, el artista ha hecho un algoritmo que es el que genera como resultado la obra final.

Si se considera el arte generativo como arte, hay que permitir llamar arte a las obras creadas por la IA. En este caso, los programadores de la IA serían los artistas y el operador no sería mucho más que un generador de datos pseudoaleatorios.

¿Y los datos? ¿Me van a robar? ¿Me han robado ya?

Como ya hemos dicho, para programar uno de estos sistemas de Inteligencia Artificial, uno de los elementos necesarios son datos. Muchos.

Aquí hay mucho debate por la fuente de esos datos. Por ejemplo, en el uso de descargas ilegales por parte de Meta (Facebook), o la venta de datos tan personales como puede ser el ADN.

Los temas legales suelen ser complejos y más en estos campos en los que hay que observar legislaciones de diversos países y continentes. Simplificando mucho, en España (Europa) hay dos puntos clave a tener en cuenta:

  • Datos de caracter personal. Son aquellos que permiten identificar a una persona como nombre, teléfono o dirección. Si se almacenan estos datos ha de ser por el menor tiempo necesario, haber informado claramente de que se van a recopilar y cómo se van a procesar. En principio, dado el funcionamiento de la IA, no deberían ser parte del entrenamiento porque luego no se podrían sacar del modelo generado si el usuario lo solicita.
  • Copyright. Aquí, la autoría no se puede transferir de ningún modo, sólo se pueden ceder derechos para el uso que sea hasta 70 años después de la muerte del autor, momento en el que pasa a dominio público. Por tanto, si yo compongo una canción tendría que ceder sus derechos para que una empresa de IA pueda usarla para entrenar sus modelos generativos.

Esto es lo que dice la teoría y la teoría está estupenda pero sabemos todos que la realidad es otra. Las multas que se imponen a las empresas que hacen mal uso de la información suelen ser irrisorias y los términos de uso que aceptamos para poder usar servicios en Internet acostumbran a ser tremendamente abusivos ya que no te dan opción y sólo puedes decidir entre tener el servicio o no tenerlo.

Además nos preocupamos mucho de datos tan comunes (y públicos) como el número de DNI mientras aireamos alegremente nuestras relaciones sentimentales o que estamos de vacaciones (y nuestra casa vacía), que son cosas mucho más íntimas.

Por tanto, no puedo hacer más que dar el mismo consejo que me dió Paula en su día: si no estás dispuesto a que lo sepa tu abuela, no lo pongas en Internet porque en cualquier momento puede quedar expuesto.

Si creas una obra del tipo que sea y no quieres que se use para entrenamientos, puedes poner unos términos de uso y no ceder el copyright, pero si realmente no quieres que se use lo único que está en tu mano hacer es no subirlo a Internet.

¿Cómo funciona todo esto?

No es porque lleve varias horas escribiendo, ni porque crea que no voy a saber explicarlo de un modo comprensible, pero me vais a permitir que de una explicación muy somera de cómo se hace lo de la IA. Si tenéis interés y os gusta como explico, siempre me lo podéis decir en un comentario y entramos en otros posts en materia de cómo se enseña a las IA.

Lo primero es obtener una fuente de datos y prepararla para su procesamiento. Estos datos se separan en dos paquetes, uno de entrenamiento (por ej. con el 80% de ellos) y el resto para comprobar el modelo resultante.

Con estos datos, se determina que tipo de algoritmo estadístico sirve mejor para el trabajo que queremos que haga el modelo y se entrena el modelo con ellos de tal manera que el sistema aprende por comparación.

Una vez que el modelo ha sido entrenado, se testea con el resto de datos. En caso de que el porcentaje de acierto sea suficientemente alto (un 90% por ej.), se da el modelo por bueno. Si no es así, hay que volver atrás y enfocarlo de otro modo.

En este proceso influyen muchas cosas, desde cómo se selecciona qué datos serán para entrenamiento y cuales para test, hasta cómo determinar si un resultado es satisfactorio, pero la base es esta.


Visto todo esto, la única conclusión que me gustaría dejar es que lo de la IA ni es tan nuevo, ni es tan bueno, ni es tan complejo.

Y como decía la entradilla de mi primer libro de Inteligencia Artificial:

Todo conocer depende de la estructura que conoce.

Proyecto tipo: Chatbot buscador

PROBLEMA

El cliente quiere proporcionarle a una tienda online un chatbot buscador de elementos que ayude a los usuarios.

La web dispone de un buscador que no se puede reutilizar.

La base de datos de los elementos no se encuentra accesible.

El chatbot deberá de funcionar igual para los clientes de cualquier parte del mundo.

PROPUESTA

Dado que hay muchas incertidumbres en cuanto al uso, el flujo de conversación y otros puntos del proyecto, que pretende ser de una embergadura muy amplia, se propone hacer un prototipo de chatbot buscador que cumpla con los siguientes puntos que se han acordado con el cliente:

  • El prototipo trabajará con los datos proporcionados por el CLIENTE al PRESTADOR, sobre los elementos ofertados por su cliente.
  • El idioma que entenderá y con el que contestará el prototipo será el castellano, o español de España.
  • Salvo que durante el SEGUIMIENTO DE LA EJECUCIÓN DEL CONTRATO se
    determinase lo contrario entre ambas partes, para la implementación del prototipo se emplearán los servicios de Azure proporcionados por Microsoft.
  • La entrega del prototipo incluye el asesoramiento y respaldo a la hora de la creación de cuentas y de todo lo que sea necesario para realizar su despliegue.
  • La entrega del prototipo incluye la entrega de una estimación de costes de ejecución en base al número de usos que se dé al servicio.
  • El prototipo a desarrollar, será similar al presentado en el ejemplo RealEstateBot proporcionado por Microsoft.
En concreto se implementarán:
  • Una ETL que convierta los datos originales al formato más adecuado.
  • Una base de datos distribuida sobre Azure Cosmos DB.
  • Un motor de búsqueda que será reutilizable en la web y otros servicios, empleando Azure Search.
  • Un motor para el chatbot basado en Azure Bot Service.
  • Se montarán entornos de preproducción y producción.
  • El código se almacenará en un repositorio Git.
  • Se montará un sistema de integración continua con Azure DevOps.

PRecio

6.400€

Tiempo

Dadas las incertidumbres del proyecto, el tiempo de desarrollo será de entre 3 semanas y 3 meses.

Nota aclaratoria:

Este proyecto tipo, es un ejemplo de proyecto que se ha realizado o se podría realizar. En ningún caso tiene validez como presupuesto real y sólo pretende documentar las distintas posibilidades que existen.

Actualmente, con los cambios que ha habido en cuanto a las posibilidades existentes, la propuesta podría ser diferente en estos momentos.

Se han omitido nombres de empresas y productos.

Por favor, si tuviese necesidad de algo similar, no dude en ponerse en contacto.

Tech roundup 1: a journal published by a bot

Read a tech roundup with this week’s news that our powerful bot has chosen: blockchain, AI, development, corporates and more.

Gooooooood morning, Y’all!!! Hey, this is not a test, this is a tech roundup. Time to rock it from the Delta to the DMZ.

AI, bots and robots

Blockchain and decentralization

Woman computer scientist of the week
Carolina Cruz-Neira is a Spanish-Venezuelan-American computer engineer, researcher, designer, educator, and a pioneer of virtual reality (VR) research and technology. She is known for inventing the CAVE automatic virtual environment. She previously worked at Iowa State University (ISU), University of Louisiana at Lafayette and is currently the director of the Emerging Analytics Center at the University of Arkansas at Little Rock.

Cloud and architecture

Development and languages

Quote of the week

The best code is no code at all.

Enterprises

Other news

Suscríbete al blog por correo electrónico

Introduce tu correo electrónico para suscribirte a este blog y recibir avisos de nuevas entradas.

Chatbots (III): The magic of creating chatbots without Visual Studio thanks to FormFlow

Chatbots, conversational interfaces, that started their hype two years ago are really funny but they aren’t always useful. Design a conversation having in mind all different possible options needs a lot of effort. Is it necessary to manage all possible inputs in order to manage a simple business task? Thinking about most of the apps, the answer is «no», else we wouldn’t have a lot of apps based on forms getting information to do something.

[En castellano]

Microsoft gives us, inside Bot Framework, an easy way to model tiny business functionalities that in other environments we would resolve using a simple form. FormFlow is an engine that, using a data model, can automatize a conversation to get all the information needed to fill the model and allow us to do whatever we want with the data.

Thanks to it we can use the omnipresence of chatbots to be more near to our public (because chatbots are in a lot of channels in which users are already present).

Let’s go to see how we can deploy a simple chatbot inside Azure. You will see that using FormFlow is so easy so we don’t need to open Visual Studio to code it. It will be like magic! We are going to do an emulator of the Sorting Hat from Hogwarts who decided, in J. K. Rowling stories, to what house the students of the school of magic were going.

It is a really easy example, but full of functionalities and details, that is going to be useful as a base to make any simple app that needs to get some data with which do something: calculate something (like in this case but also it could be calculating a loan conditions or the price for a car insurance), call to an API (for instance in order to record a request for a loan, or to request a call from a salesperson), or whatever comes to mind.

As most of the bot is based on the data model definition it will be an easy task no matter how complex it was, because the magic is coded by Microsoft inside FormFlow.

Our first move has to be creating a new bot over Azure (Web App Bot). To get the easy way, let’s use an example bot, so when we are creating the app we will tell to Azure that has to use the FormFlow template.

When it was deployed, we will have two elements with the same name: a Web App and the Web App Bot. Inside the Web App Bot options, we can find one (under Build menu) to edit code online, that’s the one that we will use to edit our bot’s code because it’s so simple that we don’t need to do complex things.

Bots based on FormFlow use a model, so we have to define one. Our Sorting Hat isn’t so magic like the one from Hogwarts, ours gets information from students in order to take a decision.

Fields of our model can be from basic types (integers, floating point numbers, strings, DateTimes, enumerations) and lists of enumerations. In our case, we will start only with enumerations because values that we will manage are too specific to our domain.

 public enum Nombres {
  Godric,
  Helga,
  Rowena,
  Salazar
 };  
 public enum Cualidades {
  Valentía, 
  Honestidad,
  Inteligencia,
  Ambición
 }; 
 public enum Colores {
  Rojo, 
  Amarillo,
  Azul,
  Verde
 }; 
 public enum ColoresDeJoyas {
  Oro,
  Negro,
  Bronce,
  Plata
 }; 
 public enum Animales {
  Leon,
  Tejon,
  Aguila,
  Serpiente
 }; 
 public enum LugaresParaVivir {
  TorreOscura,
  Bodega,
  TorreLuminosa,
  Mazmorras
 }; 
 public enum Titulos {
  Sir,
  Fraile,
  Dama,
  Barón
 }; 
 public enum Amigos {
  Ron,
  Neville,
  Hermione,
  Harry
 }; 
 public enum Accesorios {
  Espada,
  Copa,
  Diadema,
  Guardapelo
 } 
 [Serializable]
 public class SortingTest
 {
     public Nombres? Nombre;
     public Cualidades? Cualidad;
     public Colores? Color;
     public ColoresDeJoyas? ColorDeJoyas;
     public Animales? Animal;
     public LugaresParaVivir? LugarParaVivir;
     public Titulos? Titulo;
     public Amigos? Amigo;
     public Accesorios? Accesorio;

     public static IForm<SortingTest> BuildForm()
     {
         OnCompletionAsyncDelegate<SortingTest> evaluate = async (context, state) =>
         {
              await context.PostAsync(“OK”);
         };
         return new FormBuilder<SortingTest>()
                  .Message(“Hola”)
                  .OnCompletion(evaluate)
                  .Build();
     }
};

If you also want to manage new information like the name or the birth date, you only need to add new properties to our model that bot will manage and validate for you.

    public string TuNombre;
    public DateTime? FechaDeNacimiento;

As soon as we have our class model defined, we only have to add this to our project creating an online file and we can also delete the example model that is not related to our magic world.

We also have to do some minor changes in the controller to allow it use our new model instead of the one we deleted. The file name is MessagesController.cs and we will change references to the model on MakeRootDialog method.

    internal static IDialog<SortingTest> MakeRootDialog()
    {
        return Chain.From(() => FormDialog.FromForm(SortingTest.BuildForm));
    }

From this point, we can compile (build.cmd) and test our bot. Again, inside Web App Bot options we have one to test our bot using a web client without leaving Azure Portal. As soon as we say «Hi» it will answer us and we could see it asking us to fill the model.

When we are capturing all the data, we only have to process that and to do this we will change code inside BuildForm method of our SortingTest. If we test it again, we will see that we already have all working. However, it’s not very beautiful that if our bot is made for Spanish speakers it speaks in English. FormFlow is ready to localize it to different languages but in our case only will change some details using attributes over our model.

There are attributes for many things. For instance, we can set optional fields or create our very own validations. We will use a template attribute to change the question that is made for each field.

    [Template(TemplateUsage.EnumSelectOne, "Elige un {&} {||}", ChoiceStyle = ChoiceStyleOptions.Auto)]

There is a full language to edit messages format. In our case, {&} characters represent the field name and {||} characters different options for the user. The ChoiceStyleOptions enumeration allows us to indicate how options are shown.

If we would test again we will see that it is more elegant, but it is not elegant at all because of some language conflicts. For instance «Cualidad» is female and the question is not neutral so it’s not well-formed for female names. It’s the same for string and DateTime properties for what we didn’t change their template. We can use a similar attribute that is applied to one only property.

    [Prompt("Elige una cualidad {||}")]

FormFlow has more capabilities but with these, we could do some «tech magic» in few minutes to get something beautiful and functional. We only have to select one or more channels to publish it to start reaching our public just in the channel they are working daily. For instance, if you want to know what the Sorting Hat is thinking about you, you only have to visit javilopezg.com/SortingHat and talk to it.

Chatbots (III): La magia de crear chatbots sin abrir Visual Studio gracias a FormFlow

Los chatbots, las interfaces conversacionales, que empezaron a estar de moda hace un par de años resultan muy divertidos, pero no siempre son útiles. Requiere bastante esfuerzo diseñar una conversación teniendo en cuenta todas las opciones de respuesta que pueden plantear los usuarios. Pero: ¿es necesario controlar todas las posibles entradas para realizar una tarea de negocio? En la mayoría de las aplicaciones, la respuesta es un rotundo “no”. Si así fuese, no se basarían la mayoría de apps en formularios para recoger datos con los que hacer algo.

Seguir leyendo en CompartiMOSS.

Chatbots (II): How to make your phone read to you Hacker News (also contents)

Following the post series about Chatbots, I did an app to make Google Assistant allows you navigate using your voice throw Hacker News (Y Combinator‘s tech news forum) and listen to the body of the news in which you are more interested.

[En castellano]

If you are only interested in using it, you only have to talk to Google and say «Talk to Hacker News Reader«. However, if you want to know main points to be able to do something similar using few hours and few lines of code stay tuned: we are going to see the 6 human characteristics that are really easy to get using Dialogflow.

Dialogflow is a Google platform (formerly API.ia) that allows us to create chatbots in an easy way.

It is so powerful that allows us to do a lot of things without a single line of code.

For instance, it has integrated a natural language processing system. If you give it few training examples, it will know what our users are trying to say, driving them to different parts of our chatbot in order to give them the correct answer.

So, it will allow us to give human capacities to our chatbot in a really easy way.

1. Listening

Intents are the main component of a chatbot inside Dialogflow. It is something like a conversation unit, it is each part that our system can understand and give an answer.

Dialogflow allows us to set events and other parameters that will launch an intent. Especially, it allows writing different sentences in order to guide the chatbot. When it will detect those it will know that that is the intent it has to launch.

It also allows writing different responses that it will launch randomly avoiding you from writing code.

2. Understanding

A chatbot picking out actions based on sentences without a single line of code is great but not powerful enough. In the end, listening sentences is not the most important but understanding the concepts that are wrapped inside them.

When you are typing example phrases, you are allowed to select some words to say the platform that they are something important and that it should abstract them from single values.

At the moment in which the language understanding motor detects some of the entities that we had mapped to variables, it will extract them and send them to us as parameters in each request.

The system is ready to understand a lot of different things, but it allows us to define our own entities in order to model exactly what we want. For instance, I created an entity with different sections from Hacker News: top, new, best, ask, show and job. Then, the system can understand that a user wants that jobs uploaded to Hacker News to be read.

3. Intelligence

If intents’ answer options are not enough, we can create our very own web service to answer request understood by the system.

Google offers some libraries and using them, create a service in any language on any platform would be really easy. However, for small things like Hacker News Reader we can code right inside the platform using node.js. This code will be deployed to Firebase only with one click.

When you are thinking about things you can do you must think that coding a service (on Firebase or anywhere) you can do literally anything.

That is, you don’t need to only use APIs to access contents because you don’t have cross-origin restrictions. You have the whole Internet in your hands.

For instance, my action allows users listen to news linked from Hacker News. To do this, it downloads the web page (like a browser) and processes that to extract contents (I didn’t a hard work, it could be better).

4. Analysis

In order to use the inline editor, we have to attend some restrictions like the one that says that «dialogflowFirebaseFulfillment» must be the name of our function if we want an automated deployment.

However, thanks to Dialogflow listening and understanding, when we are giving it some intelligence we will have really easy to give analysis capacities of requests received for our chatbot.

Map each intent to functions developed by ourselves is really easy. Intents function is listening so they will say us what a user wants.

We could also access parameters understood by the system thanks to entities (understanding).

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) =&amp;gt; {
    const agent = new WebhookClient({
        request,
        response
    });
    //...

    function read(agent) {
        var number = agent.parameters.number || 0;
        //...
    }

    let intentMap = new Map();
    intentMap.set('Default Welcome Intent', welcome);
    intentMap.set('Repeat', repeat);
    intentMap.set('Back', repeat);
    intentMap.set('Read', read);
    //...
    var promise = null;
    try {
        promise = agent.handleRequest(intentMap).then(function() {
            log('all done');
        }).catch(manageError);
    } catch (e) {
        manageError(e);
    }
    return promise;
});

5. Answering

To give to our chatbot answering capacity we only have to use add method from WebhookClient. We can pass as params text, user answer suggestions or rich text cards where we can embed images, use emoticons, etc.

Keep in mind that some devices where your action may be executed could not own a display or a browser. It’s important if we want a strictly conversational interface, so we should avoid visual elements to help to our bot only with words.

6. Memory

The most disgusting thing in a conversation is having to repeat every time what we are saying so, it is really important that our bot remember what user said in previous interactions of our conversation.

For this, we will use contexts. Contexts are an element managed by Dialogflow to help to choose between intents in order to launch the correct one. They could be used to know if a client device has a display available, for instance.

Their use is not very well documented, but when you debug basic methods you see that it is trivial use them to save information between each conversation turn.

    //...
    var context = agent.getContext('vars');
    var vars = context ? context.parameters : {
        ts: (new Date()).getTime() % 10000,
        items: [],
        pointer: 0,
        list: 0,
        //...
    };
    //...
    agent.setContext({
        name: 'vars',
        lifespan: 1000,
        'parameters': vars
    });
    //...

With these 6 human capacities, you own the keys to do something similar by your own and provide a lot of functionalities to Google Assistant.

I hope they may be useful for you, the action and the information provided in this post. If yes, please share and spread the word.

We will continue with other systems that allow us to do chatbots in an easy way and with how to integrate our chatbots into other channels.

Chatbots (II): Cómo lograr que tu móvil te lea Hacker News (los contenidos también)

Siguiendo con la serie sobre Chatbots, he preparado un programilla para que Google Assistant te permita navegar usando la voz por Hacker News (el foro de Y Combinator dedicado a noticias de tecnología) y escuchar el cuerpo de las noticias que más te interesen.

[In English]

Si sólo quieres usarla basta con que le digas a Google «Talk to Hacker News Reader«. Sin embargo, si quieres conocer los puntos clave para poder hacer algo similar en pocas horas y con muy poco código sigue leyendo, porque vamos a ver 6 características humanas muy fáciles de obtener gracias a Dialogflow.

Dialogflow es una plataforma de Google (antes conocida como API.ai), que nos permite diseñar chatbots de un modo sencillo.

Es tan potente, que se pueden hacer muchísimas cosas sin tirar una sóla línea de código.

Por ejemplo, tiene integrado un sistema de reconocimiento de lenguaje natural el que, dándole unos cuantos ejemplos para que entrene, será capaz de reconocer lo que quieren decir los usuarios de nuestra acción y conducirles por las partes de nuestro chatbot para que obtengan la respuesta adecuada.

Por tanto, nos permitirá dar a nuestro chatbot de capacidades «humanas» de un modo muy simple.

1. Escucha

Los intents son el componente principal de un chatbot en Dialogflow. Lo podemos ver como cada unidad de conversación, es cada parte que nuestro sistema va a ser capaz de comprender y dar una respuesta.

Dialogflow nos permite indicar eventos y otras cosas que lanzarán ese intent, y en especial, nos permite indicar distintas frases que le sirvan de guía al chatbot, para que cuando las detecte sepa qué es ese y no otro el que tiene que lanzar.

También permite indicar directamente respuestas ahí mismo, que se irán lanzando aleatoriamente sin que tú tengas que programar nada.

2. Entendimiento

Que el chatbot pueda, sin que programemos nada, distinguir unas frases de otras es genial, pero le falta algo de poder. Al final, no sólo es importante escuchar las frases si no que también hay que entender los conceptos que están encerrados en ellas.

Al introducir las frases de ejemplo, tenemos la posibilidad de seleccionar partes del texto para decirle que es algo importante que debería abstraer y entender más allá de la muestra concreta.

Cuando el motor de reconocimiento del lenguaje entienda alguna de las entidades que hayamos mapeado a variables, las extraerá y nos las pasará como parámetros en las peticiones que nos diga que tenemos que procesar.

El sistema viene ya preparado para entender muchas cosas por defecto, pero nos da la libertad de definir nuestras propias entidades que nos ayuden a modelar exactamente lo que queremos. Por ejemplo, yo me he creado una entidad con los distintos apartados de noticias de Hacker News que se pueden leer: top, new, best, ask, show y job. Así el sistema puede entender que un usuario quiere que le lean los trabajos subidos a la plataforma o las últimas noticias.

3. Inteligencia

Cuando las opciones de respuesta de los intents no son suficientes, podemos crear nuestro propio servicio web que conteste a las peticiones que haya entendido el sistema.

Con las librerías que ofrece Google es fácil montar un servicio en cualquier lenguaje y plataforma. Sin embargo, para cosas pequeñas como el Hacker News Reader, nos permite codificar directamente sobre la plataforma código en node.js que será desplegado de manera transparente para nosotros en Firebase.

Cuando penséis en las cosas que podéis hacer, daros cuenta de que tirando de un servicio (en Firebase o dónde queráis) no estaréis ejecutando código en cliente, por lo que podéis hacer literalmente todo.

Por ejemplo, no os tenéis que ceñir a usar APIs para acceder a contenidos, pues no hay restricciones de cross origin que se apliquen a vuestro código. Tenéis todo Internet a vuestro alcance de un modo sencillísimo.

Mi acción permite al usuario escuchar las noticias que están linkadas desde Hacker News. Para esto se descarga la web (como si fuese un navegador) y la procesa para extraer el contenido (no me he esmerado mucho y se podría hacer mucho mejor).

4. Análisis

Para usar el editor inline, tendremos que tener algunas restricciones como que por narices nuestra función deberá llamarse «dialogflowFirebaseFulfillment» si queremos que se despliegue automáticamente y funcione todo bien.

Sin embargo, gracias a que Dialogflow escucha y entiende, al dotar de inteligencia a nuestro chatbot lo tendremos muy fácil para que sea capaz de realizar los análisis pertinentes de cada petición del usuario.

En el código podremos de un modo sencillo mapear cada uno de los intents que hayamos creado con funciones nuestras. Como estos se encargaban de escuchar, nos indicarán lo que el usuario quiere.

También podremos acceder a los parámetros que el sistema haya entendido gracias a las entidades que hayamos creado (entender).

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) =&gt; {
    const agent = new WebhookClient({
        request,
        response
    });
    //...

    function read(agent) {
        var number = agent.parameters.number || 0;
        //...
    }

    let intentMap = new Map();
    intentMap.set('Default Welcome Intent', welcome);
    intentMap.set('Repeat', repeat);
    intentMap.set('Back', repeat);
    intentMap.set('Read', read);
    //...
    var promise = null;
    try {
        promise = agent.handleRequest(intentMap).then(function() {
            log('all done');
        }).catch(manageError);
    } catch (e) {
        manageError(e);
    }
    return promise;
});

5. Respuesta

Para que nuestro chatbot conteste, tan solo tenemos que hacer uso del método add de nuestro WebhookClient. Podremos pasarle directamente texto, sugerencias de respuesta para guiar al usuario o fichas con texto enriquecido en dónde podremos embeber imágenes, poner emoticonos, etc.

Hay que tener en cuenta que algunos de los dispositivos en los que potencialmente correrá nuestra aplicación pueden que no tengan pantalla o navegador web por ejemplo. Por lo que hay que tener en cuenta que, si queremos algo puramente conversacional, deberíamos evitar los estímulos visuales y ayudar a nuestro bot a expresarse sólo con el uso de la palabra.

6. Recuerdo

Una de las cosas que más nos exasperan a todos es tener que repetir las cosas una y otra vez, por lo que es importante que nuestro bot recuerde lo que ya se le haya dicho.

Para esto usaremos los contextos. Los contextos es una estructura que maneja Dialogflow para ayudarnos a filtrar entre intents y permitir a la plataforma lanzar el adecuado. Se pueden usar, por ejemplo, para saber si el dispositivo del cliente tiene pantalla.

Su uso no está muy documentado, pero una vez que ves como funcionan los dos métodos básicos, es trivial su uso para guardar información entre cada frase de una conversación.

    //...
    var context = agent.getContext('vars');
    var vars = context ? context.parameters : {
        ts: (new Date()).getTime() % 10000,
        items: [],
        pointer: 0,
        list: 0,
        //...
    };
    //...
    agent.setContext({
        name: 'vars',
        lifespan: 1000,
        'parameters': vars
    });
    //...

Con estas 6 capacidades humanas ya tenéis las claves para poder hacer algo similar vosotros mismos y dar mucha más funcionalidad a Google Assistant.

Espero que os resulte útil, tanto la acción en sí como la información extra. Si es así compartidlo y difundid la palabra.

Seguiremos con algunos otros sistemas que nos permiten también hacer chatbots de un modo sencillo, y con cómo integrar nuestros bots en distintas plataformas.