For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
Navegação principal
Theme

Embeddings vetoriais

Aprenda a transformar texto em números para aplicações como a busca.

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.

O que são embeddings?

Os embeddings de texto da OpenAI medem o quanto dois textos se relacionam. Entre os usos mais comuns dos embeddings estão:

  • Busca (os resultados são ordenados por relevância para a consulta)
  • Agrupamento (os textos são agrupados por similaridade)
  • Recomendações (são recomendados itens cujos textos se relacionam)
  • Detecção de anomalias (são identificados itens atípicos com pouca relação com os demais)
  • Medição da diversidade (são analisadas as distribuições de similaridade)
  • Classificação (cada texto é classificado de acordo com o rótulo mais semelhante a ele)

Um embedding é um vetor (lista) de números de ponto flutuante. A distância entre dois vetores mede o grau de relação entre eles. Distâncias pequenas sugerem uma relação forte, e distâncias grandes sugerem uma relação fraca.

Consulte nossa página de preços para saber quanto custa gerar embeddings. O valor de cada solicitação depende do número de tokens na entrada.

Como obter embeddings

Para obter um embedding, envie seu texto ao endpoint da API de embeddings junto com o nome do modelo de embeddings (por exemplo, text-embedding-3-small).

Exemplo de como obter 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);

A resposta contém o vetor de embedding (uma lista de números de ponto flutuante) e alguns metadados adicionais. Você pode extrair o vetor, salvá-lo em um banco de dados vetorial e usá-lo em diversas aplicações.

{
  "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
  }
}

Por padrão, o vetor de embedding tem 1536 dimensões no modelo text-embedding-3-small ou 3072 no modelo text-embedding-3-large. Para reduzir o número de dimensões do embedding sem que ele perca a capacidade de representar conceitos, informe o parâmetro dimensions. Saiba mais sobre as dimensões dos embeddings na seção sobre casos de uso.

Modelos de embeddings

A OpenAI oferece dois modelos avançados de embeddings de terceira geração (identificados por -3 no ID do modelo). Para mais detalhes, leia o anúncio de lançamento dos modelos de embeddings v3.

O uso é cobrado por token de entrada. A tabela mostra quantas páginas de texto é possível processar por dólar americano, considerando cerca de 800 tokens por página.

Modelo Páginas por dólar (aprox.) Desempenho na avaliação MTEB Entrada máxima
text-embedding-3-small 62.500 62,3% 8192
text-embedding-3-large 9.615 64,6% 8192
text-embedding-ada-002 12.500 61,0% 8192

Casos de uso

Os exemplos a seguir ilustram alguns casos de uso com o conjunto de dados de avaliações de produtos alimentícios da Amazon.

Como obter os embeddings

O conjunto de dados contém 568.454 avaliações de produtos alimentícios publicadas por usuários da Amazon até outubro de 2012. Para os exemplos, usamos as 1.000 avaliações mais recentes. As avaliações estão em inglês e tendem a ser positivas ou negativas. Cada avaliação contém os campos ProductId, UserId e Score, além do título (Summary) e do texto da avaliação (Text). Por exemplo:

ID do produto ID do usuário Nota Resumo 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…

No exemplo a seguir, reunimos o resumo e o texto da avaliação em um único texto. O modelo codifica esse texto e gera um único embedding vetorial.

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 carregar os dados de um arquivo salvo, execute o código a seguir.

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)

Perguntas frequentes

Como saber quantos tokens um texto tem antes de gerar seu embedding?

Em Python, você pode dividir um texto em tokens com o tokenizador tiktoken da OpenAI.

Exemplo de código:

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 modelos de embeddings de terceira geração, como text-embedding-3-small, use a codificação cl100k_base.

Veja mais detalhes e exemplos de código no guia do OpenAI Cookbook sobre como contar tokens com tiktoken.

Como recuperar rapidamente os K vetores de embedding mais próximos?

Para fazer buscas rápidas entre muitos vetores, recomendamos usar um banco de dados vetorial. Você encontra exemplos de como usar bancos de dados vetoriais com a API da OpenAI no nosso Cookbook no GitHub.

Qual função de distância devo usar?

Recomendamos a similaridade de cosseno. Em geral, a escolha da função de distância faz pouca diferença.

Os embeddings da OpenAI são normalizados para que cada vetor tenha norma igual a 1. Isso significa que:

  • É possível calcular a similaridade de cosseno um pouco mais rápido usando apenas o produto escalar
  • A similaridade de cosseno e a distância euclidiana produzem exatamente a mesma ordenação dos resultados

Posso compartilhar meus embeddings online?

Sim. Os clientes são titulares dos dados que fornecem aos nossos modelos e dos resultados que recebem, inclusive dos embeddings. Você é responsável por garantir que o conteúdo que envia à nossa API não viole nenhuma lei aplicável nem nossos Termos de Uso.

Os modelos de embeddings V3 têm conhecimento de eventos recentes?

Não. Os modelos text-embedding-3-large e text-embedding-3-small não têm conhecimento de eventos ocorridos após setembro de 2021. Em geral, essa limitação tem menos impacto do que teria em modelos de geração de texto, mas pode reduzir o desempenho em alguns casos específicos.