For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
Navegación principal
Theme

Embeddings vectoriales

Aprende a convertir texto en números para aplicaciones como la búsqueda.

New embedding models
text-embedding-3-small and text-embedding-3-large, our newest and most performant embedding models, are now available. They feature lower costs, higher multilingual performance, and new parameters to control the overall size.

¿Qué son los embeddings?

Los embeddings de texto de OpenAI miden el grado de relación entre cadenas de texto. Entre sus usos más comunes se encuentran los siguientes:

  • Búsqueda (los resultados se ordenan según su relevancia para el texto de la consulta)
  • Agrupamiento (las cadenas de texto se agrupan por similitud)
  • Recomendaciones (se recomiendan elementos cuyas cadenas de texto están relacionadas)
  • Detección de anomalías (se identifican valores atípicos que tienen poca relación con los demás)
  • Medición de la diversidad (se analizan las distribuciones de similitud)
  • Clasificación (a cada cadena de texto se le asigna la etiqueta más similar)

Un embedding es un vector (una lista) de números de punto flotante. La distancia entre dos vectores mide el grado de relación entre ellos. Una distancia pequeña sugiere una relación estrecha y una distancia grande sugiere una relación débil.

Consulta nuestra página de precios para conocer los precios de los embeddings. Las solicitudes se facturan según la cantidad de tokens en la entrada.

Cómo obtener embeddings

Para obtener un embedding, envía tu cadena de texto al punto de acceso de embeddings de la API junto con el nombre del modelo de embeddings (por ejemplo, text-embedding-3-small):

Ejemplo: cómo obtener embeddings
import OpenAI from "openai";
const openai = new OpenAI();

const embedding = await openai.embeddings.create({
  model: "text-embedding-3-small",
  input: "Your text string goes here",
  encoding_format: "float",
});

console.log(embedding);

La respuesta contiene el vector del embedding (una lista de números de punto flotante) junto con algunos metadatos adicionales. Puedes extraer el vector, guardarlo en una base de datos vectorial y usarlo en distintas aplicaciones.

{
  "object": "list",
  "data": [
    {
      "object": "embedding",
      "index": 0,
      "embedding": [
        -0.006929283495992422, -0.005336422007530928, -4.547132266452536e-5,
        -0.024047505110502243
      ]
    }
  ],
  "model": "text-embedding-3-small",
  "usage": {
    "prompt_tokens": 5,
    "total_tokens": 5
  }
}

De forma predeterminada, la longitud del vector es de 1536 para text-embedding-3-small y de 3072 para text-embedding-3-large. Para reducir las dimensiones del embedding sin que pierda su capacidad de representar conceptos, especifica el parámetro dimensions. Encontrarás más información sobre las dimensiones de los embeddings en la sección de casos de uso.

Modelos de embeddings

OpenAI ofrece dos potentes modelos de embeddings de tercera generación (identificados por -3 en el ID del modelo). Para obtener más información, lee el anuncio en el blog sobre los modelos de embeddings v3.

El uso se cobra por token de entrada. La siguiente tabla muestra cuántas páginas de texto puedes procesar por dólar estadounidense, suponiendo que cada página contiene unos 800 tokens:

Modelo Páginas por dólar (aprox.) Rendimiento en la evaluación MTEB Entrada máxima (tokens)
text-embedding-3-small 62 500 62,3 % 8192
text-embedding-3-large 9615 64,6 % 8192
text-embedding-ada-002 12 500 61,0 % 8192

Casos de uso

A continuación mostramos algunos casos de uso representativos con el conjunto de datos de reseñas de productos alimenticios de Amazon.

Obtención de los embeddings

El conjunto de datos contiene 568 454 reseñas de alimentos publicadas por usuarios de Amazon hasta octubre de 2012. Para estos ejemplos usamos las 1000 reseñas más recientes. Las reseñas están en inglés y suelen ser positivas o negativas. Cada reseña incluye un ProductId, un UserId, una calificación (Score), un título (Summary) y un cuerpo de texto (Text). Por ejemplo:

