Recuperación entre corpus de RAG Engine

Importante: Establece el description del corpus cuando crees un corpus RAG. El description no se puede editar después de su creación. Las descripciones de alta calidad son fundamentales para la recuperación eficaz en varios corpus, ya que el sistema se basa en ellas para seleccionar los corpus adecuados para tu búsqueda.

En esta página, se describen dos APIs, AsyncRetrieveContexts y AskContexts, que admiten la recuperación de RAG en varios corpus, con la tecnología de Agentic Retrieval en el backend.

API de AsyncRetrieveContexts: Es una API asíncrona que permite a los usuarios recuperar contextos relevantes de varios corpus administrados por RAG. Esta es una API de larga duración. Los usuarios pueden usar el ID de operación para obtener el estado de la consulta y el resultado.

API de AskContexts: Es una API síncrona que genera directamente la respuesta a la búsqueda a través de varios corpus administrados por RAG.

Importante: Para usar esta función, debes otorgar el rol de Usuario de Vertex AI en tu proyecto a la cuenta de servicio de RAG Engine: service-[Your project's automatically generated project number]@gcp-sa-vertex-rag.iam.gserviceaccount.com.

Importante: Esta función solo está disponible en us-central1.

Arquitectura del sistema y selección del corpus

En esta sección, se describe la arquitectura del sistema de recuperación de varios corpus de RAG y cómo selecciona los corpus adecuados para la recuperación.

Arquitectura del sistema

El sistema de recuperación de corpus cruzados usa un enfoque basado en agentes para coordinar la recuperación en varios corpus. Una descripción general de alto nivel de la arquitectura incluye los siguientes componentes:

  • Orquestador/enrutador: Recibe la búsqueda del usuario y coordina el proceso de recuperación.
  • Agente de planificación: Analiza la búsqueda y determina qué corpus son más relevantes según su descriptions.
  • Motor de recuperación: Realiza búsquedas semánticas en los corpus de RAG seleccionados.
  • Agente de razonamiento: Evalúa si los contextos recuperados son suficientes para responder la búsqueda. Si no es suficiente, genera comentarios para activar otro bucle de recuperación basado en la Suficiente Conciencia del Contexto (SCA). Para obtener más información, consulta la entrada de blog de la SCA y el documento de investigación.
  • LLM Generator (para AskContexts): Sintetiza los contextos recuperados para generar una respuesta final.
Arquitectura de recuperación de corpus cruzado

Cómo se seleccionan los corpus

Cuando se ejecuta una búsqueda en varios corpus administrados por RAG, el sistema debe determinar qué corpus contiene la información necesaria para responder la búsqueda. Esto se logra a través de la recuperación agentica:

  1. Asignación de corpus: El sistema mantiene un mapa de los corpus RAG disponibles junto con sus descripciones técnicas (especificadas en el campo description del corpus RAG).
  2. Correlación semántica: Un agente de planificación estratégica (con tecnología de un modelo de Gemini) evalúa la búsqueda del usuario en función del descriptions de los corpus disponibles.
  3. Enrutamiento segmentado: El planificador genera un plan de recuperación que asigna partes específicas de la búsqueda a los corpus más relevantes, lo que garantiza que la recuperación sea enfocada y eficiente en lugar de buscar en todos los corpus de forma ingenua.

Muestras de código

En los siguientes ejemplos de código, se muestra cómo usar las APIs de recuperación entre corpus de RAG.

AsyncRetrieveContexts API

En esta muestra de código, se demuestra cómo recuperar contextos de varios corpus RAG de forma asíncrona.

Python

from vertexai.preview import rag
import vertexai

PROJECT_ID = "PROJECT_ID"
LOCATION = "LOCATION"
RAG_CORPUS_1_ID = "RAG_CORPUS_1_ID"
RAG_CORPUS_2_ID = "RAG_CORPUS_2_ID"

# Initialize API once per session
vertexai.init(project=PROJECT_ID, location=LOCATION)

# Async retrieve contexts from multiple corpora
# This can be run in an environment like a Colab notebook.
response = await rag.async_retrieve_contexts(
    text="Why is the sky blue?",
    rag_resources=[
        rag.RagResource(
            rag_corpus=f"projects/{PROJECT_ID}/locations/{LOCATION}/ragCorpora/{RAG_CORPUS_1_ID}",
        ),
        rag.RagResource(
            rag_corpus=f"projects/{PROJECT_ID}/locations/{LOCATION}/ragCorpora/{RAG_CORPUS_2_ID}",
        ),
    ],
)
print(response)

REST

PROJECT_ID="PROJECT_ID"
LOCATION="LOCATION"
RAG_CORPUS_1_ID="RAG_CORPUS_1_ID"
RAG_CORPUS_2_ID="RAG_CORPUS_2_ID"
QUERY="Why is the sky blue?"

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  "https://${LOCATION}-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/${LOCATION}:asyncRetrieveContexts" \
  -d '{
    "query": {
      "text": "'"$QUERY"'"
    },
    "tools": {
      "retrieval": {
        "disable_attribution": false,
        "vertex_rag_store": {
          "rag_resources": {
            "rag_corpus": "projects/'"${PROJECT_ID}"'/locations/'"${LOCATION}"'/ragCorpora/'"${RAG_CORPUS_1_ID}"'"
          },
          "rag_resources": {
            "rag_corpus": "projects/'"${PROJECT_ID}"'/locations/'"${LOCATION}"'/ragCorpora/'"${RAG_CORPUS_2_ID}"'"
          }
        }
      }
    }
  }'

