Enfoque Tradicional vs. Abstracciones de IA
Para comprender mejor el valor de los bloques de construcción de IA para .NET, comparemos el enfoque tradicional con el nuevo enfoque basado en abstracciones.
En el enfoque tradicional, los desarrolladores codifican directamente contra un SDK específico, como el SDK de Azure OpenAI. Esto implica importar las bibliotecas necesarias, crear un cliente específico y llamar a los métodos correspondientes. Por ejemplo:
using Azure.AI.OpenAI;
// Crear un cliente de Azure OpenAI
var chatClient = new AzureOpenAIClient(
new Uri(endpoint),
new DefaultAzureCredential()
);
// Obtener un cliente de chat
var completion = await chatClient.CompleteChatAsync("Do code wolfs hibernate?");
// Imprimir la respuesta
Console.WriteLine($"{completion.Value.Content[0].Text}");
Este enfoque funciona, pero tiene las desventajas mencionadas anteriormente: inflexibilidad, baja portabilidad y dificultad para el mantenimiento.
Con los bloques de construcción de IA para .NET, el código se vuelve más genérico y adaptable. Primero, debemos instalar la libreria Microsoft.Extensions.AI:
Install-Package Microsoft.Extensions.AI
El código para realizar la misma tarea se vería así:
using Microsoft.Extensions.AI;
// Crear un cliente de chat
IChatClient chatClient = new AzureOpenAIClient(
new Uri(endpoint),
new DefaultAzureCredential()
).AsChatClient("testing");
// Solicitar la finalización del chat
var completion = await chatClient.CompleteAsync("Do code wolfs hibernate?");
// Imprimir la respuesta
Console.WriteLine($"{completion.Message}");
Observa cómo el código se ha vuelto más genérico. Ya no estamos codificando directamente contra un tipo específico de Azure OpenAI, sino contra una interfaz (IChatClient
). Esto nos permite cambiar la implementación subyacente sin afectar al resto del código.
En el ejemplo, lo mas importante es poder usar una interface para comunicarnos con la IA. Si una pieza de código se adhiere al contrato, puedes cambiar la implementación subyacente sin afectar al resto de tu programa.
Cambiando de Azure OpenAI a Ollama: Flexibilidad en Acción
Para demostrar la flexibilidad de los bloques de construcción de IA para .NET, veamos cómo podemos cambiar fácilmente de Azure OpenAI a Ollama, un modelo de IA local
.
Con el enfoque tradicional, esto implicaría reescribir una parte significativa del código, ya que tendríamos que importar las bibliotecas de Ollama, crear un cliente específico y llamar a sus métodos. Con los bloques de construcción de IA para .NET, el cambio es mucho más sencillo.
Simplemente, necesitamos cambiar la configuración del cliente:
// Cliente Ollama
chatClient = new OllamaChatClient(new Uri("http://localhost:11434"), "phi3:mini");
El resto del código permanece intacto. Esto se debe a que estamos codificando contra la interfaz IChatClient
, no contra una implementación específica .
Esta capacidad de cambiar entre diferentes servicios o modelos de IA con un mínimo esfuerzo es una de las mayores ventajas de los bloques de construcción de IA para .NET. Permite a los desarrolladores adaptar sus aplicaciones a las necesidades cambiantes del negocio o a las nuevas oportunidades tecnológicas.
Combinando Diferentes Capacidades de IA: Chat y Embeddings
Los bloques de construcción de IA para .NET no se limitan solo a la interacción con modelos de lenguaje. También proporcionan abstracciones para otras capacidades de IA, como la generación de embeddings. Los embeddings son representaciones numéricas del significado semántico del texto, que se pueden utilizar para realizar tareas como la búsqueda semántica, la clasificación de texto o la recomendación de contenido.
Veamos cómo podemos combinar la interacción con un modelo de lenguaje para generar texto y la generación de embeddings para comprender el significado del texto:
// Crear un cliente de embedding
IEmbeddingGenerator embeddingClient = new AzureOpenAIClient(
new Uri(endpoint),
new DefaultAzureCredential()
).AsEmbeddingGenerator(modelId: "text-embedding-ada-002");
// Generar la incrustación
var embedding = await embeddingClient.GenerateAsync(new List<string> { "What is a code wolf?" });
En este ejemplo, estamos utilizando la interfaz IEmbeddingGenerator
para generar un embedding del texto "What is a code wolf?". Podemos utilizar este embedding para comparar el significado de este texto con otros textos o para realizar otras tareas de procesamiento del lenguaje natural.
Al combinar diferentes capacidades de IA a través de abstracciones, los desarrolladores pueden construir aplicaciones aún más potentes e inteligentes.
En el código de ejemplo del video, se puede ver las implementaciones y librerias necesarias para generar los embeddings y poder realizar todo este proceso de manera satisfactoria
.