Praktyczne notatki: Trzy poziomy Google Cloud RAG: wyszukiwanie wektorowe, silnik RAG oraz odzyskiwanie informacji przez agenta
Szczegółowy przewodnik po praktycznych notatkach: Trzy poziomy Google Cloud RAG: wyszukiwanie wektorowe, silnik RAG oraz odzyskiwanie informacji przez agenta: umowy, sprawdzenia oraz gotowe miejsca na kod.
Niech to służy jako przebudowa idei z artykułu „The Three Tiers of Google Cloud RAG: Vector Search, RAG Engine, and Agent Retrieval” przeznaczona dla operatorów: jasne etapy, uporządkowane sekcje kodu oraz notatki dotyczące przywracania stanu po przeniesieniu obowiązków. Przegląd funkcjonowania działa najlepiej, gdy traktowany jest jako mierzalna struktura. Zanim rozszerzysz zakres, zapisz jeden idealny przykład działania, jeden przypadek awarii oraz notatkę dotyczącą cofnięcia zmian.
Kiły architektoniczne i warstwy abstrakcji
Dla warstw architektonicznych i abstrakcyjnych należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić dany krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Traktuj tę fazę jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Nazwij poszczególne elementy, zdefiniuj kryteria sukcesu i odrzuć ciche, częściowe ukończenie zadań. Podaj fragmenty tekstu, które faktycznie stanowią podstawę odpowiedzi. Bez tych odniesień operatorzy nie będą w stanie odróżnić halucynacji od luki w indeksowaniu.
1. Vertex AI Vector Search (Poziom 1: Infrastruktura o wysokiej wydajności)
Dla 1. Vertex AI Vector Search (Poziom 1: Infrastruktura o wysokiej wydajności) należy zdefiniować dane wejściowe, osobę odpowiedzialną za daną czynność oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić tę czynność na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu systemu. Należy rejestrować czas trwania oraz koszt tokenów lub zapytań obok wyników funkcjonalnych. Wczesna widoczność kosztów zapobiega nieoczekiwanym rachunkom, gdy przechodzi się z środowiska demonstracyjnego do współdzielonych środowisk. Należy podawać fragmenty tekstu, które faktycznie stanowiły podstawę odpowiedzi. Bez tych odniesień operatorzy nie mogą odróżnić halucynacji od luki w indeksowaniu.
Architektura i mechanizmy podstawowe
W przypadku podstawowej architektury i mechaniki należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie uruchomić dany krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Konfigurację należy przechowywać poza kodem aplikacji. Pliki środowiskowe, magazyny tajnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności czytania całej struktury. Należy podawać konkretne fragmenty tekstu, na których opiera się odpowiedź. Bez tych odniesień operatorzy nie są w stanie odróżnić halucynacji od braku danych w indeksie. W przypadku podstawowej architektury i mechaniki należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie uruchomić dany krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Należy preferować małe, testowalne jednostki nad rozbudowanymi skryptami. Gdy dany krok zawiedzie, powinien wskazywać na konkretną odpowiedzialność, a nie na skomplikowaną strukturę procesów.
e.Trójetapowy pipeline wyszukiwania ScaNN
Pracując nad trójetapowym pipeline’em wyszukiwania ScaNN, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego niepowodzenia. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Traktuj ten etap jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Nadaj nazwy poszczególnym elementom, zdefiniuj kryteria sukcesu i odrzuć ciche, częściowe ukończenie zadania. Zmierz stopień przywoływalności na ustalonej serii pytań przed dostosowywaniem promptów. Częste zmiany promptów rzadko poprawiają słabą skuteczność wyszukiwania.
Infrastruktura rozproszona: innowacje w silniku dopasowywania Vertex
Gdy pracujesz nad „Distributed Infrastructure: Vertex Matching Engine Innovations”, najpierw zapisz specyfikację: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego awarii. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Zapisz czas wykonywania oraz koszt tokenów lub zapytań obok wyników funkcjonalnych. Wczesna widoczność kosztów zapobiega nieoczekiwanym rachunkom, gdy środowisko przechodzi z wersji demonstracyjnej do środowisk współdzielonych. Zmierz stopień odzyskiwania informacji na ustalonej grupie pytań przed dostosowywaniem promptów. Częste zmiany promptów rzadko poprawiają słabe możliwości wyszukiwania.
Zastosowania w produkcji dla Google Vector Search
Gdy opracowujesz przypadki użycia w środowisku produkcyjnym dla Google Vector Search, najpierw zapisz specyfikację: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego awarii. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Przechowuj konfigurację poza kodem aplikacji. Pliki środowiskowe, magazyny tajnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności czytania całej struktury. Zmierz stopień odzyskiwania informacji na ustalonej serii pytań przed dostosowywaniem promptów. Częste zmiany promptów rzadko poprawiają słabe wyniki wyszukiwania. Gdy opracowujesz przypadki użycia w środowisku produkcyjnym dla Google Vector Search, najpierw zapisz specyfikację: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego awarii. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Wolij małe, testowalne jednostki nad rozbudowane skrypty. Gdy jakiś krok zawiedzie, awaria powinna wskazywać na konkretną odpowiedzialność, a nie na skomplikowaną sekwencję operacji.
1. Real-Time Multimodal E-Commerce i wyszukiwanie w wizualnym katalogu
- Real-Time Multimodal E-Commerce i wyszukiwanie w wizualnym katalogu działają najlepiej, gdy traktuje się je jako mierzalną powierzchnię do analizy. Zapisz jeden idealny przykład działania, jeden przypadek awarii oraz notatkę dotyczącą cofnięcia działań przed rozszerzaniem zakresu. Traktuj tę fazę jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Nazwij poszczególne elementy, zdefiniuj kryteria sukcesu i odrzuć przypadki częściowego ukończenia bez informacji. Rozdziel politykę dzielenia na fragmenty od polityki wyszukiwania. Zmiana jednej z nich nie powinna zmuszać do przepisywania drugiej, gdy zmieniają się metryki jakości.
2. Generowanie miliardów kandydatów do systemów rekomendacji
- Billion-Scale Candidate Generation for Recommendation Funnels funkcjonuje najlepiej, gdy jest traktowana jako mierzalna struktura. Zanim rozszerzysz zakres, zapisz jeden idealny przykład działania, jeden przypadek awarii oraz notatkę dotyczącą cofnięcia zmian. Obok wyników funkcjonalnych zapisz również czasy wykonywania operacji oraz koszt tokenów lub zapytań. Wczesna widoczność kosztów zapobiega niespodziewanym rachunkom, gdy przechodzi się z środowiska demonstracyjnego do współdzielonych środowisk. Rozdziel politykę dzielenia na fragmenty od polityki wyszukiwania. Zmiana jednej z nich nie powinna zmuszać do przepisywania drugiej, gdy zmieniają się metryki jakości.
3. Klasterowanie oszustw finansowych w czasie rzeczywistym i anomalii cybernetycznych
- Klastrowanie oszustw finansowych w czasie rzeczywistym oraz anomalii cybernetycznych działa najlepiej, gdy jest traktowane jako mierzalna powierzchnia. Zapisz jeden idealny zapis transakcji, jeden przypadek awarii oraz notatkę dotyczącą cofnięcia działań, zanim rozszerzysz zakres. Utrzymuj konfigurację poza kodem aplikacji. Pliki środowiskowe, magazyny haseł oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności czytania całej struktury. Oddziel zasadę dzielenia na fragmenty od zasady pobierania danych. Zmiana jednej z nich nie powinna zmuszać do przepisywania drugiej w przypadku zmian wskaźników jakości.
- Klastrowanie oszustw finansowych w czasie rzeczywistym oraz anomalii cybernetycznych działa najlepiej, gdy jest traktowane jako mierzalna powierzchnia. Zapisz jeden idealny zapis transakcji, jeden przypadek awarii oraz notatkę dotyczącą cofnięcia działań, zanim rozszerzysz zakres. Wolij małe, testowalne jednostki nad rozbudowane skrypty. Gdy jakiś krok zawiedzie, awaria powinna wskazywać na konkretną odpowiedzialność, a nie na skomplikowaną sekwencję działań.
Kod: tworzenie indeksów, przetwarzanie strumieniowe i wyszukiwanie
Dla sekcji Kod: tworzenie indeksów, przetwarzanie strumieniowe i wyszukiwanie należy zdefiniować dane wejściowe, osobę odpowiedzialną za daną czynność oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić tę czynność na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Traktuj tę fazę jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Nazwij poszczególne elementy, zdefiniuj kryteria sukcesu i odrzuć przypadkowe, częściowe ukończenie zadania. Podaj fragmenty tekstu, które faktycznie stanowią podstawę odpowiedzi. Bez tych odniesień operatorzy nie będą w stanie odróżnić halucynacji od braku indeksowania.
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. Vertex AI RAG Engine (Poziom 2: zarządzany middleware)
Dla wersji 2. Vertex AI RAG Engine (Poziom 2: Zarządzany middleware) należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić dany krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu systemu. Należy rejestrować czasy wykonywania operacji oraz koszt tokenów lub zapytań obok wyników funkcjonalnych. Wczesna widoczność kosztów zapobiega nieoczekiwanym rachunkom, gdy przechodzi się z środowiska demonstracyjnego do współdzielonych środowisk. Należy wskazać konkretne fragmenty tekstu, na których opierała się odpowiedź. Bez takich odniesień operatorzy nie są w stanie odróżnić efektu halucynacji od luki w indeksowaniu.
Architektura i mechanizmy podstawowe
W przypadku podstawowej architektury i mechaniki należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie uruchomić dany krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Konfigurację należy przechowywać poza kodem aplikacji. Pliki środowiskowe, magazyny tajnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności czytania całej struktury. Należy podawać konkretne fragmenty tekstu, na których opiera się odpowiedź. Bez tych odniesień operatorzy nie są w stanie odróżnić halucynacji od braku danych w indeksie. W przypadku podstawowej architektury i mechaniki należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie uruchomić dany krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Należy preferować małe, testowalne jednostki nad rozbudowanymi skryptami. Gdy dany krok zawiedzie, powinien wskazywać na konkretną odpowiedzialność, a nie na skomplikowaną strukturę przepływu danych.
e.Kolejna zaleta architektury: interfejsy backendu bazy danych wektorowych typu plugable
Pracując nad kwestią kolejnej zalety architektury, czyli interfejsami backendu bazy danych wektorowych typu plugable, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego niepowodzenia. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Traktuj ten etap jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Nadaj nazwy poszczególnym elementom, zdefiniuj kryteria sukcesu i unikaj cichego ukończenia zadania w sposób niepełny. Zmierz stopień odzyskiwania informacji na ustalonej serii pytań przed dostosowywaniem promptów. Częste zmiany promptów rzadko poprawiają słabe możliwości wyszukiwania.
Dlaczego ta rozdzielona architektura jest przełomowa
Gdy czytasz „Dlaczego ta architektura odseparowana jest przełomem”, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego niepowodzenia. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Obok wyników funkcjonalnych zapisz czas wykonywania oraz koszt tokena lub zapytania. Wczesna widoczność kosztów zapobiega nieoczekiwanym rachunkom, gdy przechodzi się z środowiska demonstracyjnego do wspólnych środowisk. Zmierz stopień odzyskiwania informacji na ustalonej grupie pytań przed dostosowywaniem promptów. Częste zmiany promptów rzadko naprawiają słabe możliwości wyszukiwania.
Przypadek użycia w produkcji: Asystent ds. polityki HR i zgodności regulacyjnej w przedsiębiorstwach
Gdy pracujesz nad przypadkiem użycia w produkcji: Enterprise HR Policy and Regulatory Compliance Assistant, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się przy częściowym niepowodzeniu. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Przechowuj konfigurację poza kodem aplikacji. Pliki środowiskowe, magazyny tajnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności czytania całej struktury. Zmierz stopę przywoływania odpowiedzi na ustalonej serii pytań przed dostosowywaniem promptów. Częste zmiany promptów rzadko naprawiają słabe mechanizmy wyszukiwania. Gdy pracujesz nad przypadkiem użycia w produkcji: Enterprise HR Policy and Regulatory Compliance Assistant, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się przy częściowym niepowodzeniu. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Wolij małe, testowalne jednostki nad rozbudowane skrypty. Gdy jakiś krok się nie powiedzie, błąd powinien wskazywać na konkretną przyczynę.
możliwość działania, a nie skomplikowany proces.Kod: Generowanie oparte na danych z Vertex RAG Store
Kod: Generowanie oparte na danych z Vertex RAG Store działa najlepiej, gdy traktuje się je jako mierzalną powierzchnię. Zapisz jeden idealny przykład, jeden przypadek awarii oraz notatkę dotyczącą cofnięcia działań przed rozszerzaniem zakresu. Traktuj tę fazę jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Nadaj nazwy poszczególnym elementom, zdefiniuj kryteria sukcesu i odrzucaj ciche, częściowe ukończenie zadań. Oddziel politykę dzielenia na fragmenty od polityki wyszukiwania danych. Zmiana jednej z nich nie powinna zmuszać do przepisywania drugiej, gdy zmieniają się metryki jakości.
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. Vertex AI Agent Retrieval (Poziom 3: Autonomiczne rozumowanie)
- Vertex AI Agent Retrieval (Poziom 3: Autonomiczne rozumowanie) funkcjonuje najlepiej, gdy traktowany jest jako mierzalna zmienna. Zanim rozszerzysz zakres, zdokumentuj jeden idealny przypadek działania, jeden przypadek awarii oraz notatkę dotyczącą cofnięcia działań. Zapisuj czasy wykonywania zadań oraz koszt tokenów lub zapytań obok wyników funkcjonalnych. Wczesna widoczność kosztów zapobiega nieoczekiwanym rachunkom, gdy przechodzi się od wersji demonstracyjnej do środowisk współdzielonych. Ustal budżet tokenów na jeden ruch i na jedną sesję. Narzędzia typu agentic intensywnie rozszerzają kontekst; sztywne limity zapobiegają temu, by wersje demonstracyjne przeradzały się w nieoczekiwane rachunki.
Architektura podstawowa i kluczowe atrybuty
Core Architecture and Key Attributes funkcjonują najlepiej, gdy traktuje się je jako mierzalną powierzchnię do analizy. Zapisz jeden idealny przykład działania, jeden przypadek awarii oraz notatkę dotyczącą cofnięcia zmian, zanim rozszerzysz zakres pracy. Trzymaj konfigurację poza kodem aplikacji. Pliki środowiskowe, magazyny poufnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności czytania całej struktury. Oddziel zasadę dzielenia na fragmenty od zasady pobierania danych. Zmiana jednej z nich nie powinna zmuszać do przepisywania drugiej, gdy zmieniają się metryki jakości. Core Architecture and Key Attributes funkcjonują najlepiej, gdy traktuje się je jako mierzalną powierzchnię do analizy. Zapisz jeden idealny przykład działania, jeden przypadek awarii oraz notatkę dotyczącą cofnięcia zmian, zanim rozszerzysz zakres pracy. Wolij małe, testowalne jednostki nad rozbudowane skrypty. Gdy jakiś krok zawiedzie, awaria powinna wskazywać na konkretną odpowiedzialność, a nie na skomplikowaną sekwencję działań.
Kluczowe cechy mechanizmu pobierania danych w Vertex AI Agent
Dla kluczowych atrybutów funkcji Vertex AI Agent Retrieval należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić dany krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Traktuj tę fazę jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Nazwij poszczególne elementy, zdefiniuj kryteria sukcesu i odrzuć przypadkowe, częściowe ukończenie zadań. Wskazuj fragmenty tekstu, które faktycznie stanowią podstawę odpowiedzi. Bez tych odniesień operatorzy nie będą w stanie odróżnić halucynacji od luki w indeksowaniu.
Przypadek użycia w produkcji: Autonomiczny agent do rozwiązywania incydentów w ramach SRE DevOps
Dla przypadku użycia w produkcji: Autonomiczny agent do rozwiązywania incydentów SRE DevOps – należy zdefiniować dane wejściowe, osobę odpowiedzialną za daną czynność oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie wykonać daną czynność na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu systemu. Należy rejestrować czasy wykonywania operacji oraz koszt tokenów lub zapytań obok wyników funkcjonalnych. Wczesna widoczność kosztów zapobiega niespodziewanym rachunkom, gdy ścieżka przechodzi z środowiska demonstracyjnego do współdzielonych środowisk. Konieczne jest podanie fragmentów tekstu, które faktycznie stanowią podstawę odpowiedzi; bez takich odniesień operatorzy nie mogą odróżnić efektu halucynacji od luki w indeksowaniu.
Kod: Budowa autonomicznego agenta za pomocą Google ADK
Dla kodu: Budowanie autonomicznego agenta za pomocą Google ADK – zdefiniuj dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie uruchomić dany krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Konfigurację należy przechowywać poza kodem aplikacji. Pliki środowiskowe, magazyny tajnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności czytania całej struktury. Wskazuj fragmenty tekstu, które faktycznie stanowią podstawę odpowiedzi. Bez tych odniesień operatorzy nie będą w stanie odróżnić halucynacji od luki w indeksowaniu. Dla kodu: Budowanie autonomicznego agenta za pomocą Google ADK – zdefiniuj dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie uruchomić dany krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Należy preferować małe, testowalne jednostki nad rozbudowanymi skryptami. Gdy dany krok zawiedzie, błąd powinien wskazywać na konkretną przyczynę do naprawy.
możliwość działania, a nie skomplikowany proces.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. Ramy decyzyjne: wybór odpowiedniego usługi Google RAG
Pracując nad rozdziałem 4. Ramy decyzyjne: wybór odpowiedniego usługi Google RAG, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego niepowodzenia. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Traktuj ten etap jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Nadaj nazwy poszczególnym elementom, zdefiniuj kryteria sukcesu i odrzuć ciche, częściowe ukończenie zadania. Zmierz stopień przywoływania informacji na ustalonej serii pytań przed dostosowywaniem promptów. Częste zmiany promptów rzadko poprawiają słabą efektywność wyszukiwania.
Matryca porównawcza
Gdy pracujesz nad macierzą porównawczą, najpierw zapisz warunki umowy: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego niepowodzenia. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Obok wyników funkcjonalnych zapisz czas wykonywania oraz koszt tokena lub zapytania. Wczesna widoczność kosztów zapobiega niespodziewanym rachunkom, gdy ścieżka przechodzi z środowiska demonstracyjnego do współdzielonych środowisk. Zmierz stopień odzyskiwania informacji na ustalonej serii pytań przed dostosowywaniem promptów. Częste zmiany promptów rzadko poprawiają słabe możliwości wyszukiwania.
5. Podsumowanie i wnioski architektoniczne
Gdy przechodzisz przez rozdział 5. Podsumowanie i wnioski architektoniczne, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego niepowodzenia. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Trzymaj konfigurację poza kodem aplikacji. Pliki środowiskowe, magazyny tajnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności czytania całej struktury. Zmierz stopę odzyskiwania informacji na ustalonej grupie pytań przed dostosowywaniem promptów. Częste zmiany promptów rzadko naprawiają słabe mechanizmy wyszukiwania. Gdy przechodzisz przez rozdział 5. Podsumowanie i wnioski architektoniczne, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego niepowodzenia. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Wolij małe, testowalne jednostki nad rozbudowane skrypty. Gdy jakiś krok się nie powiedzie, błąd powinien wskazywać na konkretną odpowiedzialność, a nie na skomplikowaną sekwencję operacji.
Gdy pracujesz nad listą kontrolną operacyjną, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego awarii. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie.
Zdokumentuj zarówno ścieżkę prawidłowego działania, jak i ścieżkę przywracania stanu. Próby ponowne, kontrolne punkty ludzkie oraz obsługa wiadomości nieodpowiednich stanowią część produktu, a nie elementy dodawane później.
Pomierz skuteczność wyszukiwania na ustalonej grupie pytań przed dostosowywaniem promptów. Częste zmiany promptów rzadko naprawiają słabe możliwości wyszukiwania.
Zachowaj stan grafu prosty i uporządkowany. Zagłębione struktury ukrywają informację o tym, który węzeł zapisał dane do którego pola, i utrudniają kontynuację pracy po przerwach.
Oceniaj odpowiedzi jednoetapowe oraz ścieżki wieloetapowe oddzielnie. Agregacja wyników rozmów maskuje błędy w pętlach narzędziowych.
Napisz krótki przewodnik: jak rotować klucze, jak opróżnić kolejkę z zadań, jak cofnąć ostatnie wprowadzone dane.
Zanim zaczniesz promować tę architekturę, zamroź wersje, utwórz dokładny zapis dla kluczowych etapów realizacji oraz potwierdź kroki odwracania zmian. Środowiska współdzielone wymagają ograniczeń szybkości, weryfikacji przynależności użytkowników oraz wyraźnego właściciela odpowiedzialnego za rotację haseł. Wolimy nudną niezawodność od pomysłowych, jednorazowych demonstracji.
Uwaga dotycząca 331adf7ac401: unikaj przechowywania kluczy dostawcy w repozytorium, ustaw ograniczenie liczby tokenów na sesję oraz przechowuj zapisy obok plików przygotowawczych do testów, aby późniejsze zmiany modeli pozostały porównywalne.