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

Embeddings vetoriais

Aprenda a transformar texto em números para viabilizar casos de uso como pesquisa.

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 grau de relação entre strings de texto. Os embeddings são comumente usados para:

  • Pesquisar (os resultados são ordenados por relevância em relação a uma string de consulta)
  • Agrupamento (strings de texto são agrupadas por similaridade)
  • Recomendações (itens com strings de texto relacionadas são recomendados)
  • Detecção de anomalias (valores atípicos com baixo grau de relação são identificados)
  • Medição de diversidade (distribuições de similaridade são analisadas)
  • Classificação (strings de texto são classificadas pelo rótulo mais similar)

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 um alto grau de relação, e distâncias grandes sugerem um baixo grau de relação.

Visite nossa página de preços para saber mais sobre os preços dos embeddings. As requisições são cobradas com base no número de tokens na entrada.

Como obter embeddings

Para obter um embedding, envie sua string de texto para o endpoint da API de embeddings junto com o nome do modelo de embeddings (por exemplo, text-embedding-3-small):

Exemplo: 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 (lista de números de ponto flutuante) e alguns metadados adicionais. Você pode extrair o vetor de embedding, salvá-lo em um banco de dados vetorial e utilizá-lo em diversos casos de uso.

{
  "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 comprimento do vetor de embedding é 1536 para text-embedding-3-small ou 3072 para text-embedding-3-large. Para reduzir as dimensões do embedding sem perder sua capacidade de representar conceitos, forneça o parâmetro dimensions. Veja mais detalhes sobre as dimensões dos embeddings na seção de casos de uso de embeddings.

Modelos de embeddings

A OpenAI oferece dois modelos avançados de embeddings de terceira geração (identificados por -3 no ID do modelo). Leia o anúncio no blog sobre os embeddings v3 para saber mais.

O uso é cobrado por token de entrada. Abaixo, mostramos um exemplo de quantas páginas de texto podem ser processadas por dólar americano (considerando cerca de 800 tokens por página):

Modelo~ Páginas por dólarDesempenho na avaliação MTEBEntrada máxima
text-embedding-3-small62.50062,3%8192
text-embedding-3-large9.61564,6%8192
text-embedding-ada-00212.50061,0%8192

Casos de uso

Aqui, mostramos alguns casos de uso representativos com o conjunto de dados de avaliações de alimentos da Amazon.

Como obter os embeddings

O conjunto de dados contém um total de 568.454 avaliações de alimentos feitas por usuários da Amazon até outubro de 2012. Usamos um subconjunto das 1.000 avaliações mais recentes para fins de demonstração. As avaliações estão em inglês e tendem a ser positivas ou negativas. Cada avaliação contém ProductId, UserId, Score, o título da avaliação (Summary) e o corpo da avaliação (Text). Por exemplo:

ID do produtoID do usuárioNotaResumoTexto
B001E4KFG0A3SGXH7AUHU8GW5Ração para cães de boa qualidadeJá comprei vários dos enlatados da Vitality...
B00813GRG4A1D87F6ZCVE5NK1Diferente do anunciadoO produto chegou com o rótulo de amendoim jumbo salgado...

Abaixo, combinamos o resumo e o texto da avaliação em um único texto. O modelo codifica esse texto combinado 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, você pode executar o seguinte:

import pandas as pd

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

Perguntas frequentes

Como saber quantos tokens uma string tem antes de gerar seu embedding?

Em Python, você pode dividir uma string 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 embedding de terceira geração, como text-embedding-3-small, use a codificação cl100k_base.

Você encontra 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 em um grande número de vetores, recomendamos usar um banco de dados vetorial. Você encontra exemplos de como trabalhar com bancos de dados vetoriais e a API da OpenAI no nosso Cookbook no GitHub.

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

Recomendamos a similaridade de cosseno. A escolha da função de distância geralmente não faz muita diferença.

Os embeddings da OpenAI são normalizados para ter norma 1, o que significa que:

  • A similaridade de cosseno pode ser calculada um pouco mais rápido usando apenas um produto escalar
  • A similaridade de cosseno e a distância euclidiana produzem ordenações idênticas

Posso compartilhar meus embeddings online?

Sim, os clientes são proprietários dos dados que fornecem aos nossos modelos e das saídas que recebem, inclusive no caso de embeddings. Você é responsável por garantir que o conteúdo enviado à nossa API não viole nenhuma lei aplicável nem nossos Termos de Uso.

Os modelos de embedding 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, isso não representa uma limitação tão grande quanto representaria para modelos de geração de texto, mas pode reduzir o desempenho em certos casos atípicos.