Prototipo de KB Assistant en GeneXus

 Es de esperar que aparezcan una cantidad interesantes de asistentes para ayudar en el desarrollo de aplicaciones GeneXus, ayudados con los modelos de inteligencia artificial y su capacidad de interpretar el lenguaje natural. 

Mi primer intento para hacer una prueba de esto, es un modelo RAG Retrieval-Augmented Generation en el que le paso una colección de documentos y los procesa dividiendo el contenido en pedazos y codificando el contenido como vectores de muchas dimensiones y almacenando el resultado en una base de datos vectorial. 

Luego se puede recuperar dichos datos de forma de encontrar textos que están semánticamente cerca de lo que estoy preguntando. 

En mi caso, lo que hice fue hacer un programa que lee una KB GeneXus y genera un txt por cada objeto. 

Si bien el contenido es diferente para los diferentes tipos de objetos, el contenido del mismo tiene la forma

Atributo : ClienteId

Descripcion: Identificador de Cliente

ClienteId es del tipo de datos Character y tiene largo 6. 

ClienteID es la clave primaria de la tabla Clientes

ClienteID es clave extranjera de la tabla Cabezal_Facturas

ClienteID es referenciado por el procedimiento ValidoCliente

ClienteID es referenciado por el reporte ImprimoFactura

ClienteID es super tipo del atributo PedidoClienteID

ClienteID es parte del indice UCliente de la tabla Cabezal_Facturas


Para los objetos Procedimiento, se ponen :

==== reglas ====

==== codigo ====

==== referencias ===

Las transacciones tienen su estructura,  eventos, reglas etc.
Las  tabla tienen estructura, con clave primaria, claves foráneas, índices, etc. 

Y asi para web panels, Panels, Data Selector, Data Providers, etc. 

Una vez que se genera un txt para cada objeto de la KB, probe subirlo a GeneXus Enterprise AI para crear un RAG Assistant que realiza el indexado de la misma. 



A partir de tener ese asistente, se puede integrar al ambiente de desarrollo, haciendo consultas en lenguaje natural para recorrer la KB, devolviendo una lista de objetos, y operando con ellas. 

Hoy se puede realizar consultas del tipo





Esto es solo un prototipo, porque cualquier asistente de este tipo, deberia estar mucho mas integrado al IDE. Se hace necesario que Genexus incorpore una base de datos vectorial, para sustituir el índice Lucene (Full Text Search). Tal vez convenga sustituir SQL Server por PostgreSQL como motor de la base de datos interna de Genexus, para poder incorporar  grafos y vectores en la base de datos de forma mas fácil. 

Creo que puede darle mayor productividad a los desarrolladores poder navegar y consultar una KB en lenguaje natural.

El pasaje por archivos de texto para cargar en el modelo es algo muy fácil de hacer, pero es muy ineficiente, porque lo ideal seria poder hacerlo en memoria y todo dentro del IDE, en forma asincrónica cuando se salve un objeto, de forma de tener la actualización suficientemente rápido.   

Otras cosas que me gustaría incorporar. 

  • Navegaciones en formato consultable
  • AST (Abstract Syntax Tree) del parser de GeneXus, para hacer mas fácil la detección de código repetido. 

Son tiempos interesantes para diseñar y pensar asistentes. 


Comentarios

  1. Son tiempos interesantes para estar en tecnología!
    Para dar una idea a los lectores (a mi incluido), cuanto tiempo te llevo hacer este asistente?

    ResponderBorrar
    Respuestas
    1. En realidad, muy poco, porque ya tenia el programa que leia la KB y generaba TXT.
      Ese era un programa que usabamos en GX 9.0 para hacer un "control de versiones" donde veiamos que habia cambiado en una KB, con las herramientas que existia en esa epoca.
      Lo que hice ahora, fue agregarle algo mas informacion de las referencias entre objetos y explicarlas en idioma español, para que sean mas facilmente consultables.
      Eso me habra llevado 8 horas, mas que nada averiguar como se interpretan las referencias en la KB GX, porque no esta documentado y tuve que preguntarlo en StackOverflow (y me lo contestaron!!!).
      Una vez que tenia los TXT, tuve que hacer un script para poder subirlos al GeneXus Enterprise AI. Ahi tuve algunos inconvenientes por temas de interpretar la documentacion, el nombre del asistente que le habia puesto blancos en el nombre, etc.
      Eso me llevo un par de dias, pero de pocas horas.
      Un vez ahi, pude probar con el Playground de Genexus Enterprise AI para hacer las preguntas que me interesaban. Y eso fue inmediato.
      Tengo varias cosas en la lista para probar:
      * Usar un JSON con formato tipo de Knowledge Graph en vez de txt para los objetos. Supongo que lo va a enteder mejor que con el texto.
      * Probar un GPT creado directamente en OpenAI, con los mismos datos y comparar los resultados.
      * Hablar con Abstracta para hacer una prueba usando la tecnologia de Microsoft en el laboratorio de AI.
      * Mejorar la integracion entre el asistente y la KB. Lo de tener que usar la API para enviar el objeto cuando cambia y consultar a traves de una API es medio matador.
      Supongo que en la versión WEB de GX IDE, la base de datos vectorial estara junto con los datos de la KB, haciendo todo esto mucho mas integrado y mas natural para el usuario.
      Como prototipo, fue un buen ejercicio.

      Borrar
  2. wow! todo esto da para otro post creo!
    nosotros hemos hecho es benchmark si con GPTS, es muy sencillo y esta bueno ver diferencias

    Con Microsoft creo que tenes varias formas de hacerlo, una muy sencilla (similar a como lo hiciste en GeneXus Enterprise AI) es utilizando Copilot Studio (es lo que antes eran los Power Agents), ahora tiene varios building blocks para resolver de manera sencilla casos de uso típicos.
    Otra alternativa es ir por Azure RAG: https://github.com/Azure/GPT-RAG
    Cuando quieras charlamos!
    Abrazo y gracias por compartir todo esto!

    ResponderBorrar

Publicar un comentario

1) Lee el post
2) Poné tu opinión sobre el mismo.
Todos los comentarios serán leidos y la mayoría son publicados.

Entradas más populares de este blog

Aplicación monolítica o distribuida?

La nefasta influencia del golero de Cacho Bochinche en el fútbol uruguayo

Funcionalidades de GeneXus que vale la pena conocer: DATE Constants.