(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa
Azure AI & Machine Learning
Azure AI & Machine Learning 1 min

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.

Partilhar: