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

Embeddings vectoriales

Aprende a convertir texto en números para habilitar casos de uso 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. Los embeddings se usan comúnmente para:

  • Buscar (los resultados se ordenan según su relevancia para una cadena de consulta)
  • Agrupamiento (las cadenas de texto se agrupan por similitud)
  • Recomendaciones (se recomiendan elementos con cadenas de texto relacionadas)
  • Detección de anomalías (se identifican valores atípicos con poca relación con los demás)
  • Medición de la diversidad (se analizan las distribuciones de similitud)
  • Clasificación (las cadenas de texto se clasifican según la etiqueta más similar a ellas)

Un embedding es un vector (lista) de números de punto flotante. La distancia entre dos vectores mide su grado de relación. Las distancias pequeñas sugieren una mayor relación y las distancias grandes sugieren una menor relación.

Visita 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 la API de embeddings junto con el nombre del modelo de embeddings (por ejemplo, text-embedding-3-small):

Ejemplo: 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 de embedding (lista de números de punto flotante) junto con algunos metadatos adicionales. Puedes extraer el vector de embedding, guardarlo en una base de datos vectorial y utilizarlo en muchos casos de uso diferentes.

{
  "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 de embedding es de 1536 para text-embedding-3-small o de 3072 para text-embedding-3-large. Para reducir las dimensiones del embedding sin perder sus propiedades de representación de conceptos, proporciona el parámetro dimensions. Encontrarás más información sobre las dimensiones de los embeddings en la sección de casos de uso de embeddings.

Modelos de embeddings

OpenAI ofrece dos potentes modelos de embeddings de tercera generación (identificados con -3 en el ID del modelo). Lee la publicación del anuncio en el blog sobre los embeddings v3 para obtener más información.

El uso se cobra por token de entrada. A continuación se muestra un ejemplo de cuántas páginas de texto se pueden procesar por dólar estadounidense (suponiendo unos 800 tokens por página):

Modelo~ Páginas por dólarRendimiento en la evaluación MTEBEntrada máxima
text-embedding-3-small62 50062,3 %8192
text-embedding-3-large961564,6 %8192
text-embedding-ada-00212 50061,0 %8192

Casos de uso

Aquí mostramos algunos casos de uso representativos con el conjunto de datos de reseñas de alimentos gourmet de Amazon.

Obtener los embeddings

El conjunto de datos contiene un total de 568 454 reseñas de alimentos publicadas por usuarios de Amazon hasta octubre de 2012. Usamos un subconjunto de las 1000 reseñas más recientes a modo de ejemplo. Las reseñas están en inglés y tienden a ser positivas o negativas. Cada reseña tiene un ProductId, un UserId, un Score, un título (Summary) y un cuerpo (Text). Por ejemplo:

ID del productoID del usuarioPuntuaciónResumenTexto
B001E4KFG0A3SGXH7AUHU8GW5Alimento para perros de buena calidadHe comprado varios de los productos enlatados de Vitality...
B00813GRG4A1D87F6ZCVE5NK1No es como se anunciaEl producto llegó etiquetado como maní salado jumbo...

A continuación, combinamos el resumen y el texto de la reseña en un solo texto. El modelo codifica este texto combinado 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 lo siguiente:

import pandas as pd

df = pd.read_csv("output/embedded_1k_reviews.csv")
df["ada_embedding"] = df.ada_embedding.apply(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 tiktoken, el tokenizador de OpenAI.

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 código de ejemplo en la guía del Cookbook de OpenAI 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 no influye demasiado.

Los embeddings de OpenAI están normalizados a una longitud de 1, lo que significa que:

  • La similitud del coseno se puede calcular un poco más rápido usando solo un producto escalar
  • La similitud del coseno y la distancia euclidiana producen el mismo orden de resultados

¿Puedo compartir mis embeddings en línea?

Sí, los clientes son propietarios de los datos que ingresan a nuestros modelos y de los resultados que obtienen, incluidos los embeddings. Es tu responsabilidad asegurarte de que el contenido que ingresas a nuestra API no infrinja ninguna ley aplicable ni 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 no tienen conocimiento de los acontecimientos ocurridos después de septiembre de 2021. Por lo general, esto no supone una limitación tan grande como para los modelos de generación de texto, pero puede reducir el rendimiento en ciertos casos excepcionales.