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.
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:
- Asignación de corpus: El sistema mantiene un mapa de los corpus RAG disponibles junto con sus descripciones técnicas (especificadas en el campo
descriptiondel corpus RAG). - 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
descriptionsde los corpus disponibles. - 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?
- Para obtener más información sobre la API de RAG, consulta la API de RAG Engine.
- Para obtener más información sobre las respuestas de RAG, consulta Resultados de recuperación y generación de RAG Engine.
- Para obtener información sobre RAG Engine, consulta la descripción general de RAG Engine.