Embeddings para principiantes - la explicación definitiva.

marzo 15, 2024

00:00/00:00
¿Terminaste de escuchar? Haz click aquí para calificar el episodio.

Comentarios adicionales
Contenido
  1. Random Tech Talks: Resumen del Episodio
  2. ¿Qué son los Embeddings?
  3. ¿Cómo Funcionan?
  4. Innovaciones en IA: Devin y Figure 01
    1. Links
    2. Código fuente
    3. Invitación

Random Tech Talks: Resumen del Episodio

En este episodio fascinante de "Random Tech Talks", nos sumergimos en el intrigante mundo de los embeddings, una herramienta esencial en el campo del aprendizaje automático y la inteligencia artificial. Este tema, presentado de manera amigable para principiantes, nos revela cómo estos vectores de características pueden capturar la esencia de los datos de maneras increíblemente eficientes y multifacéticas.

¿Qué son los Embeddings?

Los embeddings son, básicamente, representaciones numéricas de alta dimensión de datos complejos como palabras, imágenes o incluso comportamientos de usuarios. Lo que los hace tan poderosos es su capacidad para preservar relaciones semánticas, como la cercanía entre conceptos o la similitud entre características, en un espacio de menor dimensión.

¿Cómo Funcionan?

A través de ejemplos ilustrativos, se explica cómo algoritmos como Word2Vec transforman palabras en vectores, permitiendo operaciones matemáticas que reflejan relaciones semánticas reales. Por ejemplo, la famosa ecuación "Rey - Hombre + Mujer = Reina" se convierte en una realidad en este espacio vectorial.

Aplicaciones en Realización de Preguntas y Respuestas Generativas (RAG) Una aplicación emocionante de los embeddings se encuentra en los sistemas de Realización de Preguntas y Respuestas Generativas (RAG), donde se combinan con modelos de lenguaje para generar respuestas informativas y contextualmente relevantes. Esto no solo mejora la precisión de las respuestas en asistentes virtuales y motores de búsqueda, sino que también abre puertas a formas más naturales de interacción hombre-máquina.

Innovaciones en IA: Devin y Figure 01

El episodio también abordó brevemente las últimas innovaciones en el campo de la IA, destacando a Devin, el primer ingeniero de software potenciado por inteligencia artificial, cuya capacidad para escribir y optimizar código está desafiando nuestras nociones tradicionales del desarrollo de software. Por otro lado, se mencionó a Figure 01, el robot autónomo que ha dejado atrás las demostraciones tecnológicas de Elon Musk, mostrando habilidades y autonomía que parecen sacadas de la ciencia ficción, desde navegación independiente hasta interacciones complejas con el entorno.

Este episodio no solo aclara conceptos fundamentales de la IA para los entusiastas de la tecnología sino que también ilustra el impacto profundo y creciente de estos avances en nuestra sociedad. La discusión sobre Devin y Figure 01, en particular, nos invita a reflexionar sobre el futuro de la tecnología y su papel en redefinir los límites de lo posible.

Google Machine Learning Crash Course: Embeddings:

Merriam-Webster: RAG

Video de Figure 01


Puedes ver este episodio en YouTube

Código fuente

Incluimos aquí el código fuente tal y como se vio en el programa. Recuerda que

  • Necesitas un Key de OpenAI. Una vez que lo obtengas, lo guardas en un archivo que debe llamarse .env

  • Guarda este código en un archivo que se llame embedText.js o como quieras :)

require('dotenv').config();
const { Configuration, OpenAIApi } = require("openai");

if (process.argv.length < 2) {
    console.log("Uso: node embedText.js <'texto'>");
    process.exit(1);
}

var textToEmbed = ''
var arregloEmbeds = new Array();

const readline = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});

function askForInput() {
  readline.question('Introduce un texto (o "exit" para salir): ', async(input) => {
    if (input.toLowerCase() === 'exit') {
      console.log('Hasta luego.');
      readline.close();
    } else {
      console.log(`Tu texto: ${input}`);
        textToEmbed = input
       embedding = await getEmbedding(textToEmbed);

        // Lo comparo
        comparaEmbeds(embedding, textToEmbed);

        // Y lo agrego al arreglo
        arregloEmbeds.push({
            "texto": textToEmbed,
            "embedding": embedding,
            "similitud": 0.0
        });
        //arregloTextos.push(textToEmbed);
      askForInput(); // Siguiente embedding
    }
  });
}


// Setup OpenAI API
const configuration = new Configuration({
    apiKey: process.env.OPENAI_API_KEY,
});
const openai = new OpenAIApi(configuration);

askForInput(); // Llamada inicial

async function getEmbedding(text) {
    try {
         console.log('creando embedding')
        const response = await openai.createEmbedding({
            model: "text-embedding-ada-002", // or choose another model as needed
            input: text,
        });
        console.log(response.data.data[0].embedding);
        return response.data.data[0].embedding;
    } catch (error) {
        console.error("Error generando embedding:", error);
    }
}

async function generateResponse(text) {
  const response = await openai.createCompletion({
    model: "gpt-3.5-turbo-instruct",
    prompt: text,
    temperature: 0.7,
    max_tokens: 150,
  });
  console.log(response.data.choices[0].text.trim());
}

function comparaEmbeds(ultimoEmbedding, ultimoTexto) {
    console.log(ultimoTexto);
    if (arregloEmbeds.length <= 1)
        return;

    let similares = arregloEmbeds.map(item => ({
        texto: item.texto,
        similitud: cosineSimilarity( item.embedding, ultimoEmbedding)
    }));
    console.log(similares)

    arregloEmbeds.forEach((item, index) => {
        item.similitud = similares[index]
    });

    arregloEmbeds.sort((a, b) => b.similitud - a.similitud);

    generateResponse(`Eres un asistente que quiere contestar 
            la pregunta siguiente: 

            ${ultimoTexto} 
            y la respuesta que debes tomar en cuenta es 

            ${arregloEmbeds[0].texto}. 

            Escribe un texto de máximo 100 palabras dando amablemente esta respuesta.`);

}

function cosineSimilarity(vecA, vecB) {
  let dotProduct = 0;
  let normA = 0;
  let normB = 0;
  for (let i = 0; i < vecA.length; i++) {
    dotProduct += vecA[i] * vecB[i];
    normA += vecA[i] ** 2;
    normB += vecB[i] ** 2;
  }
  return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
}

Invitación

Te invitamos a escuchar este episodio y participar en nuestras redes sociales, sobre todo en la página de Facebook que está en en este link.

Este y todos los demás episodios de Random Tech Talks pueden escucharse en rtt.show, y en todas las plataformas de podcast (si encuentras una en la que no estamos, avísanos!).

Si te gustó este episodio no dejes de suscribirte y recomendarnos con amigos y enemigos, y sobre todo con todos los que creas se beneficiarían de saber un poco más de tecnología platicada desde un nivel más terrenal.



Comentarios adicionales
← Ver más episodios