Pular para o conteúdo principal

Início rápido

Cinco passos de um projeto vazio até um modelo ajustado respondendo por um endpoint compatível com a OpenAI. Cada passo é a requisição que de fato o executa, então esta página serve também como a integração mais curta possível.

Todo caminho abaixo é escopado a um projeto: {owner_slug} é o slug da sua conta e {project_slug} é o do projeto. Os dois aparecem na URL de qualquer tela de projeto.

01 · Obtenha uma chave​

Crie e revogue chaves pelo menu de perfil, em Chaves de API. Uma chave é exibida uma única vez, na resposta que a cria: ela é guardada como digest, então nenhuma listagem consegue devolvê-la e ninguém consegue recuperá-la para você. Se você a perder, revogue e crie outra.

Envie-a como bearer token e mantenha-a fora do controle de versão.

export REOPENLY_API_KEY="fnf_sua_chave_de_api"

02 · Aponte o SDK para o seu projeto​

Todo projeto expõe uma superfície compatível com a OpenAI. A única mudança no código existente é a base URL.

pip install openai
from openai import OpenAI

client = OpenAI(
base_url="https://reopenly.com/api/projects/{owner_slug}/{project_slug}/openai/v1",
api_key="fnf_sua_chave_de_api",
)

Você pode parar por aqui. Um projeto sem dataset e sem fine-tune ainda serve os modelos base do catálogo por esse cliente.

03 · Adicione exemplos​

Os chats são os dados de treino. Adicione-os a partir do seu próprio pipeline usando a mesma API que o editor usa, para que o que você curou à mão e o que você importou terminem no mesmo lugar.

POST /api/v1/projects/{owner_slug}/{project_slug}/chats
Authorization: Bearer fnf_sua_chave_de_api
Content-Type: application/json

{
"name": "trocas-faq-01",
"tags": ["suporte"],
"messages": [
{"role": "user", "text": "Como funcionam as trocas?"},
{"role": "assistant", "text": "Trocas são gratuitas em até 30 dias."}
]
}

As tags são como um fine-tune seleciona seus dados, então vale escolhê-las deliberadamente, e não depois do fato.

Listá-los de volta devolve message_count, um updated_at durável e um source anulável por chat. message_count é calculado pelo servidor, e updated_at muda quando o chat, suas tags ou suas mensagens são editados. source é csv, api, editor ou playground; chats antigos, criados antes do registro de proveniência, podem retornar null. O servidor decide esse valor, portanto uma chave de API não pode declarar outro caminho de ingestão.

GET /api/v1/projects/{owner_slug}/{project_slug}/chats

04 · Faça o fine-tune​

Um job é criado a partir de tags do dataset e de um modelo base, e é medido em steps em vez de épocas: o treinador roda um número fixo de steps do treinamento, e os limites que a API impõe são publicados por GET /api/v1/base-models.

POST /api/v1/projects/{owner_slug}/{project_slug}/training-jobs
Authorization: Bearer fnf_sua_chave_de_api
Content-Type: application/json

{
"dataset_tags": ["suporte"],
"model_name": "<catalog-model-id>",
"max_seq_length": 2048,
"num_train_epochs": 3
}

Acompanhe, e interrompa se quiser:

GET /api/v1/projects/{owner_slug}/{project_slug}/training-jobs/{job_id}
POST /api/v1/projects/{owner_slug}/{project_slug}/training-jobs/{job_id}/cancel

Primeiro, a ReOpenly congela os chats selecionados, para que edições posteriores não mudem a execução. Carregar o modelo, ler e tokenizar seus dados acontecem antes de o treino começar, e publicar o modelo depois que ele termina: somente o laço de treino é cobrado. Uma execução que nunca chega ao primeiro passo de treinamento não é cobrada.

Cancelar e parar são duas operações. POST .../cancel vale enquanto o job está na fila ou preparando, onde nada foi aprendido e nada é cobrado. Depois que o treino começou, POST .../pause é o controle: a execução continua até o próximo checkpoint de recuperação e assenta como paused, de onde pode ser retomada ou concluída. Nenhum dos dois vale depois que o job entra em pós-processamento ou finalização.

observação

Não existe um estado público separado de evaluation ou deployment. Runs elegíveis avaliam durante o loop de treino, enviam melhorias estritas de perda como candidatos de adaptador e promovem o candidato verificado com menor perda durante a finalização. Veja Jobs de treino para os estados, a política de avaliação e os limites de cobrança.

05 · Sirva o modelo​

Um job que produziu um artefato pode ser publicado sob um nome estável que você escolhe. Primeiro crie o alias:

POST /api/v1/projects/{owner_slug}/{project_slug}/models
Authorization: Bearer fnf_sua_chave_de_api
Content-Type: application/json

{
"name": "Bot de suporte",
"slug": "bot-suporte",
"training_job_id": 87
}

Daí em diante o slug é mais um valor de model para o mesmo cliente do passo 02.

response = client.chat.completions.create(
model="bot-suporte",
messages=[{"role": "user", "content": "Como funcionam as trocas?"}],
temperature=0.7,
max_tokens=1024,
stream=True,
)

for chunk in response:
print(chunk.choices[0].delta.content or "", end="")

Os pesos são seus. Baixe um adaptador LoRA promovido com GET /api/v1/projects/{owner_slug}/{project_slug}/training-jobs/{job_id}/download?format=lora e execute-o onde quiser.

Para onde ir depois​