Pular para o conteúdo principal

Desafio 14: Padrão RAG: Básico

Tempo Estimado

60 min | Custo: ~$3.00 (AI Search + OpenAI) | Domínio: Soluções de IA Generativa (15-20%)

Habilidades do exame abordadas

  • Implementar Retrieval Augmented Generation (RAG) fundamentando modelos nos seus dados
  • Criar e configurar índices do Azure AI Search
  • Usar o recurso "On Your Data" do Azure OpenAI para respostas fundamentadas

Visão Geral

Retrieval Augmented Generation (RAG) é um padrão que aprimora as respostas de LLMs recuperando primeiro informações relevantes de uma base de conhecimento externa, e então fornecendo esse contexto ao modelo junto com a pergunta do usuário. Isso "fundamenta" a resposta do modelo em dados factuais, reduzindo significativamente alucinações e permitindo que o modelo responda perguntas sobre informações proprietárias ou atuais nas quais ele não foi treinado.

O padrão RAG básico no Azure usa o Azure AI Search como camada de recuperação e o Azure OpenAI como camada de geração. O Azure AI Search indexa seus documentos (PDFs, arquivos Word, páginas web, dados estruturados) e fornece resultados de busca rápidos e relevantes. O recurso "On Your Data" do Azure OpenAI simplifica o RAG orquestrando automaticamente as etapas de recuperação e geração—você configura uma conexão de fonte de dados, e o serviço cuida do chunking, busca e augmentação de prompt nos bastidores.

O fluxo da arquitetura é: Consulta do Usuário → Azure OpenAI (com configuração de fonte de dados) → Azure AI Search (recuperação) → Chunks relevantes retornados → LLM gera resposta fundamentada com citações. Entender esse fluxo, configurar a conexão da fonte de dados e comparar respostas fundamentadas vs. não fundamentadas são habilidades essenciais para o exame AI-102.

Arquitetura

O padrão RAG conecta o Azure OpenAI ao Azure AI Search, permitindo que o modelo recupere chunks relevantes de documentos antes de gerar respostas.

Topologia do Desafio 14

Pré-requisitos

  • Assinatura Azure com acesso ao Azure OpenAI
  • Azure CLI instalado
  • Implantação GPT-4o (do Desafio 12)
  • Python 3.9+ com pacotes openai, azure-search-documents e azure-identity

Implementação

import os
from azure.identity import DefaultAzureCredential
from azure.search.documents.indexes import SearchIndexClient
from azure.search.documents.indexes.models import (
SearchIndex,
SimpleField,
SearchableField,
SearchFieldDataType,
)
from azure.search.documents import SearchClient

endpoint = os.environ["AZURE_SEARCH_ENDPOINT"]
credential = DefaultAzureCredential()

# Create the search index
index_client = SearchIndexClient(endpoint=endpoint, credential=credential)

fields = [
SimpleField(name="id", type=SearchFieldDataType.String, key=True, filterable=True),
SearchableField(name="title", type=SearchFieldDataType.String, filterable=True),
SearchableField(name="content", type=SearchFieldDataType.String),
SimpleField(name="category", type=SearchFieldDataType.String, filterable=True, facetable=True),
SimpleField(name="source", type=SearchFieldDataType.String, filterable=True),
]

index = SearchIndex(name="ai102-docs-index", fields=fields)
result = index_client.create_or_update_index(index)
print(f"Index created: {result.name}")

Tarefa 2: Fazer Upload de Documentos de Exemplo

import os
from azure.identity import DefaultAzureCredential
from azure.search.documents import SearchClient

endpoint = os.environ["AZURE_SEARCH_ENDPOINT"]
credential = DefaultAzureCredential()

search_client = SearchClient(
endpoint=endpoint,
index_name="ai102-docs-index",
credential=credential
)

