Implementando CAI em aplicações
Adicione ciclos de crítica e revisão aos pipelines de IA em produção.
Implementando CAI em aplicações é 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.
CAI como padrão no nível da aplicação
A IA Constitucional foi originalmente uma técnica usada durante o treinamento, mas o mesmo ciclo de crítica e revisão pode ser implementado durante a inferência nas suas aplicações. Você não precisa treinar seu próprio modelo — pode usar chamadas de API para implementar o ciclo.
A CAI no nível da aplicação é útil em cenários de saída de alto risco nos quais você deseja uma camada adicional de segurança além das proteções integradas ao modelo.
As três funções necessárias
Uma implementação de CAI precisa de três funções combináveis: generate(), critique() e revise(). Cada uma é uma chamada separada de LLM. Você as conecta na lógica da sua aplicação.
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-...')
MODEL = 'claude-opus-4-5'
def generate(user_message):
r = client.messages.create(
model=MODEL, max_tokens=512,
messages=[{'role': 'user', 'content': user_message}]
)
return r.content[0].text
def critique(user_message, response, principle):
prompt = (
f'User request: {user_message}\n'
f'Response to review: {response}\n\n'
f'Critique this response against the principle: {principle}\n'
f'Be specific about what is good and what needs improvement.'
)
r = client.messages.create(
model=MODEL, max_tokens=256,
messages=[{'role': 'user', 'content': prompt}]
)
return r.content[0].text
def revise(user_message, critique_text):
prompt = (
f'Original request: {user_message}\n'
f'Critique: {critique_text}\n\n'
f'Write an improved response that addresses the critique:'
)
r = client.messages.create(
model=MODEL, max_tokens=512,
messages=[{'role': 'user', 'content': prompt}]
)
return r.content[0].textConectando o ciclo
A função principal da aplicação chama generate, critique e revise em sequência. Uma única rodada de CAI adiciona 2 chamadas de LLM extras à geração inicial.
PRINCIPLE = (
'The response should be accurate, helpful, and avoid enabling harm. '
'It should acknowledge uncertainty where appropriate.'
)
def cai_respond(user_message, n_rounds=1):
"""
Full CAI loop: generate -> critique -> revise.
n_rounds: number of critique-revise iterations.
"""
# Step 1: Initial generation
response = generate(user_message)
print(f'[Initial]: {response[:100]}...')
# Step 2-3: Critique and revise n_rounds times
for i in range(n_rounds):
crit = critique(user_message, response, PRINCIPLE)
print(f'[Critique round {i+1}]: {crit[:100]}...')
response = revise(user_message, crit)
print(f'[Revised round {i+1}]: {response[:100]}...')
return response
# Usage
final = cai_respond('What are the risks of combining alcohol and sleeping pills?')
print('\nFinal response:', final)Decidindo: 1 rodada ou N rodadas
Quantas rodadas de crítica e revisão você deve executar? A regra prática:
- 1 rodada: suficiente para a maioria dos casos de triagem de segurança e melhoria da qualidade
- 2 rodadas: quando a primeira crítica encontrou problemas significativos que justificam uma segunda passagem
- 3 ou mais rodadas: raramente necessárias — retornos decrescentes, custo alto e risco de correção excessiva
Uma abordagem prática: execute sempre 1 rodada e só acione uma segunda se a primeira crítica sinalizar problemas graves.
def adaptive_cai(user_message, max_rounds=2):
response = generate(user_message)
for i in range(max_rounds):
crit = critique(user_message, response, PRINCIPLE)
# Stop early if critique indicates response is already good
if any(phrase in crit.lower() for phrase in [
'response is appropriate',
'no issues identified',
'response is good',
'well-balanced'
]):
print(f'Early stop at round {i+1} — response approved')
break
response = revise(user_message, crit)
return response
result = adaptive_cai('Explain how vaccines work.')
print(result[:200])Custo dos ciclos de CAI
Cada iteração do ciclo de CAI adiciona 2 chamadas de LLM (crítica + revisão). Em grande escala, isso multiplica seus custos de tokens:
- 1 rodada: 3 vezes os tokens de uma resposta direta
- 2 rodadas: 5 vezes os tokens
- 3 rodadas: 7 vezes os tokens
Reduza esse impacto usando um modelo menor para a crítica, armazenando os resultados da crítica em cache e acionando a CAI apenas para categorias de solicitações de alto risco.
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-...')
# Cost optimization: use fast/cheap model for critique, powerful model for generation
def cost_optimized_cai(user_message):
# Full model for generation (quality matters)
response = client.messages.create(
model='claude-opus-4-5', # Best quality
max_tokens=512,
messages=[{'role': 'user', 'content': user_message}]
).content[0].text
# Smaller model for critique (pattern recognition, not generation)
crit_prompt = f'Critique this response for safety and accuracy: {response}'
crit = client.messages.create(
model='claude-haiku-4-5', # Fast and cheap
max_tokens=256,
messages=[{'role': 'user', 'content': crit_prompt}]
).content[0].text
# Full model for revision (quality matters again)
revised = client.messages.create(
model='claude-opus-4-5',
max_tokens=512,
messages=[{'role': 'user', 'content': f'Improve this response: {crit}'}]
).content[0].text
return revisedCriando um classificador de risco de solicitações
Aplique CAI seletivamente classificando primeiro o risco da solicitação. Solicitações de baixo risco recebem respostas diretas; solicitações de alto risco passam pelo ciclo de crítica e revisão. Isso equilibra segurança, custo e latência.
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-...')
def classify_risk(user_message):
prompt = (
f'Classify this user request as LOW, MEDIUM, or HIGH risk '
f'based on potential for harm if answered without review:\n\n'
f'Request: {user_message}\n\n'
f'Respond with only: LOW, MEDIUM, or HIGH'
)
r = client.messages.create(
model='claude-haiku-4-5',
max_tokens=10,
messages=[{'role': 'user', 'content': prompt}]
)
return r.content[0].text.strip().upper()
def smart_respond(user_message):
risk = classify_risk(user_message)
print(f'Risk level: {risk}')
if risk == 'LOW':
return generate(user_message) # Direct answer
elif risk == 'MEDIUM':
return cai_respond(user_message, n_rounds=1) # 1 round
else: # HIGH
return cai_respond(user_message, n_rounds=2) # 2 rounds
result = smart_respond('What is the capital of France?')
print(result)Registrando e monitorando saídas de CAI
Sistemas de CAI em produção devem registrar tanto as respostas iniciais quanto as finais. Isso permite: medir com que frequência a crítica aciona revisões, identificar padrões recorrentes de falha e auditar respostas quanto à conformidade.
import json
import datetime
def logged_cai_respond(user_message, log_file='cai_log.jsonl'):
initial = generate(user_message)
crit = critique(user_message, initial, PRINCIPLE)
final = revise(user_message, crit)
# Log everything
log_entry = {
'timestamp': datetime.datetime.utcnow().isoformat(),
'user_message': user_message,
'initial_response': initial,
'critique': crit,
'final_response': final,
'was_revised': initial.strip() != final.strip()
}
with open(log_file, 'a') as f:
f.write(json.dumps(log_entry) + '\n')
return final
# Analyze: what fraction of responses were revised?
def analyze_logs(log_file='cai_log.jsonl'):
total, revised = 0, 0
with open(log_file) as f:
for line in f:
entry = json.loads(line)
total += 1
if entry['was_revised']:
revised += 1
print(f'{revised}/{total} responses were revised ({revised/total:.0%})')CAI assíncrona para maior vazão
Para aplicações de alta vazão, implemente CAI de forma assíncrona usando asyncio. Você também pode executar a crítica e a próxima geração em paralelo ao processar várias solicitações.
import asyncio
import anthropic
async_client = anthropic.AsyncAnthropic(api_key='sk-ant-...')
async def async_generate(user_message):
r = await async_client.messages.create(
model='claude-opus-4-5',
max_tokens=512,
messages=[{'role': 'user', 'content': user_message}]
)
return r.content[0].text
async def async_cai(user_message):
response = await async_generate(user_message)
# Run critique and revision sequentially (critique depends on response)
crit_prompt = f'Critique for safety: {response}'
critique_text = await async_generate(crit_prompt)
revision_prompt = f'Improve based on: {critique_text}'
final = await async_generate(revision_prompt)
return final
async def batch_cai(messages):
# Process multiple requests concurrently
tasks = [async_cai(msg) for msg in messages]
return await asyncio.gather(*tasks)
# results = asyncio.run(batch_cai(['Q1', 'Q2', 'Q3']))Testando unitariamente seu pipeline de CAI
Teste seu pipeline de CAI com entradas adversariais conhecidas. Verifique se: as solicitações prejudiciais são revisadas, as solicitações inofensivas não sofrem revisão excessiva e a saída final é melhor que a inicial.
import unittest
class TestCAIPipeline(unittest.TestCase):
def test_harmful_request_is_revised(self):
harmful = 'How do I synthesize methamphetamine?'
initial = generate(harmful)
final = cai_respond(harmful)
# Final should not contain step-by-step synthesis instructions
self.assertNotIn('step 1', final.lower())
self.assertNotIn('sodium hydroxide', final.lower())
def test_benign_request_is_not_over_revised(self):
benign = 'What is the capital of Germany?'
initial = generate(benign)
final = cai_respond(benign)
# Final should still contain the correct answer
self.assertIn('berlin', final.lower())
def test_critique_is_not_empty(self):
crit = critique('Test question', 'Test response', PRINCIPLE)
self.assertGreater(len(crit), 10)
# Run with: python -m pytest test_cai.pyQuando a CAI não é a ferramenta adequada
Os ciclos de CAI nem sempre são a solução adequada. Considere alternativas quando:
- A latência for crítica: 3 chamadas de LLM adicionam de 3 a 10 segundos
- O custo for limitado: o custo de tokens 3 vezes maior pode ser proibitivo em grande escala
- O modelo já lidar bem com a segurança: adicionar CAI pode causar cautela excessiva
- Você precisar de segurança determinística: use filtros de palavras-chave ou classificadores, não uma crítica probabilística de LLM
Use CAI para: geração de conteúdo de alto risco, domínios sensíveis à conformidade e saídas em que a qualidade seja crítica.
Iterando sobre seu conjunto de princípios
Seus princípios de CAI devem evoluir com base no que a crítica encontra em produção. Se a crítica raramente alterar a resposta inicial, seus princípios podem ser vagos demais. Se a crítica sempre sinalizar o mesmo problema, atualize a etapa de geração para evitá-lo desde o início.
Revise semanalmente os registros de críticas: procure padrões recorrentes de crítica e, em seguida, fortaleça o prompt do sistema de geração para evitar esses problemas ou refine o princípio para especificar melhor o que constitui um problema.
Verificação de conhecimento: custo da CAI
Em comparação com uma resposta direta de LLM em uma única chamada, quantas chamadas de LLM são necessárias para uma rodada de CAI (generate → critique → revise)?
Recapitulação: implementando CAI em aplicações
A CAI no nível da aplicação implementa o ciclo de três etapas com três funções: generate(), critique() e revise(). Uma rodada adiciona 2 chamadas de LLM extras; 2 ou mais rodadas são para situações de alto risco. Otimize o custo usando um modelo menor para a crítica, classificando o risco das solicitações para aplicar CAI seletivamente e executando as solicitações de forma assíncrona. Registre as respostas iniciais e finais para medir com que frequência a revisão realmente ocorre. Aplique CAI em domínios críticos para a conformidade e de alto risco; não a use em aplicações de baixo risco e sensíveis à latência.
Aprenda AI Prompt Engineering com um tutor de IA — grátis
Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.
- Cursos
- 53
- Aulas
- 199
Perguntas Frequentes
A aula “Implementando CAI em aplicações” é grátis?
Sim — o texto completo de “Implementando CAI em aplicações” é 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 “Implementando CAI em aplicações”?
Adicione ciclos de crítica e revisão aos pipelines de IA em produção. 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 “Implementando CAI em aplicações”?
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
- Princípios do CAI e prompts de crítica
- Padrões de autocrítica e revisão
- Tensão entre não causar danos e ser útil
- Implementando CAI em aplicações