Importante: imposta il corpus description quando crei un corpus RAG. Il description non è modificabile dopo la creazione. Descrizioni di alta qualità sono fondamentali per un recupero efficace tra i corpus, in quanto il sistema si basa su di esse per selezionare i corpus appropriati per la tua query.
Questa pagina descrive due API, AsyncRetrieveContexts e AskContexts, che supportano il recupero cross-corpus RAG, basato sul recupero agentico nel backend.
API AsyncRetrieveContexts: si tratta di un'API asincrona che consente agli utenti di recuperare contesti pertinenti da più corpus gestiti da RAG. Si tratta di un'API a lunga esecuzione. Gli utenti possono utilizzare l'ID operazione per ottenere lo stato della query e del risultato.
API AskContexts: si tratta di un'API sincrona che genera direttamente la risposta alla query eseguendo ricerche in più corpus gestiti da RAG.
Importante: per utilizzare questa funzionalità, devi concedere il ruolo Utente Vertex AI nel tuo progetto al account di servizio del motore RAG: service-[Your project's automatically generated project number]@gcp-sa-vertex-rag.iam.gserviceaccount.com.
Importante: questa funzionalità è disponibile solo in us-central1.
Architettura di sistema e selezione del corpus
Questa sezione descrive l'architettura del sistema di recupero cross-corpus RAG e come seleziona i corpus appropriati per il recupero.
Architettura di sistema
Il sistema di recupero cross-corpus utilizza un approccio basato su agenti per orchestrare il recupero in più corpus. Una panoramica di alto livello dell'architettura include i seguenti componenti:
- Orchestratore/Router: riceve la query dell'utente e coordina il processo di recupero.
- Agente di pianificazione: analizza la query e determina quali corpora sono più pertinenti in base al loro
descriptions. - Motore di recupero: esegue la ricerca semantica sui corpora RAG selezionati.
- Agente di ragionamento: valuta se i contesti recuperati sono sufficienti per rispondere alla query. Se non è sufficiente, genera un feedback per attivare un altro ciclo di recupero basato sulla consapevolezza del contesto sufficiente (SCA). Per maggiori dettagli, consulta il post del blog SCA e l'articolo di ricerca.
- Generatore LLM (per
AskContexts): sintetizza i contesti recuperati per generare una risposta finale.
Come vengono selezionati i corpora
Quando una query viene eseguita su più corpus gestiti dalla RAG, il sistema deve determinare quale corpus contiene le informazioni necessarie per rispondere alla query. Ciò avviene tramite il recupero agentico:
- Mappatura del corpus: il sistema gestisce una mappa dei corpus RAG disponibili insieme alle relative descrizioni tecniche (specifiche nel campo
descriptiondel corpus RAG). - Corrispondenza semantica: un agente di pianificazione strategica (basato su un modello Gemini) valuta la query dell'utente rispetto al
descriptionsdei corpora disponibili. - Routing mirato: lo strumento di pianificazione genera un piano di recupero che mappa parti specifiche della query ai corpora più pertinenti, garantendo che il recupero sia mirato ed efficiente anziché cercare in tutti i corpora in modo ingenuo.
Esempi di codice
I seguenti esempi di codice mostrano come utilizzare le API RAG Cross Corpus Retrieval.
AsyncRetrieveContexts API
Questo esempio di codice mostra come recuperare i contesti da più corpus RAG in modo asincrono.
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}"'"
}
}
}
}
}'
Recupero risultato operazione
Poiché AsyncRetrieveContexts è un'operazione a lunga esecuzione, puoi utilizzare l'API GetOperations per eseguire il polling del risultato utilizzando l'ID operazione.
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 AskContexts
Questo esempio di codice mostra come generare direttamente una risposta eseguendo la ricerca in più corpus RAG in modo sincrono.
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}"'"
}
}
}
}
}'
Passaggi successivi
- Per scoprire di più sull'API RAG, consulta API RAG Engine.
- Per saperne di più sulle risposte di RAG, consulta Output di recupero e generazione di RAG Engine.
- Per scoprire di più su RAG Engine, consulta la panoramica di RAG Engine.