# Sample documents about Azure AI services
documents = [
{
"id": "1",
"title": "Azure AI Foundry Overview",
"content": "Azure AI Foundry is a unified platform for building generative AI applications. It provides a hub-and-project architecture where hubs manage shared infrastructure including Storage, Key Vault, and Container Registry. Projects are workspaces where teams build and deploy AI solutions. The platform supports model deployment, prompt flow orchestration, and evaluation capabilities.",
"category": "platform",
"source": "docs/ai-foundry-overview.md"
},
{
"id": "2",
"title": "Azure OpenAI Model Deployment",
"content": "Azure OpenAI supports multiple deployment types: Standard (shared compute, pay-per-token), Global Standard (global routing for higher availability), and Provisioned (dedicated compute with guaranteed throughput). Models available include GPT-4o for multimodal tasks, GPT-4o-mini for cost-efficient workloads, and embedding models like text-embedding-3-small for vector search.",
"category": "models",
"source": "docs/model-deployment.md"
},
{
"id": "3",
"title": "Responsible AI Principles",
"content": "Microsoft's Responsible AI principles include fairness, reliability and safety, privacy and security, inclusiveness, transparency, and accountability. Azure AI services include built-in content filters that detect and block harmful content categories including hate, sexual, violence, and self-harm. Custom content filters can be configured per deployment.",
"category": "governance",
"source": "docs/responsible-ai.md"
},
{
"id": "4",
"title": "Azure AI Search Capabilities",
"content": "Azure AI Search provides full-text search, vector search, and hybrid search combining both approaches. Semantic ranking uses deep learning models to re-rank results by semantic relevance. The service supports skillsets for AI enrichment during indexing, including OCR, entity recognition, and custom skills via Azure Functions.",
"category": "search",
"source": "docs/ai-search.md"
},
{
"id": "5",
"title": "Prompt Engineering Best Practices",
"content": "Effective prompts include clear instructions, relevant context, and specific output format requirements. System messages define the AI assistant's behavior and constraints. Few-shot examples in the prompt improve output consistency. Chain-of-thought prompting helps with complex reasoning tasks. Temperature controls randomness (0 for deterministic, 1 for creative).",
"category": "techniques",
"source": "docs/prompt-engineering.md"
}
]

result = search_client.upload_documents(documents=documents)
print(f"Uploaded {len(result)} documents")
for r in result:
print(f" {r.key}: {r.succeeded}")

Tarefa 3: Configurar Azure OpenAI "On Your Data"

import os
from openai import AzureOpenAI

endpoint = os.environ["AZURE_OPENAI_ENDPOINT"]
api_key = os.environ["AZURE_OPENAI_KEY"]
search_endpoint = os.environ["AZURE_SEARCH_ENDPOINT"]
search_key = os.environ["AZURE_SEARCH_KEY"]

client = AzureOpenAI(
azure_endpoint=endpoint,
api_key=api_key,
api_version="2024-10-21"
)

# Query with "On Your Data" (grounded response)
response = client.chat.completions.create(
model="gpt-4o-standard",
messages=[
{"role": "system", "content": "You are an AI assistant that helps users understand Azure AI services. Use the provided data sources to answer questions accurately."},
{"role": "user", "content": "What deployment types does Azure OpenAI support and what are their differences?"}
],
extra_body={
"data_sources": [
{
"type": "azure_search",
"parameters": {
"endpoint": search_endpoint,
"index_name": "ai102-docs-index",
"authentication": {
"type": "api_key",
"key": search_key
},
"query_type": "simple",
"top_n_documents": 3,
"in_scope": True
}
}
]
}
)

print("Grounded Response:")
print(response.choices[0].message.content)

# Check citations
if hasattr(response.choices[0].message, 'context'):
context = response.choices[0].message.context
if 'citations' in context:
print("\nCitations:")
for citation in context['citations']:
print(f" - {citation.get('title', 'N/A')} ({citation.get('filepath', 'N/A')})")

Tarefa 4: Comparar Respostas Fundamentadas vs Não Fundamentadas

