Foto de Abby Chung

Introducción

La memoria perfecta no es solo un sueño, sino una realidad tangible. Imagina tener una capacidad de recordar que nunca falla, donde cada detalle, cada pieza de información y cada experiencia se preserva con la claridad y precisión de una fotografía que nunca se desvanece. En la entrada de hoy, te llevaré a través de un ejemplo concreto de esta promesa hecha realidad mediante Kernel Memory.

En otras palabras, con la constante evolución de la inteligencia artificial y el procesamiento del lenguaje natural, la capacidad de indexar eficientemente grandes conjuntos de datos y consultarlos mediante el lenguaje natural se ha convertido en una necesidad fundamental y por esto, los grandes fabricantes de software están realizando significativas inversiones e investigaciones para lograrlo. Están dedicando recursos para desarrollar tecnologías avanzadas que permitan a las máquinas comprender y procesar el lenguaje humano de manera más intuitiva y efectiva, buscando así ofrecer soluciones cada vez más sofisticadas. Y aquí es donde entra el proyecto de codigo abierto de Microsoft: Kernel Memory.

Concepto: Memoria (Memory)

Se emplea en dos contextos distintos:

En primer lugar, MK (Memory Kernel) está diseñado para proporcionar una solución de Memoria a Largo Plazo para tus aplicaciones, emulando la habilidad humana de retener información de forma duradera. MK también introduce un método experimental para la Memoria a Corto Plazo, útil para las instrucciones de LLM. Además, MK se puede utilizar para fortalecer la Memoria Procedimental, mediante el almacenamiento de complementos, habilidades y destrezas.

En segundo lugar, al subir documentos, MK desglosa y extrae numerosos fragmentos de datos, que pueden sumar miles. Estos fragmentos frecuentemente se conocen como «memorias» o «registros de memoria», en un paralelismo con la forma en que almacenamos nuestras propias experiencias y conocimientos humanos.

¿Qué es Kernel Memory (KM)?

En esencia KM es una herramienta que indexa datos de forma eficiente y se integra con múltiples plataformas y tipos de almacenamiento, ideal para manejar una variedad de aplicaciones de datos. Es capaz de trabajar con datos estructurados y no estructurados, y admite colas de procesamiento asincrónico, adaptándose a las demandas de procesamiento de datos actuales.

¿Kernel Memory (KM) / Semantic Kernel (SK)?

La KM es una biblioteca multilenguaje que permite la integración directa con bases de datos y la búsqueda vectorial, siendo un componente del proyecto SK para implementar una memoria a largo plazo.

Por otro lado, KM es un servicio más avanzado y unificado, basado en .NET, que emerge de las experiencias obtenidas con SK, simplificando tareas complejas como la gestión segura de datos y la compatibilidad entre diferentes plataformas y lenguajes de programación.

Diferencias más destacables:

Características SK KM
Formatos Texto y Word Páginas web, PDF, Imágenes, Word, PowerPoint, Excel, Markdown, Texto, JSON, se estan añadiendo más
Búsqueda Similitud coseno Similitud coseno, Búsqueda híbrida con filtros, condiciones AND/OR
Lenguajes C#, Python, Java Cualquier lenguaje, herramientas de línea de comandos, extensiones de navegador, aplicaciones low-code/no-code, chatbots, asistentes, etc.
Motores de almacenamiento
Azure AI Search, Chroma, DuckDB, Kusto, Milvus, MongoDB, Pinecone, Postgres, Qdrant, Redis, SQLite, Weaviate Azure AI Search, Elasticsearch, Postgres, Qdrant, Redis, SQL Server, KNN en memoria, KNN en disco. En progreso: Chroma

Como podeis observar la potencia de KM es mucho mayor que la que disponemos en SM.

Para mi la frase más importante de la documentación que nos hace entender que KM es mucho más que SK es: «Kernel Memory (KM) es un servicio creado a partir de los comentarios recibidos y las lecciones aprendidas durante el desarrollo de Semantic Kernel (SK) y Semantic Memory (SM). Ofrece varias funciones que de otro modo tendrían que desarrollarse manualmente».

En la búsqueda de información comparativa, es poco probable encontrar artículos que enfrenten a Langchain con Kernel Memory (KM), ya que el auténtico rival de KM es Semantic Kernel (SK). Mi impresión es que Microsoft está canalizando sus esfuerzos para superar a SK, empleando las lecciones aprendidas para forjar KM.

