Tema 7 · Embeddings

7. ¿Qué son los Embeddings? Vectores, Dimensiones y Distancia del Coseno

Descubre cómo convertir texto y consultas humanas en vectores numéricos de alta dimensionalidad para calcular similitud conceptual.

¿Cómo Comprende una Máquina el Significado del Lenguaje?

Las computadoras y los motores de bases de datos relacionales tradicionales son excelentes comparando caracteres exactos (WHERE nombre LIKE '%laptop%'), pero son completamente ciegas ante el significado conceptual. Para un motor SQL clásico, las frases "Quiero devolver un producto defectuoso" y "¿Cómo gestiono una garantía por falla de fábrica?" tienen cero palabras en común y no coinciden.

Los Embeddings (Incrustaciones Vectoriales) resuelven este problema convirtiendo cualquier fragmento de texto en una lista ordenada de números decimales de coma flotante (un vector) que captura su esencia semántica en un espacio geométrico multidimensional.

📐 El Espacio Vectorial: En un modelo como text-embedding-3-small, cada frase se proyecta como un punto en un espacio de 1,536 dimensiones. Dos frases con significados similares quedarán situadas muy cerca la una de la otra, sin importar los sinónimos o el idioma en que estén escritas.

La Métrica Reina: Similitud y Distancia del Coseno

Para determinar qué tan parecidos son dos textos, calculamos el ángulo entre sus vectores mediante la Similitud del Coseno (Cosine Similarity):

Valor del Coseno Significado Semántico Ejemplo Comparativo
1.0 (Ángulo 0°) Significado idéntico o paráfrasis exacta. "Deseo cancelar mi suscripción" vs "Quiero darme de baja del servicio".
0.7 a 0.85 Alta afinidad temática o conceptos relacionados. "Desarrollo frontend con Vue.js" vs "Frameworks reactivos de JavaScript".
0.0 (Ángulo 90°) Totalmente ortogonales, no guardan ninguna relación. "Receta de pastel de chocolate" vs "Configuración de índices en PostgreSQL".
Distancia Coseno Métrica de distancia = 1 - Similitud. En bases de datos vectoriales (como pgvector), menor distancia significa mayor relevancia.

⚡ Generación de Embeddings y Cálculo de Similitud Coseno en PHP 8.3

Script PHP que genera el vector de dos frases con la API de Embeddings y calcula su similitud matemática pura.

generate-embeddings.php
Solo lectura
<?php
declare(strict_types=1);

// generate-embeddings.php

/**
 * Obtiene el vector numérico (1536 dimensiones) de un texto usando OpenAI.
 * @return array<int, float>
 */
function getEmbedding(string $text, string $apiKey): array
{
    $ch = curl_init('https://api.openai.com/v1/embeddings');
    curl_setopt_array($ch, [
        CURLOPT_POST           => true,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER     => [
            'Content-Type: application/json',
            'Authorization: Bearer ' . $apiKey
        ],
        CURLOPT_POSTFIELDS     => json_encode([
            'model' => 'text-embedding-3-small',
            'input' => $text
        ]),
        CURLOPT_TIMEOUT        => 15
    ]);

    $res = json_decode((string)curl_exec($ch), true);
    curl_close($ch);

    return $res['data'][0]['embedding'] ?? [];
}

/**
 * Calcula la Similitud del Coseno entre dos vectores matemáticos.
 * cos(theta) = (A · B) / (||A|| * ||B||)
 */
function cosineSimilarity(array $vecA, array $vecB): float
{
    $dotProduct = 0.0;
    $normA = 0.0;
    $normB = 0.0;

    $dim = count($vecA);
    for ($i = 0; $i < $dim; $i++) {
        $dotProduct += $vecA[$i] * $vecB[$i];
        $normA      += $vecA[$i] * $vecA[$i];
        $normB      += $vecB[$i] * $vecB[$i];
    }

    if ($normA === 0.0 || $normB === 0.0) {
        return 0.0;
    }

    return $dotProduct / (sqrt($normA) * sqrt($normB));
}

// Ejemplo de uso real:
$apiKey = getenv('OPENAI_API_KEY') ?: 'sk-test';

$frase1 = "¿Cómo restablezco mi contraseña de usuario olvidada?";
$frase2 = "Guía paso a paso para recuperar el acceso a tu cuenta";

$vec1 = getEmbedding($frase1, $apiKey);
$vec2 = getEmbedding($frase2, $apiKey);

if (!empty($vec1) && !empty($vec2)) {
    $score = cosineSimilarity($vec1, $vec2);
    echo "Similitud Coseno calculada: " . round($score, 4) . "\n";
    // Resultado típico: > 0.82 (altísima coincidencia semántica)
}
🧠
Mini-Quiz de Retención
Comprueba tu comprensión antes de pasar a la siguiente lección
1 Pregunta
Pregunta 1
¿Qué es exactamente un "Embedding" en el contexto de la Inteligencia Artificial y la búsqueda semántica?
🦉
¿Tienes dudas con este tema?
Sócrates AI puede darte analogías y explicarte este código paso a paso.

🚀 ¿Quieres dominar IA Aplicada a Desarrollo Web: APIs, RAG & Agentes y crear proyectos reales?

Aprende arquitectura limpia, desarrollo web moderno, buenas prácticas y despliegue en producción con nuestro Bootcamp Fullstack Developer con mentorías en vivo.

🏛️ Autoría y Propiedad Intelectual: Obra educativa original de David Amador para Kilopolis Academia (Solucionáticos), estructurada sobre las especificaciones y estándares abiertos del W3C, el estándar vivo de WHATWG y la documentación oficial de código abierto. © Todos los derechos reservados.