Pular para o conteúdo principal

Início rápido de embeddings

Treine um modelo de embeddings com seus próprios pares de consulta e trecho, hospede-o e chame-o pela API de embeddings da OpenAI. Todas as requisições abaixo usam uma chave de API:

export REOPENLY_API_KEY="<your key>"
export API="https://reopenly.com/api/v1"

1. Crie um projeto de embeddings​

curl "$API/projects" \
-H "Authorization: Bearer $REOPENLY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Citations", "type": "embedding"}'

A resposta traz o owner_slug e o slug do projeto; juntos, eles formam a URL do projeto. O tipo é escolhido uma vez e nunca muda.

export P="$API/projects/<owner_slug>/<slug>"

2. Adicione pares de treinamento​

Um projeto de embeddings novo tem um dataset padrão. Encontre o id dele:

curl "$P/datasets" -H "Authorization: Bearer $REOPENLY_API_KEY"

Cada exemplo é uma consulta (anchor), um trecho que a responde (positive) e, opcionalmente, um trecho que parece relacionado mas não responde (negative).

Adicione exemplos independentes suficientes para os conjuntos de treino e validação. O exemplo abaixo cria três triplas com textos distintos; uma única linha não permite uma divisão válida. Textos compartilhados entre exemplos permanecem no mesmo conjunto para evitar vazamento.

for example in \
'{"anchor":"How long is the warranty on the X200?","positive":"The X200 is covered by a two-year limited warranty.","negative":"The X100 ships with a one-year warranty."}' \
'{"anchor":"How long do I have to return an order?","positive":"You can return an order within thirty days of delivery.","negative":"Standard delivery takes five business days."}' \
'{"anchor":"When is shipping free?","positive":"Orders over fifty dollars qualify for free shipping.","negative":"Express shipping arrives on the next business day."}'
do
curl "$P/datasets/<dataset_id>/examples" \
-H "Authorization: Bearer $REOPENLY_API_KEY" \
-H "Content-Type: application/json" \
-d "$example"
done

Para mais do que alguns, importe um arquivo CSV ou JSONL: veja Importações de datasets.

3. Visualize e estime a execução​

Escolha um modelo base e leia os limites de cada configuração:

curl "$P/training-jobs/profiles" -H "Authorization: Bearer $REOPENLY_API_KEY"

Visualize a execução com o dataset, o base_artifact_id do modelo base e um número de passos. A prévia retorna a divisão exata, planned_steps_per_epoch e um selection_sha256; use em max_steps um número inteiro de épocas (planned_steps_per_epoch × épocas):

curl "$P/training-jobs/preview" \
-H "Authorization: Bearer $REOPENLY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"dataset_id": <dataset_id>, "base_artifact_id": <base_artifact_id>, "max_steps": <steps>}'

POST $P/training-jobs/estimate com o mesmo corpo retorna admission_ceiling_credits, os créditos que precisam estar disponíveis para iniciar.

4. Treine​

Inicie a execução com o selection_sha256 da prévia e um Idempotency-Key único:

curl "$P/training-jobs" \
-H "Authorization: Bearer $REOPENLY_API_KEY" \
-H "Idempotency-Key: <unique-uuid>" \
-H "Content-Type: application/json" \
-d '{
"dataset_id": <dataset_id>,
"base_artifact_id": <base_artifact_id>,
"max_steps": <steps>,
"selection_sha256": "<selection_sha256>"
}'

Acompanhe com GET $P/training-jobs/<job_id> até model_available ser true. Só o laço de treino é cobrado. A página do job mostra a validação do treino e o checkpoint mantido; veja Jobs de treinamento.

5. Hospede o modelo​

Dê um nome estável ao modelo treinado:

curl "$P/models" \
-H "Authorization: Bearer $REOPENLY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Citation encoder",
"slug": "citation-encoder",
"task": "embedding",
"source": {"kind": "training_job", "training_job_id": <job_id>}
}'

6. Gere embeddings​

Chame o modelo com qualquer cliente OpenAI na URL base do projeto:

from openai import OpenAI

client = OpenAI(
base_url="https://reopenly.com/api/projects/<owner_slug>/<slug>/openai/v1",
api_key="<your key>",
)
response = client.embeddings.create(
model="citation-encoder",
input=["How long is the warranty on the X200?"],
extra_body={"input_type": "query"},
)
print(len(response.data[0].embedding))

Envie input_type: "query" para consultas e "document" para trechos. Para testar o modelo em um dataset inteiro antes, crie um índice de Busca: veja Playground e Busca. Para continuar melhorando o modelo a partir de buscas reais, veja Feedback de busca.