Casos de uso
  1. Atención al Cliente y Chatbots:
    • Empresas que utilizan chatbots para proporcionar soporte al cliente pueden integrar la Memoria Semántica para entender y responder a preguntas complejas de los usuarios, como «¿Cómo puedo cambiar mi vuelo si ya hice el check-in?».
  2. Gestión de Conocimiento Empresarial:
    • En una empresa con una gran cantidad de documentos internos, la Memoria Semántica puede ayudar a los empleados a encontrar rápidamente la información necesaria, preguntando cosas como «¿Dónde encuentro la política de seguridad informática actualizada?».
  3. E-Commerce Personalizado:
    • Tiendas online pueden utilizar la Memoria Semántica para ofrecer recomendaciones personalizadas a los clientes basándose en búsquedas anteriores o comportamiento de compra, con consultas como «Muéstrame las mejores ofertas en zapatillas deportivas para correr».
  4. Análisis de Redes Sociales:
    • Las plataformas de redes sociales pueden aprovechar la Memoria Semántica para analizar los intereses de los usuarios y tendencias temáticas, permitiendo consultas como «Encuentra los temas más discutidos sobre sostenibilidad en los últimos meses».
  5. Servicios de Salud:
    • En el sector salud, la Memoria Semántica podría ser utilizada por profesionales para buscar información médica o casos clínicos similares, haciendo preguntas como «¿Cuáles son los tratamientos más efectivos para la diabetes tipo 2 reportados en los últimos 10 años?».
  6. Educación y Aprendizaje:
    • Instituciones educativas podrían implementar la Memoria Semántica para que los estudiantes y profesores accedan fácilmente a material educativo relevante con preguntas como «¿Qué experimentos se pueden realizar para demostrar la ley de la conservación de la energía?».
  7. Investigación Jurídica:
    • Abogados y profesionales del derecho pueden utilizar la Memoria Semántica para buscar precedentes legales o legislación relacionada con un caso específico, con consultas del tipo «Encuentra casos de uso de marca registrada en la jurisprudencia europea desde 2000».
  8. Desarrollo de software:
    • Las empresas que buscan modernizar aplicaciones desarrolladas en Delphi o Visual Basic 6 pueden enfrentar el desafío de comprender y trasladar la lógica de negocios a lenguajes modernos como C# o Java. La Memoria Semántica puede ser utilizada para indexar y catalogar toda la base de código antiguo, comentarios, documentación y registros de errores. Esto permitiría a los desarrolladores y equipos de migración formular preguntas complejas para entender mejor el funcionamiento del sistema antiguo, como «¿Cuáles son las funciones críticas que manejan el cálculo de impuestos en el sistema actual?» o «Muestra ejemplos de cómo se implementaron las transacciones de base de datos en la versión original». Al tener acceso rápido y contextual a este tipo de información, la Memoria Semántica ayuda a agilizar el proceso de migración y reduce el riesgo de perder lógica de negocios crucial durante la transición a una nueva plataforma de software.
Un ejemplo

Si no eres técnico, puede saltarte el ejemplo e ir directo al final del artículo, a la conclusión.

Por ejemplo somos una empresa que fabrica un producto y queremos hacer preguntas sobre los informes de ventas que tenemos desde hace 20 años.

var memory = new KernelMemoryBuilder()
    .WithOpenAIDefaults(Env.Var("OPENAI_API_KEY"))
    .Build<MemoryServerless>();

await memory.ImportDocumentAsync(new Document("SalesMemories-2002")
    .AddFile("Sales-2002-01.doc")
    .AddFile("Sales-2002-02.doc")
    .AddFile("Sales-2002-01.xlx")
    //add every month
    .AddTag("collection", "sales")
    .AddTag("Year", "2002"));
      
await memory.ImportDocumentAsync(new Document("SalesMemories")
    .AddFile("Sales-2023-01.docx")
    .AddFile("Sales-2023-02.docx")
    .AddFile("Sales-2023-01.xlsx")
    //add every month
    .AddTag("collection", "sales")
    .AddTag("Year", "2023"));
      
//Possible questions:
//     "How have sales fluctuated during different seasons or economic periods?"
//     "What are the buying patterns of our most loyal customers?"
//     "What promotional strategies or discounts have been most successful in driving sales?"
//     "How have competitive or market changes affected our sales over the years?"
//     "What impact have new product launches had on our overall sales?"   
var answer = await memory.AskAsync("What have been the best-selling products in each year");

Otro posible ejemplo relacionado con los casos de uso:

Me interesa profundizar en el entendimiento del proceso que transforma a un cliente potencial en un cliente consolidado, incluyendo la estrategia comercial que se aplica. También quisiera identificar los patrones de diseño implementados en la aplicación, comprender cómo se gestiona la interacción con la base de datos, y determinar si hay problemas de asincronía que afectan el rendimiento de mi aplicación.

Este enfoque no se limita exclusivamente al manejo de código heredado; también es útil para extraer información valiosa de mis recursos de desarrollo actuales.

Una de las cosas que puedes incluso preguntar es algo que he notado a lo largo del tiempo en un proyecto. Es que, ocasionalmente, algunos registros de decisiones de arquitectura (ADR, por sus siglas en inglés) quedan sin documentarse o se desvían de los acuerdos establecidos en la arquitectura. Por ejemplo, podrías hacer la siguiente solicitud al Memory Kernel: «Verifica si los ADR están siendo implementados conforme a lo acordado en la aplicación, y proporcióname un listado de los ADR que no se están cumpliendo, especificando dónde se encuentran las discrepancias.»

