Pular para o conteúdo principal

Desafio 17: Engenharia de Prompts e Templates

Tempo Estimado

45-60 min | Custo: ~$0,50 (estimado) | Domínio: Soluções de IA Generativa (15-20%)

Habilidades do exame cobertas

  • Enviar prompts para modelos de IA generativa
  • Utilizar templates de prompt
  • Aplicar técnicas de engenharia de prompt para resultados otimizados

Visão Geral

Engenharia de prompt é a prática de projetar e otimizar entradas para modelos de linguagem para obter as saídas desejadas. A API de chat completions do Azure OpenAI usa um formato de mensagem estruturado com três papéis: system (define o comportamento e as restrições), user (fornece a solicitação) e assistant (modela respostas anteriores para contexto). Entender como configurar essas mensagens de forma eficaz é fundamental para construir aplicações de IA confiáveis.

Parâmetros-chave controlam a geração de resposta: temperature (0-2, controla a aleatoriedade), top_p (limiar de amostragem por núcleo), max_tokens (limite de comprimento da saída), frequency_penalty (-2 a 2, reduz repetição) e presence_penalty (-2 a 2, incentiva diversidade de tópicos). Esses parâmetros interagem entre si — por exemplo, temperature e top_p ambos afetam a aleatoriedade, então a Microsoft recomenda ajustar um de cada vez.

Técnicas avançadas incluem few-shot prompting (fornecer exemplos no prompt), chain-of-thought (solicitar raciocínio passo a passo) e structured outputs (usar modo JSON ou response_format para garantir saída parseável). Templates de prompt permitem padrões reutilizáveis com substituição de variáveis, possibilitando comportamento consistente em diferentes cenários de aplicação.

Arquitetura

Este desafio explora a construção de prompts, ajuste de parâmetros e abordagens baseadas em templates para construir interações de IA generativa consistentes e confiáveis.

Topologia do Desafio 17

Pré-requisitos

  • Recurso Azure OpenAI com GPT-4o implantado (do Desafio 16)
  • Python 3.9+ com pacote openai instalado
  • .NET 8 SDK com pacote NuGet Azure.AI.OpenAI
  • Variáveis de ambiente AZURE_OPENAI_ENDPOINT e AZURE_OPENAI_KEY configuradas

Implementação

Tarefa 1: Configurar System Prompts e Papéis de Mensagem

import os
from openai import AzureOpenAI

client = AzureOpenAI(
azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT"],
api_key=os.environ["AZURE_OPENAI_KEY"],
api_version="2024-10-21"
)

# System message defines the assistant's behavior and constraints
messages = [
{
"role": "system",
"content": (
"You are a technical documentation assistant for Azure services. "
"Always respond with accurate, concise technical information. "
"Format responses using markdown. "
"If you are unsure about something, say so rather than guessing. "
"Do not provide information about non-Azure cloud services."
)
},
{
"role": "user",
"content": "What is the maximum file size for Azure Blob Storage?"
}
]

response = client.chat.completions.create(
model="gpt-4o",
messages=messages,
max_tokens=200
)

print(response.choices[0].message.content)

# Multi-turn conversation with assistant role for context
messages.append({"role": "assistant", "content": response.choices[0].message.content})
messages.append({"role": "user", "content": "How does that compare to the block blob limit?"})

response2 = client.chat.completions.create(
model="gpt-4o",
messages=messages,
max_tokens=200
)

print(f"\nFollow-up: {response2.choices[0].message.content}")

Tarefa 2: Experimentar com Temperature e Parâmetros de Amostragem

import os
from openai import AzureOpenAI

client = AzureOpenAI(
azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT"],
api_key=os.environ["AZURE_OPENAI_KEY"],
api_version="2024-10-21"
)

prompt = [
{"role": "system", "content": "You are a creative writing assistant."},
{"role": "user", "content": "Write a one-sentence description of cloud computing."}
]

# Temperature 0: Deterministic, consistent output
print("=== Temperature 0 (Deterministic) ===")
for i in range(3):
response = client.chat.completions.create(
model="gpt-4o",
messages=prompt,
temperature=0,
max_tokens=50
)
print(f" Run {i+1}: {response.choices[0].message.content}")

# Temperature 1.5: High creativity, more variation
print("\n=== Temperature 1.5 (Creative) ===")
for i in range(3):
response = client.chat.completions.create(
model="gpt-4o",
messages=prompt,
temperature=1.5,
max_tokens=50
)
print(f" Run {i+1}: {response.choices[0].message.content}")

# Frequency and presence penalties for diversity
print("\n=== With Penalties (Reduce Repetition) ===")
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "List 5 benefits of cloud computing."},
{"role": "user", "content": "Go."}
],
temperature=0.7,
frequency_penalty=0.5, # Reduce word repetition
presence_penalty=0.5, # Encourage new topics
max_tokens=200
)
print(response.choices[0].message.content)

Tarefa 3: Implementar Few-Shot Prompting

import os
from openai import AzureOpenAI

client = AzureOpenAI(
azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT"],
api_key=os.environ["AZURE_OPENAI_KEY"],
api_version="2024-10-21"
)