ID del producto ID del usuario Calificación Resumen Texto
B001E4KFG0 A3SGXH7AUHU8GW 5 Good Quality Dog Food I have bought several of the Vitality canned…
B00813GRG4 A1D87F6ZCVE5NK 1 Not as Advertised Product arrived labeled as Jumbo Salted Peanut…

En el siguiente ejemplo, combinamos el resumen y el cuerpo de la reseña en un solo texto. El modelo codifica ese texto y genera un único embedding vectorial.

Get_embeddings_from_dataset.ipynb
import { mkdir, writeFile } from "node:fs/promises";
import OpenAI from "openai";

const client = new OpenAI();
const reviews = ["A rich cup of coffee.", "A bright herbal tea."];

const response = await client.embeddings.create({
  model: "text-embedding-3-small",
  input: reviews.map((review) => review.replaceAll("\n", " ")),
});

const csvField = (value) => `"${value.replaceAll('"', '""')}"`;
const rows = response.data.map(({ embedding }, index) =>
  [csvField(reviews[index]), csvField(JSON.stringify(embedding))].join(",")
);

await mkdir("output", { recursive: true });
await writeFile(
  "output/embedded_1k_reviews.csv",
  ["combined,ada_embedding", ...rows].join("\n") + "\n"
);

Para cargar los datos desde un archivo guardado, puedes ejecutar el siguiente código:

from ast import literal_eval
import pandas as pd

df = pd.read_csv("output/embedded_1k_reviews.csv")
df["ada_embedding"] = df.ada_embedding.apply(literal_eval).apply(np.array)

Preguntas frecuentes

¿Cómo puedo saber cuántos tokens tiene una cadena antes de generar su embedding?

En Python, puedes dividir una cadena en tokens con el tokenizador de OpenAI tiktoken.

Código de ejemplo:

import tiktoken


def num_tokens_from_string(string: str, encoding_name: str) -> int:
    """Returns the number of tokens in a text string."""
    encoding = tiktoken.get_encoding(encoding_name)
    num_tokens = len(encoding.encode(string))
    return num_tokens


num_tokens_from_string("tiktoken is great!", "cl100k_base")

Para los modelos de embeddings de tercera generación, como text-embedding-3-small, usa la codificación cl100k_base.

Encontrarás más detalles y ejemplos de código en la guía de OpenAI Cookbook sobre cómo contar tokens con tiktoken.

¿Cómo puedo recuperar rápidamente los K vectores de embeddings más cercanos?

Para buscar rápidamente entre muchos vectores, recomendamos usar una base de datos vectorial. Puedes encontrar ejemplos de cómo trabajar con bases de datos vectoriales y la API de OpenAI en nuestro Cookbook en GitHub.

¿Qué función de distancia debo usar?

Recomendamos la similitud del coseno. Por lo general, la elección de la función de distancia influye poco en los resultados.

Los embeddings de OpenAI están normalizados para que su norma sea igual a 1. Esto tiene dos consecuencias:

  • Puedes calcular la similitud del coseno un poco más rápido con solo un producto escalar.
  • La similitud del coseno y la distancia euclidiana producen exactamente el mismo orden de resultados.

¿Puedo compartir mis embeddings en línea?

Sí. Como cliente, eres titular de los datos que ingresas en nuestros modelos y de los resultados que obtienes, incluidos los embeddings. Es tu responsabilidad asegurarte de que el contenido que envíes a nuestra API cumpla con todas las leyes aplicables y con nuestros Términos de uso.

¿Los modelos de embeddings V3 conocen los acontecimientos recientes?

No. Los modelos text-embedding-3-large y text-embedding-3-small desconocen los acontecimientos posteriores a septiembre de 2021. Por lo general, esta limitación tiene menos impacto que en los modelos de generación de texto, aunque en algunos casos poco comunes puede reducir el rendimiento.