Notes pratiques : Les trois niveaux de Google Cloud RAG : la recherche vectorielle, le moteur RAG et le récupérateur d’agents
Guide opérationnel des notes pratiques : Les trois niveaux de Google Cloud RAG – Recherche vectorielle, moteur RAG et récupération par agent : contrats, vérifications et emplacements de code à insérer.
Utilisez ceci comme une version révisée destinée aux opérateurs des idées présentées dans « Les trois niveaux de Google Cloud RAG : recherche vectorielle, moteur RAG et récupération par agent » : étapes claires, emplacements de code ordonnés, ainsi que des notes de récupération permettant de continuer en cas de transfert de tâche. L’aperçu fonctionne le mieux lorsqu’il est considéré comme une surface mesurable. Capturez un enregistrement exemplaire, un cas d’échec et les notes de réversion avant d’élargir le périmètre. Préférez des unités petites et testables à des scripts complexes. Lorsqu’une étape échoue, l’échec doit indiquer une seule responsabilité plutôt qu’un processus embrouillé.
couches architecturales et d’abstraction
Pour les couches architecturales et d’abstraction, définissez les entrées, le responsable de l’étape ainsi que les critères de fin avant de modifier du code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Considérez cette étape comme un contrat entre les entrées et les sorties validées. Donnez des noms aux artefacts, définites des vérifications de succès et refusez les terminaisons partielles silencieuses. Citez les passages qui ont réellement servi de base à la réponse. Sans citations, les opérateurs ne peuvent pas distinguer une hallucination d’un manque d’indexation.
1. Recherche vectorielle Vertex AI (Niveau 1 : Infrastructure à haute performance)
Pour 1. Vertex AI Vector Search (Niveau 1 : Infrastructure à haute performance), définissez les entrées, le responsable de l’étape et les critères d’arrêt avant de modifier le code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Enregistrez les temps d’exécution ainsi que le coût en tokens ou en requêtes à côté des résultats fonctionnels. Une visibilité précoce des coûts évite les factures inattendues lorsque le processus passe d’un environnement de démonstration à des environnements partagés. Citez les passages qui ont réellement servi de base à la réponse. Sans citations, les opérateurs ne peuvent pas distinguer une hallucination d’un manque d’indexation.
Architecture et mécanismes de base
Pour l’architecture et les mécanismes de base, définissez les entrées, le responsable de l’étape et les critères d’arrêt avant de modifier du code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Conservez la configuration en dehors du code de l’application. Les fichiers d’environnement, les bases de données secrètes et les indicateurs fonctionnels doivent être regroupés en un seul endroit que les opérateurs peuvent auditer sans avoir à lire l’ensemble du système. Citez les passages qui justifient réellement la réponse. Sans citations, les opérateurs ne peuvent pas distinguer une hallucination d’un manque d’indexation. Pour l’architecture et les mécanismes de base, définissez les entrées, le responsable de l’étape et les critères d’arrêt avant de modifier du code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Préférez des unités petites et testables aux scripts complexes. Lorsqu’une étape échoue, l’échec doit indiquer une seule responsabilité plutôt qu’un pipeline embrouillé.
e.Le pipeline de récupération ScaNN en trois étapes
Lorsque vous travaillez avec le pipeline de récupération ScaNN en trois étapes, notez d’abord les conditions requises : les entrées nécessaires, le signal de succès, ainsi que ce qui se passe en cas d’échec partiel. Cette liste de contrôle permet de maintenir l’honnêteté des modifications ultérieures du code. Considérez cette étape comme un contrat entre les entrées et les sorties validées. Donnez des noms aux artefacts, définez des vérifications de succès, et refusez les terminations partielles silencieuses. Mesurez le taux de rappel sur un ensemble de questions fixe avant d’ajuster les prompts. Les changements fréquents de prompts résolvent rarement un système de récupération insuffisant.
Infrastructure distribuée : innovations du moteur de correspondance Vertex
Lorsque vous travaillez sur « Distributed Infrastructure: Vertex Matching Engine Innovations », notez d’abord le contrat : les entrées requises, le signal de succès et ce qui se passe en cas d’échec partiel. Cette liste de contrôle permet de rester honnête lors des modifications ultérieures du code. Enregistrez les temps d’exécution ainsi que le coût des tokens ou des requêtes à côté des résultats fonctionnels. Une visibilité précoce des coûts évite les factures inattendues lorsque le système passe d’un environnement de démonstration à des environnements partagés. Mesurez le taux de rappel sur un ensemble fixe de questions avant d’ajuster les prompts. Changer fréquemment les prompts ne résout que rarement un système de récupération insuffisant.
Cas d’usage en production pour Google Vector Search
Lorsque vous travaillez sur des cas d’usage en production pour Google Vector Search, notez d’abord les exigences : entrées requises, signal de succès et conséquences en cas d’échec partiel. Cette liste de contrôle permet de rester honnête lors des modifications ultérieures du code. Gardez la configuration en dehors du code de l’application. Les fichiers d’environnement, les bases de données secrètes et les indicateurs fonctionnels doivent être regroupés en un seul endroit que les administrateurs peuvent auditer sans devoir lire l’ensemble du système. Mesurez le taux de rappel sur un ensemble fixe de questions avant d’ajuster les prompts. Un changement fréquent des prompts ne résout que rarement un système de recherche inefficace. Lorsque vous travaillez sur des cas d’usage en production pour Google Vector Search, notez d’abord les exigences : entrées requises, signal de succès et conséquences en cas d’échec partiel. Cette liste de contrôle permet de rester honnête lors des modifications ultérieures du code. Préférez des unités petites et testables plutôt que des scripts complexes. Lorsqu’une étape échoue, l’erreur doit indiquer une responsabilité précise plutôt qu’un processus embrouillé.
1. Commerce électronique multimodal en temps réel et recherche dans un catalogue visuel
- Le commerce électronique multimodal en temps réel et la recherche dans un catalogue visuel fonctionnent le mieux lorsqu’ils sont considérés comme une surface mesurable. Recueillez un exemple parfait, un cas d’échec et des notes de réversion avant d’élargir le périmètre. Considérez cette étape comme un contrat entre les entrées et les sorties validées. Nommez les artefacts, définez des critères de succès et refusez toute complétion partielle silencieuse. Séparez la politique de segmentation des données de la politique de récupération. Modifier l’une ne doit pas obliger à réécrire l’autre lorsque les métriques de qualité évoluent.
2. Génération de milliards de candidats pour les systèmes de recommandation
- La génération de candidats à l’échelle du milliard pour les systèmes de recommandation fonctionne le mieux lorsqu’elle est considérée comme une surface mesurable. Capturez un exemple réussi, un cas d’échec ainsi que la note de réversion avant d’élargir le périmètre. Enregistrez les temps d’exécution ainsi que le coût des tokens ou des requêtes à côté des résultats fonctionnels. Une visibilité précoce des coûts permet d’éviter des factures inattendues lorsque le système passe de l’environnement de démonstration à des environnements partagés. Séparez la politique de segmentation des données de la politique de récupération ; modifier l’une ne doit pas obliger à réécrire l’autre lorsque les métriques de qualité évoluent.
3. Clustering en temps réel des fraudes financières et des anomalies cybernétiques
- Le regroupement en temps réel des fraudes financières et des anomalies cybernétiques fonctionne le mieux lorsqu’il est considéré comme une surface mesurable. Capturez un enregistrement exemplaire, un cas d’échec et la note de réversion avant d’élargir le champ d’application. Conservez les paramètres de configuration en dehors du code de l’application. Les fichiers d’environnement, les bases de données secrètes et les indicateurs fonctionnels doivent être regroupés en un seul endroit que les opérateurs peuvent auditer sans devoir lire l’ensemble du système. Séparez la politique de segmentation de la politique de récupération. Modifier l’une ne doit pas obliger à réécrire l’autre lorsque les métriques de qualité évoluent.
- Le regroupement en temps réel des fraudes financières et des anomalies cybernétiques fonctionne le mieux lorsqu’il est considéré comme une surface mesurable. Capturez un enregistrement exemplaire, un cas d’échec et la note de réversion avant d’élargir le champ d’application. Préférez des unités petites et testables plutôt que des scripts complexes. Lorsqu’une étape échoue, l’erreur doit indiquer une responsabilité précise plutôt qu’un processus embrouillé.
Code : Création d’index, ingestion en flux continu et requêtes
Pour le code relatif à la création d’index, à l’ingestion en flux continu et aux requêtes, il convient de définir les entrées, le responsable de l’étape ainsi que les critères d’achèvement avant de modifier le code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu, sans avoir à deviner l’état caché. Considérez cette étape comme un contrat entre les entrées et les sorties validées. Donnez des noms aux artefacts, définites des vérifications de succès et refusez les terminations partielles silencieuses. Citez les passages qui servent de base à la réponse. Sans citations, les opérateurs ne peuvent pas distinguer une hallucination d’un manque d’indexation.
package main
import (
"context"
"fmt"
"log"
aiplatform "cloud.google.com/go/aiplatform/apiv1"
aiplatformpb "cloud.google.com/go/aiplatform/apiv1/aiplatformpb"
"google.golang.org/api/option"
)
func main() {
ctx := context.Background()
projectID := "my-enterprise-gcp-project"
location := "us-central1"
// 1. Initialize Vertex AI Match Client (Vector Search Query Service)
matchClient, err := aiplatform.NewMatchClient(ctx)
if err != nil {
log.Fatalf("failed to create vertex match client: %v", err)
}
defer matchClient.Close()
indexEndpointPath := fmt.Sprintf(
"projects/%s/locations/%s/indexEndpoints/product_catalog_endpoint_id",
projectID, location,
)
deployedIndexID := "product_catalog_deployed_v1"
// 2. Construct 768-dimensional Query Embedding Vector
queryVector := make([]float32, 768)
queryVector[0] = 0.032
queryVector[1] = -0.108
queryVector[2] = 0.449
// 3. Build Nearest Neighbor Request with Boolean & Numeric Restricts
req := &aiplatformpb.FindNeighborsRequest{
IndexEndpoint: indexEndpointPath,
DeployedIndexId: deployedIndexID,
Queries: []*aiplatformpb.FindNeighborsRequest_Query{
{
Datapoint: &aiplatformpb.IndexDatapoint{
DatapointId: "query_req_001",
FeatureVector: queryVector,
Restricts: []*aiplatformpb.IndexDatapoint_Restriction{
{
Namespace: "category",
AllowList: []string{"electronics", "audio"},
},
{
Namespace: "brand",
AllowList: []string{"sony", "bose"},
},
},
NumericRestricts: []*aiplatformpb.IndexDatapoint_NumericRestriction{
{
Namespace: "price",
Value: &aiplatformpb.IndexDatapoint_NumericRestriction_ValueFloat{
ValueFloat: 350.0,
},
Op: aiplatformpb.IndexDatapoint_NumericRestriction_LESS_EQUAL,
},
{
Namespace: "in_stock",
Value: &aiplatformpb.IndexDatapoint_NumericRestriction_ValueInt{
ValueInt: 1,
},
Op: aiplatformpb.IndexDatapoint_NumericRestriction_EQUAL,
},
},
},
NeighborCount: 5,
},
},
ReturnFullDatapoint: false,
}
// 4. Execute Sub-Millisecond Vector Similarity Search
resp, err := matchClient.FindNeighbors(ctx, req)
if err != nil {
log.Fatalf("failed to execute find neighbors: %v", err)
}
if len(resp.NearestNeighbors) > 0 {
fmt.Printf("Retrieved %d nearest neighbors:\n", len(resp.NearestNeighbors[0].Neighbors))
for _, neighbor := range resp.NearestNeighbors[0].Neighbors {
fmt.Printf("Datapoint ID: %s | Distance: %.4f\n", neighbor.Datapoint.DatapointId, neighbor.Distance)
}
}
}
2. Moteur RAG Vertex AI (Niveau 2 : Middleware géré)
Pour le niveau 2 du Vertex AI RAG Engine (Niveau 2 : Middleware géré), il convient de définir les entrées, le responsable de l’étape et les critères d’arrêt avant de modifier le code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu, sans avoir à deviner l’état caché. Enregistrez les temps d’exécution ainsi que le coût en tokens ou en requêtes à côté des résultats fonctionnels. Une visibilité précoce des coûts permet d’éviter des factures inattendues lorsque le processus passe de l’environnement de démonstration à des environnements partagés. Citez les passages qui ont réellement servi de base à la réponse. Sans citations, les opérateurs ne peuvent pas distinguer une hallucination d’un manque d’indexation.
Architecture et mécanismes de base
Pour l’architecture et les mécanismes de base, définissez les entrées, le responsable de l’étape et les critères d’arrêt avant de modifier du code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Conservez la configuration en dehors du code de l’application. Les fichiers d’environnement, les bases de données secrètes et les indicateurs fonctionnels doivent être regroupés en un seul endroit que les opérateurs peuvent auditer sans avoir à lire l’ensemble du système. Citez les passages qui justifient réellement la réponse. Sans citations, les opérateurs ne peuvent pas distinguer une hallucination d’un manque d’indexation. Pour l’architecture et les mécanismes de base, définissez les entrées, le responsable de l’étape et les critères d’arrêt avant de modifier du code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Préférez des unités petites et testables aux scripts complexes. Lorsqu’une étape échoue, l’échec doit indiquer une seule responsabilité plutôt qu’un pipeline embrouillé.
e.Un autre avantage architectural : des backends de base de données vectorielles interchangeables
Lorsque vous abordez le sujet des backends de base de données vectorielles interchangeables, notez d’abord les exigences : les entrées requises, le signal de succès et ce qui se passe en cas d’échec partiel. Cette liste de contrôle permet de rester honnête lors des modifications ultérieures du code. Considérez cette étape comme un contrat entre les entrées et les sorties validées. Donnez des noms aux éléments générés, définez des vérifications de succès et refusez les terminations partielles silencieuses. Mesurez le taux de rappel sur un ensemble de questions fixe avant d’ajuster les prompts. Changer fréquemment les prompts ne résout que rarement un système de récupération insuffisant.
Pourquoi cette architecture découplée est révolutionnaire
Lorsque vous travaillez sur le document « Pourquoi cette architecture découplée est révolutionnaire », notez d’abord le contrat : les entrées requises, le signal de succès et ce qui se passe en cas d’échec partiel. Cette liste de contrôle permet de rester honnête lors des modifications ultérieures du code. Enregistrez les temps d’exécution ainsi que le coût en tokens ou en requêtes à côté des résultats fonctionnels. Une visibilité précoce des coûts évite les factures inattendues lorsque le système passe de l’environnement de démonstration à des environnements partagés. Mesurez le taux de rappel sur un ensemble fixe de questions avant d’ajuster les prompts. Changer fréquemment les prompts ne résout que rarement un système de récupération insuffisant.
Cas d’usage en production : Assistant pour les politiques RH et le respect des réglementations au sein d’une entreprise
Lorsque vous travaillez sur le cas d’usage en production : Assistant pour les politiques RH d’entreprise et la conformité réglementaire, notez d’abord les exigences du contrat : entrées requises, signal de succès et conséquences en cas d’échec partiel. Cette liste de contrôle permet de rester honnête lors des modifications ultérieures du code. Conservez la configuration en dehors du code de l’application. Les fichiers d’environnement, les bases de données secrètes et les indicateurs fonctionnels doivent être regroupés en un seul endroit que les opérateurs peuvent auditer sans devoir lire l’ensemble du système. Mesurez le taux de rappel sur un ensemble fixe de questions avant d’ajuster les prompts. Un changement fréquent des prompts ne résout que rarement un système de récupération insuffisant. Lorsque vous travaillez sur le cas d’usage en production : Assistant pour les politiques RH d’entreprise et la conformité réglementaire, notez d’abord les exigences du contrat : entrées requises, signal de succès et conséquences en cas d’échec partiel. Cette liste de contrôle permet de rester honnête lors des modifications ultérieures du code. Préférez des unités petites et testables plutôt que des scripts complexes. Lorsqu’une étape échoue, l’échec doit permettre d’identifier une seule cause à corriger.
la faisabilité plutôt qu’un processus enchevêtré.Code : Génération ancrée avec Vertex RAG Store
Le code de la Génération ancrée avec Vertex RAG Store fonctionne le mieux lorsqu’il est considéré comme une surface mesurable. Capturez un transcript idéal, un cas d’échec et la note de réversion avant d’élargir le périmètre. Considérez cette étape comme un contrat entre les entrées et les sorties validées. Nommez les artefacts, définez des vérifications de succès et refusez toute complétion partielle silencieuse. Séparez la politique de segmentation des données de la politique de récupération. Modifier l’une ne doit pas obliger à réécrire l’autre lorsque les métriques de qualité changent.
package main
import (
"context"
"fmt"
"log"
"google.golang.org/genai"
)
func main() {
ctx := context.Background()
projectID := "my-enterprise-gcp-project"
location := "us-central1"
// 1. Initialize Google GenAI Client with Vertex AI Backend
client, err := genai.NewClient(ctx, &genai.ClientConfig{
Project: projectID,
Location: location,
Backend: genai.BackendVertexAI,
})
if err != nil {
log.Fatalf("failed to initialize genai client: %v", err)
}
// 2. Reference the Managed RAG Corpus Resource
// (Corpus can be backed by RagManagedDb, Vertex Vector Search, Weaviate, or Pinecone)
ragCorpusResource := fmt.Sprintf(
"projects/%s/locations/%s/ragCorpora/enterprise_hr_policies_corpus",
projectID, location,
)
// 3. Configure Grounding Tool with Vertex RAG Store and Semantic Reranking
config := &genai.GenerateContentConfig{
Tools: []*genai.Tool{
{
Retrieval: &genai.Retrieval{
VertexRagStore: &genai.VertexRagStore{
RagResources: []*genai.VertexRagStoreRagResource{
{RagCorpus: ragCorpusResource},
},
SimilarityTopK: genai.Ptr(int64(3)),
VectorDistanceThreshold: genai.Ptr(0.5),
},
},
},
},
}
// 4. Generate Grounded Response with Gemini 3.5 Flash
prompt := "Summarize our international meal reimbursement policy and specify receipt requirements."
result, err := client.Models.GenerateContent(ctx, "gemini-3.5-flash", genai.Text(prompt), config)
if err != nil {
log.Fatalf("failed to generate grounded content: %v", err)
}
// 5. Output Synthesized Text and Inspect Verifiable Grounding Supports
fmt.Println("--- Grounded Answer from Gemini ---")
fmt.Println(result.Text())
if len(result.Candidates) > 0 && result.Candidates[0].GroundingMetadata != nil {
meta := result.Candidates[0].GroundingMetadata
fmt.Printf("\nGrounding supports detected: %d\n", len(meta.GroundingSupports))
for _, support := range meta.GroundingSupports {
if support.Segment != nil {
fmt.Printf("Segment: %q (Grounded by chunks: %v)\n", support.Segment.Text, support.GroundingChunkIndices)
}
}
}
}
3. Récupération d’informations par l’agent Vertex AI (Niveau 3 : Raisonnement autonome)
- Vertex AI Agent Retrieval (Niveau 3 : Raisonnement autonome) fonctionne le mieux lorsqu’il est considéré comme une surface mesurable. Capturez un enregistrement exemplaire, un cas d’échec et la note de réversion avant d’élargir le périmètre. Enregistrez les temps d’exécution ainsi que le coût en tokens ou en requêtes à côté des résultats fonctionnels. Une visibilité précoce des coûts évite les factures inattendues lorsque le système passe d’un environnement de démonstration à des environnements partagés. Fixez un budget en tokens par tour et par session. Les outils agents élargissent de manière importante le contexte ; des plafonds stricts empêchent que les démonstrations ne se transforment en factures inattendues.
Architecture de base et attributs clés
L’Architecture de base et les Attributs clés fonctionnent le mieux lorsqu’ils sont considérés comme une surface mesurable. Capturez un exemplaire idéal, un cas d’échec et la note de réversion avant d’élargir le périmètre. Gardez la configuration en dehors du code de l’application. Les fichiers d’environnement, les bases de données secrètes et les indicateurs fonctionnels doivent être regroupés en un seul endroit que les opérateurs peuvent auditer sans devoir lire l’ensemble du système. Séparez la politique de segmentation de la politique de récupération. Modifier l’une ne doit pas obliger à réécrire l’autre lorsque les métriques de qualité évoluent. L’Architecture de base et les Attributs clés fonctionnent le mieux lorsqu’ils sont considérés comme une surface mesurable. Capturez un exemplaire idéal, un cas d’échec et la note de réversion avant d’élargir le périmètre. Préférez des unités petites et testables aux scripts complexes. Lorsqu’une étape échoue, l’échec doit pointer vers une seule responsabilité plutôt que vers un processus embrouillé.
Attributs clés de la récupération par Vertex AI Agent
Pour les attributs clés de la fonction de récupération d’informations Vertex AI Agent, définissez les entrées, le responsable de l’étape et les critères d’arrêt avant de modifier le code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Considérez cette étape comme un contrat entre les entrées et les sorties validées. Donnez des noms aux artefacts, définites des vérifications de succès et refusez les terminations partielles silencieuses. Citez les passages qui ont réellement servi de base à la réponse. Sans citations, les opérateurs ne peuvent pas distinguer une hallucination d’un manque dans l’indexation.
Cas d’utilisation en production : Agent autonome de résolution d’incidents SRE DevOps
Pour un cas d’usage en production : agent autonome de résolution d’incidents SRE DevOps, il convient de définir les entrées, le responsable de chaque étape ainsi que les critères d’arrêt avant de modifier du code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu, sans avoir à deviner l’état caché. Enregistrez les temps d’exécution ainsi que le coût des tokens ou des requêtes à côté des résultats fonctionnels. Une visibilité précoce des coûts permet d’éviter des factures inattendues lorsque le processus passe de l’environnement de démonstration à des environnements partagés. Citez les passages qui servent réellement de base à la réponse ; sans citations, les opérateurs ne peuvent pas distinguer une hallucination d’un manque d’indexation.
Code : Création d’un agent autonome avec Google ADK
Pour le Code : Création d’un agent autonome avec Google ADK, définissez les entrées, le responsable de l’étape et les critères d’arrêt avant de modifier le code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Conservez la configuration en dehors du code de l’application. Les fichiers d’environnement, les stocks de secrets et les flags fonctionnels doivent être regroupés en un seul endroit que les opérateurs peuvent auditer sans devoir lire l’ensemble du système. Citez les passages qui ont réellement servi de base à la réponse. Sans citations, les opérateurs ne peuvent pas distinguer une hallucination d’un manque d’indexation. Pour le Code : Création d’un agent autonome avec Google ADK, définissez les entrées, le responsable de l’étape et les critères d’arrêt avant de modifier le code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Préférez des unités petites et testables plutôt que des scripts volumineux. Lorsqu’une étape échoue, l’échec doit indiquer une seule solution à appliquer.
la faisabilité plutôt qu’un pipeline embrouillé.package main
import (
"context"
"fmt"
"log"
"google.golang.org/adk/agent"
"google.golang.org/adk/model"
"google.golang.org/adk/runner"
"google.golang.org/adk/tool"
"google.golang.org/adk/tool/vertexsearch"
)
// TelemetryQueryParams defines input arguments for the structured telemetry tool.
type TelemetryQueryParams struct {
ServiceName string `json:"service_name" jsonschema:"description=The target microservice name (e.g. payment-gateway)"`
TimeWindowMinutes int `json:"time_window_minutes" jsonschema:"description=The lookback window in minutes"`
}
// TelemetryReport defines the structured metrics returned to the agent.
type TelemetryReport struct {
Service string `json:"service"`
TimeWindow string `json:"time_window"`
ErrorRate float64 `json:"error_rate_percentage"`
DominantStatus string `json:"dominant_http_status"`
RootDependency string `json:"root_downstream_dependency"`
ActiveRestarts int `json:"active_pod_restarts"`
Region string `json:"region"`
}
// QuerySystemTelemetry is a custom tool function registered with the ADK agent.
func QuerySystemTelemetry(ctx context.Context, params TelemetryQueryParams) (TelemetryReport, error) {
// Simulated query against Cloud Spanner and BigQuery live telemetry
return TelemetryReport{
Service: params.ServiceName,
TimeWindow: fmt.Sprintf("%dm", params.TimeWindowMinutes),
ErrorRate: 14.8,
DominantStatus: "504 Gateway Timeout",
RootDependency: "auth-token-validator-v2",
ActiveRestarts: 12,
Region: "us-central1",
}, nil
}
func main() {
ctx := context.Background()
projectID := "my-enterprise-gcp-project"
// 1. Create Structured Telemetry Function Tool using Google ADK
telemetryTool, err := tool.NewFunction(
"query_system_telemetry",
"Queries Cloud Spanner and BigQuery for live microservice error rates and container health.",
QuerySystemTelemetry,
)
if err != nil {
log.Fatalf("failed to create telemetry tool: %v", err)
}
// 2. Configure Vertex AI Search Datastore Retrieval Tool in Google ADK
datastoreResource := fmt.Sprintf(
"projects/%s/locations/global/collections/default_collection/dataStores/sre-runbooks-datastore",
projectID,
)
runbookTool, err := vertexsearch.NewDatastoreTool(vertexsearch.DatastoreConfig{
Name: "sre_runbook_search",
Description: "Searches authoritative SRE incident runbooks, architecture specs, and standard operating procedures (SOPs).",
DatastoreID: datastoreResource,
})
if err != nil {
log.Fatalf("failed to create vertex search tool: %v", err)
}
// 3. Define Autonomous SRE Agent using Google ADK
systemInstruction := `You are an expert Autonomous Site Reliability Engineering (SRE) Incident Agent.
When investigating production alerts:
1. Use query_system_telemetry to inspect live metrics and isolate the failing component.
2. Formulate a targeted search query with sre_runbook_search to find the exact recovery SOP.
3. Synthesize a comprehensive Incident Diagnosis Report containing:
- Root cause analysis with telemetry evidence
- Step-by-step remediation commands cited directly from the runbook
- Actionable rollback or mitigation steps.`
sreIncidentAgent, err := agent.New(agent.Config{
Name: "sre_incident_investigator",
Model: model.Gemini("gemini-3.5-flash"),
Description: "Autonomous SRE agent that investigates telemetry, retrieves runbooks, and drafts mitigation plans.",
Instruction: systemInstruction,
Tools: []tool.Tool{telemetryTool, runbookTool},
})
if err != nil {
log.Fatalf("failed to initialize ADK agent: %v", err)
}
// 4. Execute Multi-Turn Autonomous Workflow with Google ADK Runner
r := runner.NewInMemoryRunner(sreIncidentAgent)
userIncidentPrompt := "CRITICAL ALERT: Payment service checkout latency spiked to 4500ms in us-central1. " +
"Investigate the payment-gateway service, locate the relevant runbook, and recommend immediate remediation."
response, err := r.Run(ctx, userIncidentPrompt)
if err != nil {
log.Fatalf("agent execution failed: %v", err)
}
fmt.Println("--- Agentic Incident Resolution Plan ---")
fmt.Println(response.Text())
}
4. Cadre de décision : choisir le bon service Google RAG
Lorsque vous travaillez sur le point 4. Cadre de décision : choisir le bon service Google RAG, notez d’abord les exigences : entrées requises, signal de succès et ce qui se passe en cas d’échec partiel. Cette liste de contrôle permet de rester honnête lors des modifications ultérieures du code. Considérez cette étape comme un contrat entre les entrées et les sorties validées. Donnez des noms aux artefacts, définez des vérifications de succès et refusez les complétions partielles silencieuses. Mesurez le taux de rappel sur un ensemble fixe de questions avant d’ajuster les prompts. Le changement fréquent des prompts ne résout que rarement un système de récupération insuffisant.
Matrice de comparaison
Lors de l’élaboration d’une matrice de comparaison, notez d’abord les exigences du contrat : les entrées requises, le signal de succès et ce qui se passe en cas d’échec partiel. Cette liste de contrôle permet de rester honnête lors des modifications ultérieures du code. Enregistrez les temps d’exécution ainsi que le coût des jetons ou des requêtes à côté des résultats fonctionnels. Une visibilité précoce des coûts évite les factures inattendues lorsque le système passe de l’environnement de démonstration à des environnements partagés. Mesurez le taux de rappel sur un ensemble fixe de questions avant d’ajuster les prompts. Un changement fréquent des prompts ne résout que rarement un système de récupération insuffisant.
5. Résumé et enseignements architecturaux
Lorsque vous travaillez sur la section 5. Résumé et enseignements architecturaux, notez d’abord les exigences du contrat : entrées requises, signal de succès et comportement en cas d’échec partiel. Cette liste de contrôle permet de garantir l’honnêteté des modifications ultérieures du code. Gardez la configuration en dehors du code de l’application. Les fichiers d’environnement, les bases de données secrètes et les indicateurs fonctionnels doivent être regroupés en un seul endroit que les opérateurs peuvent auditer sans devoir lire l’ensemble du système. Mesurez le taux de rappel sur un ensemble fixe de questions avant d’ajuster les prompts. Un changement fréquent des prompts résout rarement un système de récupération insuffisant. Lorsque vous travaillez sur la section 5. Résumé et enseignements architecturaux, notez d’abord les exigences du contrat : entrées requises, signal de succès et comportement en cas d’échec partiel. Cette liste de contrôle permet de garantir l’honnêteté des modifications ultérieures du code. Préférez des unités petites et testables plutôt que des scripts complexes. Lorsqu’une étape échoue, l’échec doit indiquer une seule responsabilité et non un processus embrouillé.
Liste de contrôle opérationnelle
Lors de l’élaboration de la liste de contrôle opérationnelle, notez d’abord les éléments requis : les données nécessaires, le signal de succès, ainsi que ce qui se passe en cas d’échec partiel. Cette liste permet de garantir l’honnêteté des modifications ultérieures du code.
Dokumentez ensemble le parcours normal et le parcours de récupération. Les tentatives répétées, les contrôles humains et la gestion des messages non traités font partie intégrante du produit, et non d’améliorations apportées ultérieurement.
Évaluez le taux de rappel sur un ensemble fixe de questions avant d’ajuster les prompts. Un changement fréquent des prompts ne résout que rarement un système de récupération insuffisant.
Gardez l’état du graphe simple et structuré. Les blocs imbriqués masquent l’identité du nœud qui a saisi chaque champ et perturbent la reprise après interruption.
Évaluez séparément les réponses en une seule étape et les trajectoires en plusieurs étapes. L’agrégation des scores de conversation cache les échecs liés aux boucles logicielles.
Rédigez un petit manuel d’opération : comment rotationner les clés, comment vider la file d’attente, comment annuler la dernière ingestion.
Au préalable de promouvoir le stack, figez les versions, conservez une transcription « or » pour le chemin critique, et confirmez les étapes de rollback. Les environnements partagés nécessitent des limites de débit, des vérifications de location, ainsi qu’un responsable clair pour la rotation des secrets. Préférez une fiabilité sans faille à de brillantes démonstrations ponctuelles.
Note pour le lot 331adf7ac401 : gardez les clés du fournisseur hors du répertoire, fixez un plafond pour les tokens par session, et stockez les transcriptions à côté des fichiers de configuration d’évaluation afin que les remplacements ultérieurs de modèles restent comparables.