Vertex AI RAG Engine

Ruft geerdeten Kontext aus verwalteten Vertex AI RAG Engine-Korpora ab – kein selbst gehosteter Vektorspeicher, Embedding-Anbieter oder Ingestion-Pipeline erforderlich.


Was es ist

Vertex AI RAG Engine ist das verwaltete RAG-Backend von Google Cloud: Sie importieren Dokumente in einen RAG-Korpus, und die Plattform übernimmt Chunking, Embedding und Vektorsuche. Das adk-rag-Feature von vertex-rag bietet:

  • VertexRagEngineClient – einen ADC-authentifizierten, schreibgeschützten Data-Plane- Client: Korpora abrufen/auflisten, importierte Dateien auflisten und Kontexte abrufen
  • VertexAiRagRetrievalTool – Abruf als adk_core::Tool, das Rust- Gegenstück zu adk-pythons VertexAiRagRetrieval

Umfang: nur Abruf. Die Erstellung von Korpora und der Dateiimport sind Bereitstellungsaufgaben – verwenden Sie die Vertex AI Console oder die Verwaltungs-APIs von RagCorpora/RagFiles.


Installation

[dependencies]
adk-rag = { version = "2.1.0", features = ["vertex-rag"] }

Die Authentifizierung verwendet Application Default Credentials:

gcloud auth application-default login

Client

use adk_rag::vertex_rag::{RetrieveContextsRequest, VertexRagConfig, VertexRagEngineClient};

#[tokio::main]
async fn main() -> adk_core::Result<()> {
    // Or VertexRagConfig::from_env() reading GOOGLE_CLOUD_PROJECT / GOOGLE_CLOUD_LOCATION
    let config = VertexRagConfig::new("my-project", "us-central1");
    let client = VertexRagEngineClient::new_with_adc(config)?;

    // Verify the corpus exists and has imported files; fails with
    // actionable guidance when it is missing, empty, or in ERROR state.
    let corpus = client.ensure_corpus_ready("1234567890").await?;
    println!("corpus: {:?} ({:?} files)", corpus.display_name, corpus.rag_files_count);

    // Enumerate what's in the project and the corpus.
    let corpora = client.list_corpora().await?;
    let files = client.list_rag_files("1234567890").await?;
    println!("{} corpora, {} files", corpora.len(), files.len());

    // Retrieve the most relevant passages for a query.
    let request = RetrieveContextsRequest::new("what is the refund policy?", ["1234567890"])
        .similarity_top_k(5)
        .vector_distance_threshold(0.7);
    for context in client.retrieve_contexts(&request).await? {
        println!(
            "[{:.3}] {} — {}",
            context.score.unwrap_or_default(),
            context.source_display_name.as_deref().unwrap_or("<unknown>"),
            context.text.as_deref().unwrap_or(""),
        );
    }
    Ok(())
}

Korpora können als einfache IDs (aufgelöst anhand des Projekts und Standorts des Clients) oder als vollständige projects/*/locations/*/ragCorpora/*-Ressourcennamen übergeben werden.

Hinweis: similarity_top_k und vector_distance_threshold behalten die Namen von adk-python bei, werden jedoch über den aktuellen Wire-Pfad gesendet – query.ragRetrievalConfig.topK und query.ragRetrievalConfig.filter.vectorDistanceThreshold. Die veralteten v1beta1-Schreibweisen (query.similarityTopK, vertexRagStore.vectorDistanceThreshold) wurden aus v1 entfernt und werden niemals ausgegeben. vector_similarity_threshold ist der andere, gegenseitig ausschließliche Zweig des Filters.


Abruf-Tool

VertexAiRagRetrievalTool akzeptiert eine einzige erforderliche query-Zeichenfolge und gibt ein JSON-Array von {text, sourceUri, sourceDisplayName, score}-Objekten zurück. Es gibt sich selbst als schreibgeschützt und nebenläufigkeitssicher aus, sodass ToolExecutionStrategy::Auto es parallel zu anderen Lesevorgängen ausführen kann.

use std::sync::Arc;
use adk_agent::LlmAgentBuilder;
use adk_model::GeminiModel;
use adk_rag::vertex_rag::{VertexAiRagRetrievalTool, VertexRagConfig, VertexRagEngineClient};

fn main() -> anyhow::Result<()> {
    let config = VertexRagConfig::new("my-project", "us-central1");
    let client = Arc::new(VertexRagEngineClient::new_with_adc(config)?);

    let retrieval = VertexAiRagRetrievalTool::new(client, vec!["1234567890".into()])
        .similarity_top_k(5)
        .vector_distance_threshold(0.7);

    let api_key = std::env::var("GOOGLE_API_KEY")?;
    let agent = LlmAgentBuilder::new("rag-assistant")
        .description("Answers questions grounded in a Vertex AI RAG Engine corpus")
        .model(Arc::new(GeminiModel::new(&api_key, "gemini-3.7-flash")?))
        .tool(Arc::new(retrieval))
        .instruction(
            "Answer using the vertex_rag_retrieval tool. Retrieve first, then \
             answer strictly from the retrieved passages, citing sourceDisplayName.",
        )
        .build()?;
    let _ = agent;
    Ok(())
}

Siehe examples/vertex_rag für den vollständigen ausführbaren Agenten:

cargo run --manifest-path examples/vertex_rag/Cargo.toml

API-Referenz

VorgangEndpunktGibt zurück
get_corpus(corpus)GET v1beta1/{corpus}RagCorpus
ensure_corpus_ready(corpus)GET v1beta1/{corpus}RagCorpus; Fehler, wenn nicht vorhanden, leer oder im Zustand ERROR
list_corpora()GET v1beta1/{parent}/ragCorporaVec<RagCorpus>, Paginierung fortgesetzt
list_rag_files(corpus)GET v1beta1/{corpus}/ragFilesVec<RagFile>, Paginierung fortgesetzt
retrieve_contexts(&request)POST v1beta1/{parent}:retrieveContextsVec<RagContext>

Antworttypen werden tolerant deserialisiert – jedes Feld ist optional, und unbekannte Felder werden ignoriert, sodass neue Serverfelder das Parsen nicht beeinträchtigen können. Fehler enthalten die Komponente Memory (Abruf ist die Speicherdomäne; AdkError verfügt über keine eigene RAG-Komponente), den Anbieter vertex_ai und maschinenlesbare rag.vertex.*-Codes.


Umgebungsvariablen

VariableVerwendet vonBeschreibung
GOOGLE_CLOUD_PROJECTVertexRagConfig::from_envProjekt, dem die Korpora gehören
GOOGLE_CLOUD_LOCATIONVertexRagConfig::from_envRegion, z. B. us-central1
VERTEX_RAG_CORPUSBeispiel-/Live-TestsKorpus-ID oder vollständiger Ressourcenname

Stattdessen selbst gehostetes RAG?

Für eine Pipeline, die Sie selbst betreiben – mit austauschbaren Chunkern, Embedding-Anbietern und Vektorspeichern (Qdrant, LanceDB, pgvector, SurrealDB) – siehe RAG.