RAG Engine – Korpusübergreifender Abruf

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.
Architektur für das abfrageübergreifende Abrufen

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:

  1. Korpuszuordnung: Das System verwaltet eine Zuordnung der verfügbaren RAG-Korpusse zusammen mit ihren technischen Beschreibungen (im Feld description des RAG-Korpus angegeben).
  2. Semantischer Abgleich: Ein Agent für die strategische Planung (basierend auf einem Gemini-Modell) vergleicht die Anfrage des Nutzers mit dem descriptions der verfügbaren Korpora.
  3. 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