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

Azure OpenAI Service: implementar RAG con Azure AI Search

João Barros 15 de October de 2024 1 min de lectura

El Retrieval-Augmented Generation (RAG) es el patrón arquitectónico para crear asistentes de IA que responden con base en conocimiento específico de la organización. Combina Azure OpenAI Service (generación de texto) con Azure AI Search (recuperación de documentos relevantes).

Arquitectura RAG

1. Ingesta (offline):
   Documentos → Chunking → Embedding (text-embedding-ada-002) → AI Search Index

2. Query (runtime):
   Pregunta del usuario
     → Embedding de la pregunta
     → AI Search (vector + keyword search) → Top-K chunks relevantes
     → Prompt: "Con base en estos documentos: {chunks} — responde a: {pregunta}"
     → Azure OpenAI GPT-4o → Respuesta fundamentada

Indexar documentos en 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 completa

def rag_query(question: str) -> str:
    # 1. Embedding de la pregunta
    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. Generar la respuesta con GPT-4o
    response = openai_client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {"role": "system", "content": "Responde solo con base en los documentos proporcionados. Cita las fuentes."},
            {"role": "user",   "content": f"Documentos:\n{context}\n\nPregunta: {question}"}
        ]
    )
    return response.choices[0].message.content

Conclusión

RAG con Azure OpenAI + AI Search es el patrón para asistentes empresariales que necesitan respuestas fundamentadas en documentos internos. Es más fiable que el fine-tuning para bases de conocimiento que cambian con frecuencia, y más controlable que permitir que el modelo use su entrenamiento base.

Compartir: