Vertex AI RAG Engine

Récupérez du contexte contextualisé depuis les corpus gérés de Vertex AI RAG Engine — sans magasin vectoriel auto-hébergé, fournisseur d’embeddings ni pipeline d’ingestion requis.


Présentation

Vertex AI RAG Engine est le backend RAG géré de Google Cloud : vous importez des documents dans un corpus RAG et la plateforme se charge du découpage en segments, de la génération des embeddings et de la recherche vectorielle. La fonctionnalité vertex-rag de adk-rag fournit :

  • VertexRagEngineClient — un client de plan de données en lecture seule, authentifié par ADC : récupération et énumération des corpus, énumération des fichiers importés et récupération des contextes
  • VertexAiRagRetrievalTool — la récupération sous forme d’un adk_core::Tool, l’équivalent Rust de VertexAiRagRetrieval de adk-python

Portée : récupération uniquement. La création des corpus et l’importation des fichiers relèvent du provisionnement — utilisez la console Vertex AI ou le APIs de gestion RagCorpora/RagFiles.


Installation

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

L’authentification utilise les identifiants par défaut de l’application :

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(())
}

Les corpus peuvent être transmis sous forme d’identifiants seuls (résolus par rapport au projet et à l’emplacement du client) ou de noms de ressources projects/*/locations/*/ragCorpora/* complets.

Remarque : similarity_top_k et vector_distance_threshold conservent les noms de adk-python, mais sont envoyés via le chemin réseau actuel — query.ragRetrievalConfig.topK et query.ragRetrievalConfig.filter.vectorDistanceThreshold. Les appellations v1beta1 obsolètes (query.similarityTopK, vertexRagStore.vectorDistanceThreshold) ont été supprimées de v1 et ne sont jamais émises. vector_similarity_threshold est l’autre branche, mutuellement exclusive, du filtre.


Outil de récupération

VertexAiRagRetrievalTool accepte une unique chaîne query obligatoire et renvoie un tableau JSON d’objets {text, sourceUri, sourceDisplayName, score}. Il se déclare en lecture seule et sûr pour les accès concurrents ; ainsi, ToolExecutionStrategy::Auto peut l’exécuter en parallèle avec d’autres opérations de lecture.

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(())
}

Consultez examples/vertex_rag pour découvrir l’agent complet et exécutable :

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

API référence

OpérationPoint de terminaisonRenvoie
get_corpus(corpus)GET v1beta1/{corpus}RagCorpus (404 devient une erreur exploitable indiquant que l’élément est introuvable)
ensure_corpus_ready(corpus)GET v1beta1/{corpus}RagCorpus ; erreurs en cas d’absence, de valeur vide ou d’état ERROR
list_corpora()GET v1beta1/{parent}/ragCorporaVec<RagCorpus>, pagination suivie
list_rag_files(corpus)GET v1beta1/{corpus}/ragFilesVec<RagFile>, pagination suivie
retrieve_contexts(&request)POST v1beta1/{parent}:retrieveContextsVec<RagContext>

Les types de réponse sont désérialisés de manière permissive — chaque champ est facultatif et les champs inconnus sont ignorés, de sorte que les nouveaux champs du serveur ne peuvent pas perturber l’analyse. Les erreurs contiennent le composant Memory (la récupération relève du domaine de la mémoire ; AdkError ne possède pas de composant RAG dédié), le fournisseur vertex_ai et des codes rag.vertex.* lisibles par machine.


Variables d’environnement

VariableUtilisée parDescription
GOOGLE_CLOUD_PROJECTVertexRagConfig::from_envProjet propriétaire des corpus
GOOGLE_CLOUD_LOCATIONVertexRagConfig::from_envRégion, par exemple us-central1
VERTEX_RAG_CORPUStests d’exemple / en conditions réellesID du corpus ou nom complet de la ressource

Vous préférez un RAG auto-hébergé ?

Pour un pipeline que vous exécutez vous-même — des découpeurs enfichables, des fournisseurs d’embeddings et des bases de données vectorielles (Qdrant, LanceDB, pgvector, SurrealDB) — consultez RAG.