Wichtig: Legen Sie den Korpus description beim Erstellen eines RAG-Korpus fest. Der description kann nach der Erstellung nicht mehr bearbeitet werden. Hochwertige Beschreibungen sind für einen effektiven korpusübergreifenden Abruf von entscheidender Bedeutung, da das System auf sie angewiesen ist, um die geeigneten Korpora für Ihre Anfrage auszuwählen.
Auf dieser Seite werden zwei APIs beschrieben, AsyncRetrieveContexts und AskContexts, die RAG Cross Corpus Retrieval unterstützen und im Backend auf Agentic Retrieval basieren.
AsyncRetrieveContexts API: Dies ist eine asynchrone API, mit der Nutzer relevante Kontexte aus mehreren RAG-verwalteten Korpora abrufen können. Dies ist eine API mit langer Ausführungszeit. Nutzer können den Status der Abfrage und des Ergebnisses anhand der Vorgangs-ID abrufen.
AskContexts API: Dies ist eine synchrone API, die die Antwort auf die Anfrage direkt generiert, indem sie in mehreren von RAG verwalteten Korpora sucht.
Wichtig: Wenn Sie dieses Feature verwenden möchten, müssen Sie dem RAG Engine-Dienstkonto service-[Your project's automatically generated project number]@gcp-sa-vertex-rag.iam.gserviceaccount.com die Rolle Vertex AI User in Ihrem Projekt zuweisen.
Wichtig: Diese Funktion ist nur in us-central1 verfügbar.
Systemarchitektur und Auswahl des Korpus
In diesem Abschnitt wird die Architektur des RAG Cross Corpus Retrieval-Systems beschrieben und erläutert, wie geeignete Corpora für den Abruf ausgewählt werden.
Systemarchitektur
Das Cross-Corpus-Retrieval-System verwendet einen agentenbasierten Ansatz, um den Abruf über mehrere Korpora hinweg zu orchestrieren. Eine allgemeine Übersicht über die Architektur umfasst die folgenden Komponenten:
- Orchestrator/Router: Empfängt die Nutzeranfrage und koordiniert den Abrufvorgang.
- Planning Agent: Analysiert die Anfrage und ermittelt anhand der
descriptions, welche Corpora am relevantesten sind. - Retrieval Engine: Führt eine semantische Suche in den ausgewählten RAG-Korpora durch.
- Reasoning Agent: Prüft, ob die abgerufenen Kontexte ausreichen, um die Anfrage zu beantworten. Wenn nicht, wird Feedback generiert, um einen weiteren Abrufvorgang basierend auf Sufficient Context Awareness (SCA) auszulösen. Weitere Informationen finden Sie im SCA-Blogpost und im Forschungsbericht.
- LLM Generator (für
AskContexts): Synthetisiert die abgerufenen Kontexte, um eine endgültige Antwort zu generieren.
So werden die Korpora ausgewählt
Wenn eine Anfrage für mehrere von RAG verwaltete Korpora ausgeführt wird, muss das System ermitteln, welches Korpus die Informationen enthält, die zur Beantwortung der Anfrage erforderlich sind. Dies geschieht durch Agentic Retrieval:
- Korpuszuordnung: Das System verwaltet eine Zuordnung der verfügbaren RAG-Korpusse zusammen mit ihren technischen Beschreibungen (im Feld
descriptiondes RAG-Korpus angegeben). - Semantischer Abgleich: Ein Agent für die strategische Planung (basierend auf einem Gemini-Modell) vergleicht die Anfrage des Nutzers mit dem
descriptionsder verfügbaren Korpora. - Gezieltes Routing: Der Planner generiert einen Abrufplan, in dem bestimmte Teile der Anfrage den relevantesten Korpora zugeordnet werden. So wird sichergestellt, dass der Abruf gezielt und effizient erfolgt und nicht alle Korpora naiv durchsucht werden.
Codebeispiele
Die folgenden Codebeispiele zeigen, wie die RAG Cross Corpus Retrieval APIs verwendet werden.
AsyncRetrieveContexts API
In diesem Codebeispiel wird gezeigt, wie Sie Kontexte asynchron aus mehreren RAG-Korpora abrufen.
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}"'"
}
}
}
}
}'
Vorgangsergebnis abrufen
Da AsyncRetrieveContexts ein Vorgang mit langer Ausführungszeit ist, können Sie die GetOperations API verwenden, um das Ergebnis mit der Vorgangs-ID abzufragen.
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}"
AskContexts API
In diesem Codebeispiel wird gezeigt, wie Sie eine Antwort direkt generieren, indem Sie synchron in mehreren RAG-Korpora suchen.
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}"'"
}
}
}
}
}'
Nächste Schritte
- Weitere Informationen zur RAG API finden Sie unter RAG Engine API.
- Weitere Informationen zu den Antworten von RAG finden Sie unter Abruf- und Generierungsausgabe der RAG Engine.
- Weitere Informationen zur RAG Engine finden Sie in der RAG Engine-Übersicht.