← Automação
Índice
Identificar Tarefas →
Prompt Engineering para Criar Conteúdo em Escala
🎯 Caso de Estudo
Desenvolvimento de Assistente Virtual para TechSupport.pt - desde prompt básico até produção em Laravel
📝 Índice
O que é Prompt Engineering?
O que é Prompt Engineering?
Prompt Engineering é a arte de desenhar instruções para IA gerarem outputs de alta qualidade de forma consistente.
Aspecto
Prompt Básico
Prompt Engenheirado
Consistência
50-70%
95%+
Formato
Imprevisível
Estruturado (JSON)
Escala
Difícil
Automático
Custo
Alto (retrabalho)
Baixo
Anatomia de um Bom Prompt
Anatomia de um Bom Prompt
6 componentes essenciais:
1. Role (Papel)
És assistente de customer support de loja online tecnologia.
Contextualiza estilo e conhecimento
2. Context (Contexto)
Vendemos laptops. Envios 24-48h. Devoluções 30 dias.
Evita alucinações
3. Task (Tarefa)
Responde profissionalmente, resolve ou escala.
Clareza sobre output
4. Examples (Exemplos)
Cliente: "Onde está encomenda?"
Assistente: "Vou verificar. Número?"
Mostra padrões
5. Constraints (Restrições)
Max 150 palavras. Não promete descontos. Admite se não sabe.
Previne problemas
6. Output Format
{"response":"...", "escalate":true|false}
Facilita automação
Exemplo Completo
# ROLE
És assistente TechStore Portugal.
# CONTEXT
Vendemos: laptops €200-3000, componentes, periféricos
Envios: 24-48h PT, grátis >€50
Devoluções: 30 dias
Suporte: Seg-Sex 9-18h
# TASK
Responde profissionalmente, resolve ou escala.
# EXAMPLES
Cliente: "Laptop aqueceu muito"
Assistente: "Aquecimento normal em tarefas pesadas.
Está: 1) Superfície plana? 2) Ventoinhas limpas?
Posso sugerir soluções ou assistência."
# CONSTRAINTS
- Max 150 palavras
- Tom profissional mas amigável
- Se não sabe: admite
- Nunca: promete descontos
# OUTPUT
{"response":"...", "tone":"...", "escalate":true|false}
Técnicas Essenciais
1. Zero-shot vs Few-shot
Tipo
Descrição
Resultado
Zero-shot
Sem exemplos
Inconsistente
Few-shot
Com 2-5 exemplos
Consistente
2. Chain of Thought
Pedir raciocínio passo-a-passo melhora qualidade
Pensa passo-a-passo:
1. Qual política?
2. Há excepções?
3. Qual contexto?
4. Decisão?
3. Role Prompting
Copywriter: Persuasivo → Marketing
Analista: Dados → Relatórios
Professor: Simples → Tutoriais
Empático: Apoiante → Suporte
4. Structured Outputs
Retorna JSON:
{"sentiment":"...", "issues":[], "urgency":1-10, "action":"..."}
Caso: Assistente Virtual TechSupport.pt
Caso: Assistente Virtual TechSupport.pt
🎯 Cenário
Empresa: TechSupport.pt
Objetivo: 70% queries automáticas
Volume: 500-800 msgs/dia
Evolução dos Prompts
V1: Básico ❌
System: "Responde perguntas sobre tecnologia"
Problema: Genérico, sem personalidade, info incorreta
V2: Melhorado ⚠️
System: "És assistente TechSupport.pt
Info: Envios 24-48h, Devoluções 30d"
Melhor mas: Formato inconsistente
V3: Produção ✅
# IDENTITY
És TechBot, assistente TechSupport.pt
5 anos experiência, empático
# INFO
Produtos: Laptops €400-3000
Envios: 24-48h PT, grátis >€50
Garantia: 2 anos
# GUIDELINES
Tom: "Tu", amigável
Estrutura: Saudação→Clarificação→Solução→Verificação
Escala se: Cliente irritado, >5 msgs
# KB
Laptop não liga:
1. Liga corrente 30min
2. Reset bateria
3. Se <1 ano: garantia
# OUTPUT
{"intent":"...", "sentiment":"...", "escalate":true|false}
Implementação Laravel
getRelevantKB($context['user_message']);
$prompt .= "\n\n# RELEVANT KB\n" . $kb;
}
if (isset($context['history'])) {
$prompt .= "\n\n# HISTORY\n";
$prompt .= $this->formatHistory($context['history']);
}
return $prompt;
}
private function getRelevantKB(string $msg): ?string
{
$keywords = [
'não liga' => $this->kb['power_issues'],
'atraso' => $this->kb['shipping_delays']
];
foreach ($keywords as $key => $content) {
if (stripos($msg, $key) !== false) {
return $content;
}
}
return null;
}
}
// Controller
class ChatbotController extends Controller
{
public function sendMessage(Request $request)
{
$conversation = Conversation::findOrCreate($request->conversation_id);
$systemPrompt = $this->promptManager->buildPrompt([
'user_message' => $request->message,
'history' => $conversation->messages->toArray()
]);
$response = OpenAI::chat()->create([
'model' => 'gpt-4',
'messages' => [
['role' => 'system', 'content' => $systemPrompt],
['role' => 'user', 'content' => $request->message]
]
]);
return response()->json([
'reply' => $response->choices[0]->message->content
]);
}
}
Escala e Automação
1. Templates Reutilizáveis
class ProductDescription
{
public static function render(array $vars): string
{
$template = self::getTemplate();
foreach ($vars as $key => $value) {
$template = str_replace("{{$key}}", $value, $template);
}
return $template;
}
}
2. Batch Processing
// Processar 1000 produtos
$products = Product::whereNull('description')->limit(1000)->get();
foreach ($products->chunk(10) as $batch) {
foreach ($batch as $product) {
GenerateDescriptionJob::dispatch($product)
->onQueue('content-generation');
}
sleep(2); // Rate limiting
}
3. Quality Control
class ContentQualityChecker
{
public function check(string $content, array $rules): array
{
$issues = [];
// Length
if ($length < $rules['min_length']) {
$issues[] = "Too short";
}
// Required keywords
foreach ($rules['required_keywords'] as $keyword) {
if (!stripos($content, $keyword)) {
$issues[] = "Missing: $keyword";
}
}
// Tone check (AI)
if (!$this->checkTone($content, $rules['tone'])) {
$issues[] = "Wrong tone";
}
return ['passed' => empty($issues), 'issues' => $issues];
}
}
Outros Exemplos de Aplicação
Outros Exemplos de Aplicação
1. Triagem Documentos (Contabilidade)
System: És assistente contabilidade PT.
Classifica documento:
- Tipo: fatura|recibo|contrato
- NIF emissor/receptor
- Data, valor, categoria
Output JSON: {tipo, nif, data, valor, categoria, confianca}
2. Geração Conteúdo (Marketing)
System: És copywriter para {cliente}.
Cria post {plataforma} sobre {tema}.
Tom: {tom_voz}
Estrutura: Hook→Body→CTA→Hashtags
Output: {texto, hashtags, melhor_hora}
3. Chatbot E-commerce
System: És assistente StyleHub (moda online).
Políticas: Envios 24-48h, devoluções 30d
Capacidades: Recomendar, responder, tracking
Escala se: Cliente irritado, >5 msgs
4. Análise CVs (RH)
System: És recrutador sénior 10 anos PT.
Analisa CV para vaga: {job}
Avalia: Experiência(30%), Skills(30%), Formação(15%)
Output: {scores, decisao:shortlist|review|reject}
Melhores Práticas
1. Seja Específico
❌ "Escreve sobre produto"
✅ "Escreve 150 palavras, tom profissional, 3 benefícios"
2. Use Exemplos
2-3 exemplos valem mais que 100 palavras de instruções
3. Estruture o Prompt
Secções claras: ROLE→CONTEXT→TASK→EXAMPLES→CONSTRAINTS
4. Defina Constraints
O que NÃO fazer é tão importante quanto o que fazer
5. Peça Formato Estruturado
JSON para automação, sempre
6. Itere e Teste
V1→V2→V3. Primeira versão nunca é perfeita
7. Use Chain of Thought
Para tarefas complexas, peça raciocínio passo-a-passo
8. Versione
Mantenha histórico, permite rollback
Erros Comuns
❌ Prompts vagos → Output genérico
❌ Excesso informação → IA perde-se
❌ Não testar edge cases → Falha em produção
❌ Ignorar rate limits → API bloqueia
❌ Confiar 100% → Alucinações publicadas
❌ Não iterar → Qualidade subótima
❌ Instruções contraditórias → Output imprevisível
❌ Esquecer contexto cultural → Tom inadequado
← Automação
Índice
Identificar Tarefas →