Azure OpenAI Service: implementar RAG com Azure AI Search
João Barros
15 de October de 2024
1 min de leitura
O Retrieval-Augmented Generation (RAG) é o padrão arquitectural para criar assistentes de IA que respondem com base em conhecimento específico da organização. Combina o Azure OpenAI Service (geração de texto) com o Azure AI Search (recuperação de documentos relevantes).
Arquitectura RAG
1. Ingestão (offline):
Documentos → Chunking → Embedding (text-embedding-ada-002) → AI Search Index
2. Query (runtime):
Pergunta do utilizador
→ Embedding da pergunta
→ AI Search (vector + keyword search) → Top-K chunks relevantes
→ Prompt: "Com base nestes documentos: {chunks} — responde a: {pergunta}"
→ Azure OpenAI GPT-4o → Resposta fundamentada
Indexar documentos no AI Search
import os
from azure.search.documents import SearchClient
from azure.search.documents.indexes import SearchIndexClient
from openai import AzureOpenAI
openai_client = AzureOpenAI(
api_key=os.environ["AZURE_OPENAI_KEY"],
azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT"],
api_version="2024-02-01"
)
def get_embedding(text: str) -> list[float]:
response = openai_client.embeddings.create(
model="text-embedding-ada-002",
input=text
)
return response.data[0].embedding
# Para cada chunk de documento:
search_client.upload_documents(documents=[{
"id": chunk_id,
"content": chunk_text,
"embedding": get_embedding(chunk_text),
"source": document_path
}])
Query RAG completo
def rag_query(question: str) -> str:
# 1. Embedding da pergunta
q_embedding = get_embedding(question)
# 2. Recuperar chunks relevantes (vector search)
results = search_client.search(
search_text=question,
vector_queries=[VectorizedQuery(vector=q_embedding, k_nearest_neighbors=5, fields="embedding")],
select=["content", "source"]
)
context = "\n\n".join([r["content"] for r in results])
# 3. Gerar resposta com GPT-4o
response = openai_client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "Responde apenas com base nos documentos fornecidos. Cita as fontes."},
{"role": "user", "content": f"Documentos:\n{context}\n\nPergunta: {question}"}
]
)
return response.choices[0].message.content
Conclusão
RAG com Azure OpenAI + AI Search é o padrão para assistentes empresariais que precisam de respostas fundamentadas em documentos internos. É mais confiável que fine-tuning para knowledge bases que mudam frequentemente e mais controlável que permitir que o modelo use o seu treino base.