Obtener el resultado de la operación

Dado que AsyncRetrieveContexts es una operación de larga duración, puedes usar la API de GetOperations para sondear el resultado con el ID de operación.

Python

from google.cloud import aiplatform_v1beta1

PROJECT_ID = "PROJECT_ID"
LOCATION = "LOCATION"
OPERATION_ID = "OPERATION_ID"

client = aiplatform_v1beta1.VertexRagServiceClient(
    client_options={"api_endpoint": f"{LOCATION}-aiplatform.googleapis.com"}
)

operation = client.get_operation(
    request={"name": f"projects/{PROJECT_ID}/locations/{LOCATION}/operations/{OPERATION_ID}"}
)

if operation.done:
    print(operation.response)
else:
    print("Operation is still running")

REST

PROJECT_ID="PROJECT_ID"
LOCATION="LOCATION"
OPERATION_ID="OPERATION_ID"

curl -X GET \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  "https://${LOCATION}-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/${LOCATION}/operations/${OPERATION_ID}"

API de AskContexts

En esta muestra de código, se muestra cómo generar una respuesta directamente buscando en varios corpus RAG de forma síncrona.

Python

from vertexai.preview import rag
import vertexai

PROJECT_ID = "PROJECT_ID"
LOCATION = "LOCATION"
RAG_CORPUS_1_ID = "RAG_CORPUS_1_ID"
RAG_CORPUS_2_ID = "RAG_CORPUS_2_ID"

# Initialize API once per session
vertexai.init(project=PROJECT_ID, location=LOCATION)

# Ask contexts from multiple corpora
response = rag.ask_contexts(
    text="Why is the sky blue?",
    rag_resources=[
        rag.RagResource(
            rag_corpus=f"projects/{PROJECT_ID}/locations/{LOCATION}/ragCorpora/{RAG_CORPUS_1_ID}",
        ),
        rag.RagResource(
            rag_corpus=f"projects/{PROJECT_ID}/locations/{LOCATION}/ragCorpora/{RAG_CORPUS_2_ID}",
        ),
    ],
)
print(response)

REST

PROJECT_ID="PROJECT_ID"
LOCATION="LOCATION"
RAG_CORPUS_1_ID="RAG_CORPUS_1_ID"
RAG_CORPUS_2_ID="RAG_CORPUS_2_ID"
QUERY="Why is the sky blue?"

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  "https://${LOCATION}-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/${LOCATION}:askContexts" \
  -d '{
    "query": {
      "text": "'"$QUERY"'"
    },
    "tools": {
      "retrieval": {
        "disable_attribution": false,
        "vertex_rag_store": {
          "rag_resources": {
            "rag_corpus": "projects/'"${PROJECT_ID}"'/locations/'"${LOCATION}"'/ragCorpora/'"${RAG_CORPUS_1_ID}"'"
          },
          "rag_resources": {
            "rag_corpus": "projects/'"${PROJECT_ID}"'/locations/'"${LOCATION}"'/ragCorpora/'"${RAG_CORPUS_2_ID}"'"
          }
        }
      }
    }
  }'

¿Qué sigue?