# Few-shot prompting: provide examples to guide the model
messages = [
{
"role": "system",
"content": "You classify customer support tickets into categories. Respond with only the category name."
},
# Example 1
{"role": "user", "content": "I can't log into my account, it says password is wrong"},
{"role": "assistant", "content": "Authentication"},
# Example 2
{"role": "user", "content": "My monthly bill seems higher than expected"},
{"role": "assistant", "content": "Billing"},
# Example 3
{"role": "user", "content": "The app crashes when I try to upload a file larger than 10MB"},
{"role": "assistant", "content": "Bug Report"},
# Actual request
{"role": "user", "content": "I want to add another user to my team subscription"}
]

response = client.chat.completions.create(
model="gpt-4o",
messages=messages,
temperature=0,
max_tokens=10
)

print(f"Classification: {response.choices[0].message.content}")

# Chain-of-thought prompting
cot_messages = [
{
"role": "system",
"content": "You are a math tutor. Show your reasoning step by step before giving the final answer."
},
{
"role": "user",
"content": "A store has 3 shelves. Each shelf has 4 boxes. Each box contains 6 items. If 15 items are sold, how many remain?"
}
]

response = client.chat.completions.create(
model="gpt-4o",
messages=cot_messages,
temperature=0,
max_tokens=300
)

print(f"\nChain-of-thought:\n{response.choices[0].message.content}")

Tarefa 4: Usar Modo JSON para Saída Estruturada

import os
import json
from openai import AzureOpenAI

client = AzureOpenAI(
azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT"],
api_key=os.environ["AZURE_OPENAI_KEY"],
api_version="2024-10-21"
)

# JSON mode: ensures valid JSON output
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{
"role": "system",
"content": "You extract structured data from text. Always respond with valid JSON."
},
{
"role": "user",
"content": "Extract entities: 'John Smith from Microsoft called on March 15, 2024 about Azure OpenAI pricing for their Seattle office.'"
}
],
response_format={"type": "json_object"},
temperature=0,
max_tokens=300
)

result = json.loads(response.choices[0].message.content)
print(json.dumps(result, indent=2))

# Prompt template with variable substitution
def create_analysis_prompt(product_name: str, review_text: str) -> list:
"""Reusable prompt template for product review analysis."""
return [
{
"role": "system",
"content": (
"You are a product review analyst. Analyze the review and return JSON with: "
"sentiment (positive/negative/neutral), key_points (array), "
"rating_estimate (1-5), and summary (one sentence)."
)
},
{
"role": "user",
"content": f"Product: {product_name}\nReview: {review_text}"
}
]

# Use the template
review = "The new Azure AI Studio is fantastic! Easy to use and very powerful."
messages = create_analysis_prompt("Azure AI Studio", review)

response = client.chat.completions.create(
model="gpt-4o",
messages=messages,
response_format={"type": "json_object"},
temperature=0,
max_tokens=200
)

analysis = json.loads(response.choices[0].message.content)
print(f"\nSentiment: {analysis.get('sentiment')}")
print(f"Rating: {analysis.get('rating_estimate')}/5")
print(f"Summary: {analysis.get('summary')}")

Saída Esperada

Classification: Account Management

Chain-of-thought:
Step 1: Calculate total items
- 3 shelves × 4 boxes = 12 boxes
- 12 boxes × 6 items = 72 items total

Step 2: Subtract sold items
- 72 items - 15 sold = 57 items remaining

**Answer: 57 items remain**

{
"person": "John Smith",
"company": "Microsoft",
"date": "March 15, 2024",
"topic": "Azure OpenAI pricing",
"location": "Seattle"
}

Sentiment: positive
Rating: 5/5
Summary: The reviewer finds Azure AI Studio excellent for its ease of use and power.

Quebra & conserta

CenárioSintomaCausa RaizCorreção
Modo JSON retorna erroresponse_format is not supportedModelo ou versão da API não suporta modo JSONUse GPT-4o com versão da API 2024-10-21+
Saída JSON é inválidaJSON parcial ou truncadomax_tokens muito baixo para a respostaAumente max_tokens ou simplifique o schema solicitado
Few-shot não funcionaModelo ignora exemplosExemplos inconsistentes ou muito poucosGaranta 3+ exemplos diversos com formato consistente
Temperature 0 variaSaídas ligeiramente diferentes com temp=0Comportamento esperado devido a ponto flutuanteUse o parâmetro seed para reprodutibilidade
System prompt ignoradoModelo não segue as restriçõesMensagem do usuário sobrescreve mensagem de sistemaReforce as restrições no system message; use instruções mais explícitas

Verificação de Conhecimento

1. Qual é a abordagem recomendada quando você quer baixa aleatoriedade e alta qualidade nas respostas do Azure OpenAI?

2. Na API de chat completions, qual é o propósito de incluir mensagens assistant no array de mensagens?

3. O que deve ser verdade ao usar response_format: {type: 'json_object'} com o Azure OpenAI?

4. Qual parâmetro reduz a probabilidade do modelo repetir as mesmas palavras ou frases que já usou?

5. Qual é a diferença principal entre zero-shot e few-shot prompting?

Limpeza

az group delete --name rg-ai102-challenge17 --yes --no-wait

Saiba Mais