var memory = new KernelMemoryBuilder()
    .WithOpenAIDefaults(Env.Var("OPENAI_API_KEY"))
    .Build<MemoryServerless>();

await memory.ImportDocumentAsync(new Document("App-Front")
    .AddFile("File001.ts")
    .AddFile("File001.html")
    .AddFile("File001.css")
    // ...
    .AddTag("Project", "App-Front")
    .AddTag("Language", "React")

await memory.ImportDocumentAsync(new Document("NPM-Name01-App-Front")
    .AddFile("File001.js")
    .AddFile("File002.js")
    // ...
    .AddTag("Project", "NPM-Name01-App-Front")
    .AddTag("Language", "C#")
await memory.ImportDocumentAsync(new Document("App-Back")
    .AddFile("File001.cs")
    .AddFile("File002.cs")
    // ...
    .AddTag("Project", "App-Back")
    .AddTag("Language", "C#")

await memory.ImportDocumentAsync(new Document("NuGet-Name01-App-Back")
    .AddFile("File001.cs")
    .AddFile("File002.cs")
    // ...
    .AddTag("Project", "NuGet-Name01-App-Back")
    .AddTag("Language", "C#")

await memory.ImportDocumentAsync(new Document("Infra-App")
    .AddFile("File001.tf")
    .AddFile("File002.tf")
    // ...
    .AddTag("Project", "Infra-App")
    .AddTag("Language", "Terraform")

      await memory.ImportDocumentAsync(new Document("CICD-App")
    .AddFile("File001.yaml")
    .AddFile("File002.yaml")
    // ...
    .AddTag("Project", "CICD-App")
    .AddTag("Language", "YAML")

      await memory.ImportDocumentAsync(new Document("DoC-App-Back")
    .AddFile("File001.md")
    .AddFile("File002.docx")
    .AddFile("File003.txt")
    // ...
    .AddTag("Project", "Documentation as Code-App")
    .AddTag("Language", "DoC")      
var answer1 = await memory.AskAsync("On what infrastructure is the front end being deployed?");
var answer2 = await memory.AskAsync("What design patterns are being used throughout the application?");
Conclusión

KM continúa su desarrollo, con planes de ofrecerla como una biblioteca y hasta como un contenedor Docker pronto. Estos avances facilitarán su uso e integración en distintas aplicaciones y sistemas, haciéndola más accesible para los desarrolladores y las organizaciones.

KM es una herramienta que está revolucionando cómo trabajamos con datos y cómo hacemos preguntas en lenguaje natural a las computadoras. Es muy adaptable, fácil de integrar con otras aplicaciones y tiene el potencial de mejorar un montón de sectores diferentes. Esto la hace muy útil para cualquiera que quiera usar la inteligencia artificial y el procesamiento del lenguaje natural en lo que está creando.

KM te ofrece nuevas y eficientes formas de buscar y usar tus datos.

¿Que as observado aquí?

Que utilizar KM con ChatGPT para cargar cientos de ficheros en lugar de entrenar una inteligencia artificial exclusivamente para tus fuentes ofrece varias ventajas:

  1. Eficiencia de Costos y Tiempo: Entrenar un modelo de IA desde cero para tus fuentes específicas puede ser costoso y llevar mucho tiempo. Al usar ChatGPT con una memoria semántica, puedes aprovechar un modelo preentrenado y personalizarlo con tus datos, ahorrando así tiempo y recursos.
  2. Flexibilidad: Puedes cargar archivos con información relevante directamente en la memoria de ChatGPT, lo que permite que el sistema se adapte rápidamente a nuevos conjuntos de datos sin necesidad de un entrenamiento completo.
  3. Actualizaciones Fáciles: Si tu información cambia o se actualiza con frecuencia, es más sencillo y menos costoso cargar nuevos ficheros al sistema de memoria semántica que reentrenar un modelo completo.
  4. Acceso a Conocimientos Actualizados: ChatGPT tiene acceso a una amplia gama de conocimientos generales que se complementan con los datos específicos de tu negocio cargados en la memoria, lo que proporciona respuestas más completas y contextuales.
  5. Escalabilidad: Es más fácil escalar el uso de ChatGPT para diferentes tareas y volúmenes de datos, ya que se puede ajustar la cantidad de ficheros cargados según las necesidades sin tener que reestructurar el modelo de inteligencia artificial subyacente.
  6. Interfaz de Usuario Familiar: ChatGPT ya ofrece una experiencia de usuario refinada y familiar. Al integrar tus datos en este marco, puedes proporcionar una experiencia de usuario coherente y de alta calidad sin reinventar la rueda.
  7. Evitar el Sesgo de Modelo: Un modelo de IA entrenado exclusivamente en tus fuentes podría desarrollar sesgos basados en esa información limitada. Al usar ChatGPT, que está entrenado en una variedad más amplia de textos, podrías obtener una perspectiva más equilibrada.
  8. Reducción de Barreras Técnicas: No se requieren habilidades avanzadas en ciencia de datos para implementar la memoria semántica con ChatGPT, mientras que entrenar un modelo desde cero sí las necesita.