Estratégias de registro e documentação
Registre versões dos prompts, entradas e saídas para possibilitar uma depuração reproduzível.
Estratégias de registro e documentação é uma aula grátis de AI Prompt Engineering no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de AI Prompt Engineering, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de AI Prompt Engineering inclui 4 aulas no total.
Por que o registro de instruções é importante
Sem registro, as falhas das instruções permanecem invisíveis até que um usuário as relate. Com registro, você pode:
- Detectar regressões no momento em que ocorrem
- Reproduzir qualquer falha passada exatamente como aconteceu
- Medir a melhoria ao longo do tempo à medida que as instruções evoluem
- Auditar o comportamento do modelo quanto à conformidade ou à segurança
O registro não é opcional para sistemas de instruções em produção — é a base de aplicações LLM confiáveis.
A entrada mínima viável de registro
Cada interação com uma instrução deve registrar, no mínimo, estes campos:
timestamp: ISO 8601 UTCprompt_id: qual modelo de instrução foi usadomodel: nome e versão exatos do modelotemperature: parâmetro de amostrageminput: mensagem do usuário (ou um hash se contiver PII)output: resposta do modelolatency_ms: tempo de respostatokens_used: tokens de entrada + tokens de saída
import time, json
from datetime import datetime, timezone
def logged_call(prompt_id, system_prompt, user_message, model='gpt-4o', temperature=0.7):
start = time.time()
resp = client.chat.completions.create(
model=model,
messages=[
{'role': 'system', 'content': system_prompt},
{'role': 'user', 'content': user_message}
],
temperature=temperature
)
latency = int((time.time() - start) * 1000)
output = resp.choices[0].message.content
log_entry = {
'timestamp': datetime.now(timezone.utc).isoformat(),
'prompt_id': prompt_id,
'model': model,
'temperature': temperature,
'input': user_message,
'output': output,
'latency_ms': latency,
'input_tokens': resp.usage.prompt_tokens,
'output_tokens': resp.usage.completion_tokens
}
append_log(log_entry)
return outputFormato de registro estruturado
Use JSON delimitado por quebras de linha (JSONL) para os arquivos de registro. Cada linha é um objeto JSON completo e válido. Esse formato é:
- Fácil de adicionar sem bloqueio
- Legível por jq, pandas e todos os agregadores de registros
- Adequado para transmissão — cada linha pode ser processada à medida que chega
import json
LOG_FILE = 'prompt_logs.jsonl'
def append_log(entry):
with open(LOG_FILE, 'a') as f:
f.write(json.dumps(entry) + '\n')
def read_logs():
with open(LOG_FILE) as f:
return [json.loads(line) for line in f if line.strip()]
# Query: all entries for prompt_id 'summarize_v3'
logs = read_logs()
summarize_logs = [e for e in logs if e['prompt_id'] == 'summarize_v3']
print(f'Total calls to summarize_v3: {len(summarize_logs)}')Versionamento de instruções
As instruções mudam com o tempo. Sem versionamento, você não consegue reproduzir comportamentos passados nem comparar as saídas do modelo entre versões da instrução. Use um identificador de versão em cada entrada de registro.
Versionamento simples: uma string de versão semântica (por exemplo, v1.2.3) ou um hash de commit do git. Armazene as versões das instruções em um arquivo dedicado para que qualquer versão possa ser recuperada para reexecução.
PROMPTS = {
'summarize': {
'v1': 'Summarize the following text.',
'v2': 'Summarize the following text in 3 sentences.',
'v3': 'Summarize the following text in exactly 3 sentences. '
'Start each sentence on a new line. No bullet points.'
}
}
CURRENT_VERSIONS = {'summarize': 'v3'}
def get_prompt(prompt_id):
version = CURRENT_VERSIONS[prompt_id]
return version, PROMPTS[prompt_id][version]
version, prompt = get_prompt('summarize')
log_entry['prompt_version'] = versionTratamento de PII nos registros
As entradas dos usuários podem conter informações de identificação pessoal (PII). Registrar entradas brutas pode violar o GDPR ou a CCPA. Opções:
- Resumo criptográfico: armazene o SHA-256 da entrada — reproduzível para deduplicação, mas não para reexecução
- Remoção: use uma expressão regular ou um modelo de NER para substituir PII antes do registro
- Armazenamento separado: registre PII em um repositório criptografado com controles de acesso; registre apenas um ID de referência no registro principal
import hashlib, re
def redact_pii(text):
# Redact email addresses
text = re.sub(r'[\w.-]+@[\w.-]+\.\w+', '[EMAIL]', text)
# Redact phone numbers (US format)
text = re.sub(r'\b\d{3}[-.]\d{3}[-.]\d{4}\b', '[PHONE]', text)
return text
def hash_input(text):
return hashlib.sha256(text.encode()).hexdigest()[:16]
log_entry['input'] = redact_pii(user_message)
log_entry['input_hash'] = hash_input(user_message)Acompanhamento de latência e custo
Os registros permitem criar painéis de custo e latência. Acompanhe métricas por versão da instrução para detectar regressões de desempenho ou custo após uma alteração na instrução:
def compute_cost(entry, price_per_1m_input=5.0, price_per_1m_output=15.0):
input_cost = entry['input_tokens'] / 1_000_000 * price_per_1m_input
output_cost = entry['output_tokens'] / 1_000_000 * price_per_1m_output
return input_cost + output_cost
def prompt_stats(prompt_id, version):
logs = [e for e in read_logs()
if e['prompt_id'] == prompt_id and e.get('prompt_version') == version]
if not logs:
return
avg_latency = sum(e['latency_ms'] for e in logs) / len(logs)
total_cost = sum(compute_cost(e) for e in logs)
print(f'{prompt_id} {version}: {len(logs)} calls, avg {avg_latency:.0f}ms, total ${total_cost:.4f}')Registro da avaliação da saída
Além dos registros brutos, armazene as pontuações de avaliação junto com cada entrada de registro. Isso permite analisar tendências: a qualidade da saída está melhorando entre as versões da instrução?
def evaluated_call(prompt_id, system_prompt, user_message, evaluator_fn):
output = logged_call(prompt_id, system_prompt, user_message)
score = evaluator_fn(user_message, output)
# Update the last log entry with the evaluation score
logs = read_logs()
last = logs[-1]
last['eval_score'] = score
last['eval_pass'] = score >= 0.8
# Rewrite the last line
with open(LOG_FILE, 'a') as f:
# In practice, use a DB or separate eval log
pass
return output, scoreDocumentação da instrução
Cada modelo de instrução deve ter uma entrada de documentação complementar que abranja:
- Objetivo: qual tarefa essa instrução executa
- Variáveis: quais marcadores de posição existem e o que eles esperam
- Limitações conhecidas: entradas nas quais se sabe que ela falha
- Histórico de versões: o que mudou em cada versão e por quê
- Casos de teste: link para o conjunto de testes dessa instrução
PROMPT_DOCS = {
'summarize': {
'purpose': 'Summarize a single text passage into 3 sentences.',
'variables': {'text': 'The passage to summarize (max 2000 tokens)'},
'known_limitations': [
'Fails to preserve numbers accurately for texts with many statistics',
'May not summarize correctly for non-English text'
],
'versions': {
'v1': 'Initial version — vague length instruction',
'v2': 'Added 3-sentence limit',
'v3': 'Added line-break and no-bullet formatting fix'
},
'test_suite': 'tests/test_summarize.py'
}
}Uso de serviços centralizados de registro
Para sistemas em produção, grave os registros em um serviço centralizado em vez de arquivos locais:
- LangSmith: plataforma nativa de rastreamento e avaliação do LangChain
- Weights and Biases Prompts: acompanhamento de experimentos para instruções
- Datadog / Grafana: painéis operacionais padrão com métricas personalizadas
- Supabase / PostgreSQL: consulte registros com SQL para análise específica
O esquema é o mesmo; somente o destino muda.
# Example: writing to Supabase
from supabase import create_client
supabase = create_client('https://xxx.supabase.co', 'your-anon-key')
def log_to_supabase(entry):
supabase.table('prompt_logs').insert(entry).execute()
# Now query with SQL:
# SELECT prompt_id, prompt_version, AVG(latency_ms), COUNT(*)
# FROM prompt_logs
# WHERE timestamp > NOW() - INTERVAL '7 days'
# GROUP BY prompt_id, prompt_version
# ORDER BY COUNT(*) DESC;Alertas sobre picos de falhas
Configure alertas quando as taxas de falha ultrapassarem um limite. Por exemplo: se mais de 10% das chamadas para uma instrução retornarem JSON inválido em uma janela de 5 minutos, envie um alerta.
from collections import deque
from datetime import datetime, timezone, timedelta
recent_results = deque(maxlen=100) # sliding window
def track_and_alert(prompt_id, success, alert_fn, threshold=0.10):
recent_results.append({'success': success, 'time': datetime.now(timezone.utc)})
window = [
r for r in recent_results
if r['time'] > datetime.now(timezone.utc) - timedelta(minutes=5)
]
if not window:
return
fail_rate = sum(1 for r in window if not r['success']) / len(window)
if fail_rate > threshold:
alert_fn(f'ALERT: {prompt_id} failure rate {fail_rate:.0%} in last 5 min')Retenção e arquivamento
Defina uma política de retenção de registros:
- Registros brutos de chamadas: 30 dias (móvel) — alto volume, necessários para depurar problemas recentes
- Métricas agregadas: 1 ano — necessárias para análise de tendências e previsão de custos
- Registros de falhas: indefinidamente — necessários para identificar padrões de causa raiz
Compacte e arquive os registros brutos após 30 dias. Nunca exclua os registros de falhas — eles são sua memória institucional para a engenharia de instruções.
Verificação de conhecimentos
Qual é a principal vantagem de usar o formato JSON delimitado por quebras de linha (JSONL) para registros de instruções em comparação com uma única lista JSON grande?
Recapitulação: registro e documentação
Práticas fundamentais para registro e documentação de instruções:
- Registre cada chamada: marca temporal, identificador da instrução, versão, modelo, temperatura, entrada, saída, latência, tokens
- Use o formato JSONL: fácil de complementar, consultável com ferramentas padrão
- Versione as instruções: cada alteração recebe uma nova versão; os registros fazem referência à versão
- Trate PII: oculte ou aplique hash às entradas sensíveis antes de registrá-las
- Acompanhe o custo e a latência: detecte regressões após atualizações das instruções
- Gere alertas sobre picos de falhas: monitore a taxa de falhas em uma janela móvel
Isso conclui o Curso 17 sobre depuração de falhas em instruções. Próximo: injeção de instruções e defesa.
Perguntas Frequentes
A aula “Estratégias de registro e documentação” é grátis?
Sim — o texto completo de “Estratégias de registro e documentação” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de AI Prompt Engineering, atualize para CoddyKit PRO. O curso de AI Prompt Engineering inclui 4 aulas no total.
O que vou aprender em “Estratégias de registro e documentação”?
Registre versões dos prompts, entradas e saídas para possibilitar uma depuração reproduzível. Você pratica AI Prompt Engineering com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar AI Prompt Engineering?
Nenhuma experiência prévia é necessária. AI Prompt Engineering no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Estratégias de registro e documentação”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de AI Prompt Engineering?
Sim. Cada aula de AI Prompt Engineering inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Diagnosticando resultados inesperados
- Análise de causa raiz para solicitações
- Abordagem sistemática de depuração
- Estratégias de registro e documentação