import os
from openai import AzureOpenAI

endpoint = os.environ["AZURE_OPENAI_ENDPOINT"]
api_key = os.environ["AZURE_OPENAI_KEY"]
search_endpoint = os.environ["AZURE_SEARCH_ENDPOINT"]
search_key = os.environ["AZURE_SEARCH_KEY"]

client = AzureOpenAI(
azure_endpoint=endpoint,
api_key=api_key,
api_version="2024-10-21"
)

question = "What are Microsoft's Responsible AI principles and how do content filters work?"

# Ungrounded response (no data source)
ungrounded = client.chat.completions.create(
model="gpt-4o-standard",
messages=[
{"role": "system", "content": "You are an AI assistant."},
{"role": "user", "content": question}
],
max_tokens=300
)

print("=" * 60)
print("UNGROUNDED RESPONSE (no data source):")
print("=" * 60)
print(ungrounded.choices[0].message.content)

# Grounded response (with data source)
grounded = client.chat.completions.create(
model="gpt-4o-standard",
messages=[
{"role": "system", "content": "You are an AI assistant. Answer based only on the provided data."},
{"role": "user", "content": question}
],
max_tokens=300,
extra_body={
"data_sources": [
{
"type": "azure_search",
"parameters": {
"endpoint": search_endpoint,
"index_name": "ai102-docs-index",
"authentication": {
"type": "api_key",
"key": search_key
},
"query_type": "simple",
"top_n_documents": 3,
"in_scope": True
}
}
]
}
)

print("\n" + "=" * 60)
print("GROUNDED RESPONSE (with Azure AI Search):")
print("=" * 60)
print(grounded.choices[0].message.content)

# Key differences to note:
print("\n" + "=" * 60)
print("COMPARISON NOTES:")
print("=" * 60)
print("- Grounded responses cite specific documents")
print("- Grounded responses stay within indexed knowledge")
print("- Ungrounded may include information not in your data")
print("- 'in_scope: true' restricts answers to indexed content only")

Saída Esperada

Após completar todas as tarefas, você deve ter:

  1. Índice Azure AI Search ai102-docs-index com 5 documentos indexados
  2. Chat completions fundamentadas retornando respostas baseadas nos seus documentos indexados
  3. Citações referenciando títulos e caminhos de documentos específicos
  4. Comparação mostrando que respostas fundamentadas ficam dentro dos seus dados enquanto não fundamentadas podem incluir conhecimento externo

Quebra & conserta

CenárioSintomaCausa RaizCorreção
Busca não retorna resultadosResposta "I don't have information about that"Documentos não indexados ou consulta não corresponde ao conteúdoVerifique a contagem de docs com $count; confirme que o campo é searchable
403 no endpoint de buscaFalha de autenticação na fonte de dadosChave API incorreta ou RBAC não configuradoUse chave admin para operações de índice; verifique a chave na configuração de data_source
Citações vaziasResposta sem context/citationsin_scope definido como false ou top_n_documents muito baixoDefina in_scope: true e aumente top_n_documents para 3-5
Respostas alucinadasResposta inclui informações que não estão no índicein_scope não habilitadoDefina "in_scope": true para restringir respostas ao conteúdo indexado
Criação do índice falhaServiceNotFoundServiço de busca não provisionadoCrie o serviço de busca: az search service create --sku basic

Verificação de Conhecimento

1. Qual é o propósito principal do padrão RAG (Retrieval Augmented Generation)?

2. No recurso 'On Your Data' do Azure OpenAI, o que o parâmetro 'in_scope' controla?

3. Qual parâmetro do SDK no cliente Python do OpenAI configura a fonte de dados Azure AI Search para RAG?

4. Qual é o papel do Azure AI Search no padrão RAG básico?

5. O que acontece quando você consulta o Azure OpenAI com 'On Your Data' e a resposta não está nos documentos indexados (com in_scope=true)?

Limpeza

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

Saiba Mais