Асістэнт пад падтрымкі з двума двыжкамі RAG на Google Cloud: публічныя дакументы, прыватныя інструкцыі.
Створыце асістэнта пад падтрымкі, які запытае Vertex AI Search і Developer Knowledge API адночасна, а потым дазваляе Gemini супрацаваць з рэкамендаціямі і сабеўскімі правіламі кліента.
Кожны, хто працуе ў чат-сервісе падтрымкі за стандартамі SLA, знае, як важкая ў працэсе рашэння проблем: трэба ачынаць новыя вікнамі з документацыяй Google Cloud, іншыя — з власным путаводчыкам кліента, і ў той жа час спрацоўваць з гэтымі данымі. Калі прасіць універсальнага AI-асістэнта падкоротыць гэты працэс, часта атрымуецца адпаведнасць, якая на паперы правільная, але не падходзіць кліенту, які сядзіць пры вас.
Рашэнне, опісанае тут, — цэх двухмоторная сістэма з падкрэпленнем даных. Заявка адправляецца паралельна ў два крыніцы: публічную документацыю Google Cloud і прыватны сховішча путаводчыкаў кліента, а мадэль Gemini супрацоўвае атрыманыя даныя, ствараючы керавальнік рашэння, які лягчае правілам кліента. Уявіце сабе рэцепт з высокай оценкай у Інтэрнэце, які дыетолаг перэрабляе пад вашу дыету прымусова, перш чым вы запачнёце готаваць.
У структуру включаюцца чатыры элементы:
- Два шляхі падзеявання інфармацыі, які працуюць паралельна: адны для загальных тэхнічных рад, а другі — для строгіх внутрашніх правіл.
- Vertex AI Search як прыватны хранальнік, які індэксуе бізнес-правіла і обмежэнні безпосерэдна з файлаў інструкцый.
- Developer Knowledge API як публічны джэрэл, які вяртае обоснованыя рэкамендацыі і крокі для адлучэння проблем з офіцыйной дакументацыяй.
- Gemini як шар аналізу, які пераглядае публічныя рашэнні ў співвярэнні з прыватнымі правіламі, так што выходны рэзультат являецца кераваннем, якое інжынер падтрымкі можа безпечна выконваць.
Чаму загальныя рады не дапамагаюць
Возьмім такі прыклад заявкі:
Acme адзвярцает прыблізна пяць секунд затрымкі пад час запуску на сваёй прамоўцы Cloud Run. Што нам рабіць?
Асістэнт, які спыяецца толькі на адкрытыя дакументы, практычна навядома скажаць, каб min-instances быў заданы на 1. Гэта стандартны спосаб борьбы з проблемай запуску, але ён таксама ўступае ў суперсечку з патрабаваннямі гэтага кліента з двух прычын:
- Ліміт бюджэту. Acme абмежвае колькасць інстансаў фронтэнд-сервіса максымум адной, таму інстанс, які працуе цяглы час, не падходзіць.
- Правіла працы. Інструкцыі Acme забараняюць змянюваць значэнне
min-instancesбез прапісу главнага архітэктара компаніі, Сары Каннер.
Патрэбна сістэма, якая б брала адкрытыя рэкамендацыі ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо
- Праект у Google Cloud, у яком увімкнена плата.
- Інсталаваны і автэнтыфікованы на вашам камп’ютарэ кліўент gcloud CLI.
- Python 3.10 або новейшая версія.
Косты і квоты
Уражэнне прызначана для вікорыстання ў межах безплатных тарыфаў і квот для распрацоўшчыкаў кожнай службы:
- Cloud Storage. Одны файл з інструкцыямі цалкам падпадае пад ліміт безкоштовнага прыёму даных. Плата зачынаецца толькі калі вы перакроюце гэты ліміт або ствараеце выходны трафік.
- Vertex AI Search (Gemini Agent Search). Новыя абліквоты отрымаюць безплатны пробны тарыф. Калі крэдыты пробнага перыоду заканчуюцца, запіты оплачваюцца за прыемліваемай цэнай за 1 000 запітоў, таму пераканаюцеся на сторонніцы з актуальнымі цэнамі.
- Developer Knowledge API. Іе можна ўвімкнуць і вікорыстоўваць безкоштовна ў межах стандартных лімітаў для распрацоўшчыкаў. Запіты на выдачу рэсурсаў можна сочыць на сторонніцах з квотамі Google Cloud.
Падготовка асяроддзя Google Cloud
Перш чым запусканы сам асістэнт, неабходна настроіць базовую інфраструктуру. Одын скрыпт на bash адрабатвае тры заведаменні:
- Актывацыя API. Ён увімкняе Cloud Storage, Vertex AI Agent Builder (
discoveryengine), Developer Knowledge і Generative Language API, ўсё гэта для таго, каб оркестрайзер могаў працаваць з усіма неабходнымі канцэнтрамі. - Стварэнне ідэнтыфікатора службы Discovery Engine. Ён загадзя стварае агента службы, керованага Google (
service-PROJECT_NUMBER@gcp-sa-discoveryengine.iam.gserviceaccount.com), тады фонавы індэксатор можа атрымаць правыя IAM негараздзе ведачы, без неабяжнага нажатня на панель керування. - Настройка хранення і доступу. Ён стварае кантэйнер Cloud Storage, які будзе хаваць інструкцыі кляўента, і надае
roles/storage.objectViewerдвум суб’ектам: фонаваму агенту пошуку, якому гэта патрэбна для індэксавання, і вашаму сабе акаунту, ўпэўніваючыся, што вы можэце адразу пераглядаць кантэйнер у панелі керування.
Укладзіце скрыпт у тэрмінал:
# 1. Initialize variables from active gcloud config
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format="value(projectNumber)")
export BUCKET_NAME="${PROJECT_ID}-internal-kb"
export USER_EMAIL=$(gcloud config get-value account)
# 2. Enable all required GCP APIs
gcloud services enable \
storage-api.googleapis.com \
discoveryengine.googleapis.com \
developerknowledge.googleapis.com \
generativelanguage.googleapis.com \
--project=${PROJECT_ID}
# 3. Provision the Discovery Engine Service Identity programmatically
# (This creates the background service account without requiring a manual Console click)
gcloud beta services identity create \
--service=discoveryengine.googleapis.com \
--project=${PROJECT_ID}
# 4. Create the GCS bucket
gcloud storage buckets create gs://${BUCKET_NAME} --project=${PROJECT_ID} --location=us-central1
# 5. Grant Storage Object Viewer to the Agent Search Service Agent (for background indexing)
gcloud storage buckets add-iam-policy-binding gs://${BUCKET_NAME} \
--member="serviceAccount:@gcp-sa-discoveryengine.iam.gserviceaccount.com">service-${PROJECT_NUMBER}@gcp-sa-discoveryengine.iam.gserviceaccount.com" \
--role="roles/storage.objectViewer"
# 6. Grant Storage Object Viewer to your active Console user (for frontend validation)
gcloud storage buckets add-iam-policy-binding gs://${BUCKET_NAME} \
--member="user:${USER_EMAIL}" \
--role="roles/storage.objectViewer"
echo "Setup complete! All APIs enabled and permissions configured successfully."
Значэнні, які можаць захацець налаштаваць:
PROJECT_ID— гэта ID вашага праекту. Калі праект ужэ налаштаваны ў gcloud,gcloud config get-value projectавтаматычна вяртае яго.PROJECT_NUMBER— унікальны номер праекту.BUCKET_NAME— называе бакет для кнігі інструкцый, пры чым стандартны значэнне —${PROJECT_ID}-internal-kb.USER_EMAIL— гэта адрэса актыўнага акаунту Google Cloud, які отрымае правы на перэгляд у консолі.
Стварэнне прыватнага двігу знаёмасцей
Прыватная частка — гэта маленькі пошуковы двігун, які зберагае прыкладную кнігу інструкцый для кліентаў.
Напісанне і аплодаванне кнігі інструкцый
Створыце файл кнігі інструкцый локальна, а потым скопіюйце яго ў бакет:
# Create the client runbook file with .txt extension
cat << 'EOF' > client-acme-runbook.txt
# Client Acme Corporation - Cloud Run Deployment Runbook
* **Client ID:** ACME-404
* **SLA Tier:** Platinum (4-hour resolution target)
* **Infrastructure Specifications:**
* Frontend Service Name: `acme-frontend-prod`
* Regional Deployment: `us-central1`
* Max Instances: `1` (Hard cap imposed due to strict budget constraints)
* CPU Allocation: `CPU allocated only during request processing`
* Backend Database: Cloud SQL PostgreSQL (`acme-db-prod`)
* Networking: Serverless VPC (Virtual Private Cloud) Access connector (`acme-vpc-connector`)
* **Deployment Constraints:**
* Deployed strictly via GitHub Actions workflow (`.github/workflows/deploy.yml`). Manual console updates are forbidden.
* Direct access to the production DB requires using the Bastion Host `acme-bastion-prod`.
* **Escalation Path:**
* Primary Contact: Sarah Connor (Lead Architect, sarah@acme-corp.com)
* Secondary Contact: PagerDuty escalation policy `acme-prod-critical`
* **Common Issues & Custom Rules:**
* **High Cold Starts:** High cold-start latency due to CPU throttling during scale-up. Do not modify the `min-instances` count without approval from Sarah Connor, as it breaches billing thresholds.
* **Database Connection Timeouts:** If timeouts occur, verify that the Serverless VPC Access connector is in a `READY` state before attempting database restarts.
EOF
# Upload the file to your bucket
gcloud storage cp client-acme-runbook.txt gs://${BUCKET_NAME}/
Каманда аплоаду выкарыстоўвае назву бакета з крока наладкі, ${PROJECT_ID}-internal-kb, калі толькі вы яе не зменілі. У інструкцыях спецыяльна суманаваныя важлівыя факты: максімальная колькасць інстансаў Acme — адна, правілы затверджэння для мінімальнай колькасці інстансаў, назвы базы дадзеных і канектараў VPC, політыка развяртання толькі праз GitHub-Actions, а таксама контакты для прыемленае справы.
Стварэнне хранілішча дадзеных для пошуку агентаў
Хранілішча дадзеных яе робяць можлівым адшукацю інструкцый. У консолі Google Cloud:
- Ачыніце Agent Builder (таксама пазначаны як Vertex AI Search).
- У левай частцы навігацыі выберыце Data Stores, а потым Create data store.
- Як джэрэла выберыце Cloud Storage.
gs://PROJECT_ID-internal-kb/*, практычы ваш рэальны ID праекта замест PROJECT_ID.acme-internal-kb.Стварэнне прыемніка пошуку для обслужавання
Запыткі з коду праходзяць праз прыемнік пошуку (энжын), які выступае як шар обслужавання над даслужбай зберагчыка даных:
- У Agent Builder ачыніце роздзел Програмы.
- Нажміце Стварыць програму.
- У роздзеле Пошук на сторонцы стварэння нажміце Стварыць.
- Назвіце програму
acme-search-app.
Acme Corporation.acme-internal-kb.acme-search-app_1234567890.З’ўязкі з публічной часткаю: Developer Knowledge API
Этот API дае можлівасць адкрытага доступу да офіцыйных дакументаў Google Cloud і падказак для распрацоўшчыкаў. Наведзеныя ніжэй крокі дапамагаюць стварыць ключ API, абмежыць яго і паўнастаці доступ за дапамогою адной запыткі curl.
Стварэнне ключа API
- У консолі перайдзіце на Credentials.
- Выберыце Стварыць кранты, а пасля Ключ API.
- Як можна, абмежыце выкарыстоўванне ключа толькі для Developer Knowledge API.
- Зберагуце ключ у зменнай сераўыска:
export DEVELOPERKNOWLEDGE_API_KEY="DEVELOPERKNOWLEDGE_API_KEY
Заменіце места заповнення на свой створаны ключ.
Тэставанне за дапамою curl
Швыдкі запіт паўтарае, што ключ працюе і што вы можэце з’явіцца да дакументаў распрацоўшчыкаў Google:
curl -X POST "https://developerknowledge.googleapis.com/v1:answerQuery?key=$DEVELOPERKNOWLEDGE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "How do I reduce Cloud Run cold starts?"}'
Структураваны адказ у фармаце JSON, які містыць адказ, запоўнены ў офіцыяльной дакументацыі, значыць, што усё працуе.
Скрыпт керавання
Далей ідзе скрыпт на Python, які ставі тыя ж запытанні обом двойчыкам і перэдае рэзультаты Gemini для фінальнага адказу.
Інсталяванне бібліятэкаў
pip install google-cloud-discoveryengine google-generativeai requests
Стварэнне оркестрабірача
Наступны каманды запісвае app.py. Скрыпт адправляе тэкст прыйшалага заявкі ў оба шукацкія шляхі, вставляе два рэзультаты ў шаблон запіту і перадае заполнены шаблон Gemini:
cat << 'EOF' > app.py
import os
import sys
import requests
import google.generativeai as genai
from google.cloud import discoveryengine_v1beta as discoveryengine
# Configuration - Replace with your details
PROJECT_ID = os.environ.get("PROJECT_ID")
ENGINE_ID = os.environ.get("ENGINE_ID")
LOCATION = "global"
MODEL_NAME = os.environ.get("GEMINI_MODEL", "gemini-3.5-flash")
# Initialize Gemini Client (Uses GEMINI_API_KEY env variable)
genai.configure(api_key=os.environ.get("GEMINI_API_KEY"))
model = genai.GenerativeModel(MODEL_NAME)
# 1. Helper to query the Private KB (Agent Search)
def query_private_kb(query_text: str):
client = discoveryengine.SearchServiceClient()
serving_config = f"projects/{PROJECT_ID}/locations/{LOCATION}/collections/default_collection/engines/{ENGINE_ID}/servingConfigs/default_search"
request = discoveryengine.SearchRequest(
serving_config=serving_config,
query=query_text,
page_size=3,
)
response = client.search(request)
results = []
for result in response.results:
doc_data = result.document.derived_struct_data
if "snippets" in doc_data:
for s in doc_data["snippets"]:
results.append(s.get("snippet", ""))
return "\n".join(results)
# 2. Helper to query the Public KB (Developer Knowledge API)
def query_public_gcp_kb(query_text: str):
api_key = os.environ.get("DEVELOPERKNOWLEDGE_API_KEY")
url = f"https://developerknowledge.googleapis.com/v1:answerQuery?key={api_key}"
headers = {"Content-Type": "application/json"}
payload = {"query": query_text}
try:
response = requests.post(url, json=payload, headers=headers)
response.raise_for_status()
data = response.json()
return data.get("answer", {}).get("answerText", "No answer found.")
except Exception as e:
return f"Error querying Developer Knowledge API: {e}"
# 3. Main Orchestration
def run_support_assistant(ticket_query: str):
print(f"\n[Ticket Query]: {ticket_query}")
# Dynamically search private client specs using the ticket query
print("Searching private database…")
private_context = query_private_kb(ticket_query)
# Dynamically search public GCP advice using the ticket query
print("Searching public Google Cloud docs…")
public_context = query_public_gcp_kb(ticket_query)
# Format system prompt template
prompt = f"""
You are a Senior Cloud Support Assistant. Your task is to resolve the support ticket.
CRITICAL INSTRUCTIONS:
1. You MUST read the [Private Runbook Context] for specific client configurations, limits, and rules.
2. You MUST cross-reference all generic GCP recommendations against the client's private constraints. If a generic recommendation (e.g., increasing min-instances) violates a client limit or rule (e.g., budget caps or requiring specific manager approvals), you MUST call this out explicitly and provide the compliant fallback option.
3. Refer to specific client contacts (e.g., Sarah Connor), services, databases, and network connectors mentioned in the runbook when explaining the steps.
[Private Runbook Context]:
{private_context}
[Official GCP Guidance]:
{public_context}
[Support Ticket Query]:
{ticket_query}
Provide a precise troubleshooting guide for the support engineer.
"""
response = model.generate_content(prompt)
print("\n[AI Assistant Resolution Guide]:")
print(response.text)
if __name__ == "__main__":
if not all([PROJECT_ID, ENGINE_ID, os.environ.get("DEVELOPERKNOWLEDGE_API_KEY"), os.environ.get("GEMINI_API_KEY")]):
print("Please set your environment variables: PROJECT_ID, ENGINE_ID, DEVELOPERKNOWLEDGE_API_KEY, and GEMINI_API_KEY.")
else:
# Allow passing the ticket query as a command line argument
default_query = "Client Acme is complaining about 5-second cold start latency on their frontend service. How can we fix it?"
query = sys.argv[1] if len(sys.argv) > 1 else default_query
run_support_assistant(ticket_query=query)
EOF
Сама прыгласоўка выконвае справжнюю работу. Яна прыказывае модэлю чытаць прыватны практычны кярэвнік з настройкамі і правіламі, спецыяльнымі для кліента, і пораўняваць кожную загальную рэкамендацыю з гэтымі обмежэннямі. Калі якая-небудзь публічная рэкамендацыя, напрыклад, падвышэння колькасці екземпляраў, нарабляе працэс перакрыцча ліміту кліента чы правіла затверджэння, модэль павінен адкрыта гэта зазначыць і запропанаваць адповідаючую альтэратыўную працэс. Калі ён поясняе этапы, яго таксама павінны быць названы рэальныя контакты, службы, базы дадзеных і канектары сеткі кліента.
Адклэчанне тэста
Установіце зменныя сераўысу і запускіце скрыпт:
export PROJECT_ID="PROJECT_ID"
export ENGINE_ID="ENGINE_ID"
export DEVELOPERKNOWLEDGE_API_KEY="DEVELOPERKNOWLEDGE_API_KEY"
export GEMINI_API_KEY="GEMINI_API_KEY"
# Run with the default query
python3 app.py
# Or pass a custom query as a command line argument
python3 app.py "Client Acme is complaining about database connection timeouts on their Cloud SQL backend."
Заменіце на рэальныя значэння:
PROJECT_ID— гэта ідэнтыфікатор вашага праекту.ENGINE_ID— гэта ідэнтыфікатор дварчыка/прыемніка дапамогаючы гэты Vertex AI Search прыемнік.DEVELOPERKNOWLEDGE_API_KEY— гэта ключ, які вы створылі для API Developer Knowledge.GEMINI_API_KEY— гэта ключ з Google AI Studio. У даследаваннях Google парадактавана, як отрыць ключ Gemini API.
Як выглядае рэзультат
Можна спакавацца чыгунам такога фармата:
[AI Assistant Resolution Guide]:
### **Acme Support Ticket: Resolution & Troubleshooting Guide**
**Ticket ID:** #ACM-98431
**Service:** `acme-frontend` (Cloud Run)
**Issue:** 5-second cold start latency
**Assigned To:** Cloud Support Engineering Team
- -
### **CRITICAL COMPLIANCE WARNING (Read Before Acting)**
According to Acme's operational rules:
* **The Conflict:** Standard GCP documentation suggests setting `min_instances` (e.g., to 1 or more) to eliminate cold starts. However, **Acme operates under a strict budget cap policy that prohibits idle/always-on instances** for the frontend service without explicit business justification.
* **The Rule:** You **MUST NOT** increase `min_instances` on `acme-frontend` without prior written approval from **Sarah Connor** (Acme's Technical Lead & Budget Approver).
* **Compliant Fallback:** If Sarah Connor does not approve the budget increase for `min_instances`, you must resolve the latency strictly through **code-level optimizations, CPU adjustments, startup probes, and connection tuning** as detailed below.
- -
### **Step-by-Step Troubleshooting & Resolution Guide**
#### **Phase 1: Triage and Governance Check**
1. **Contact Sarah Connor:** Reach out to Sarah Connor to request a budget exception for setting `min_instances = 1`.
2. **Fallback implementation:** If denied, proceed strictly with the budget-compliant fallback steps below to optimize the cold start duration within the 0-instance scaling limit.
#### **Phase 2: Network & Connection Optimization**
1. **Inspect VPC Connector Latency:** `acme-frontend` routes traffic to the database via the **`acme-vpc-connector`** (Serverless VPC Access). Ensure that the connector throughput is not bottlenecked.
2. **Database Connection Lazy-Loading:** The frontend connects to **`acme-production-db`** (Cloud SQL). Do not open the connection pool until the first actual handler request arrives to minimize container boot time.
…
Што паказва рэзультат
Адказ спяўнае два джэрэлы, пры чым кожна з іх даўа ўласную інфармацыю:
- Публічная дакументацыя, праз API Developer Knowledge, прадаёт тэхнічныя рашэнні: увядзенне
cpu-boost, настаўкі паралелізма на80або дадаўненне прыстрою запуску/healthz. - Прыватная база знанняў, праз Agent Search, дадае бізнес-логіку, правіла безпекі і дэталі керування. У яй паведамляецца, што стандартныя рэкамендаціі (
min_instances = 1) наражаюць на рызык правіла бюджэту компаніі Acme. У яй таксама названа Сара Каннер як адна з особаў, якія павінны санкцыонаваць будзь-яе адхіленне. У яй таксама згадваецца рэальная база даных і канектар VPC компаніі Acme.
Без адаптавання для публічнага і прыватнага кантэкста, стандартны мадэль проста радзіць падняць значэнне min_instances. Менавіт младшы інжынер падтрымкі можа негайна выконаць гэтыя рэкамендацыі, а ў карпоратыўнай асяроддзі гэта можа прывесты да перакрыцча бюджэтных лімітав, актывацыі апавяшэнняў пра ролякцыю сум і айханняя апраўленняя архітэктуры. Адаптаванне мадэлі для обох тыпаў кантэкста дазволяе стварыць рашэнні, якія ў той жа час ёсць тэхнічна правядомымі і супараднае з правіламі організацыі.
Ударожчэнне мадэлі для прыменення ў практыцы
Перш чым мадэль будзе выкорыстоўвана для рэальных запітоў, цікавыя будуць калькі змэн:
- Зберагаюце секрэты ў менеджары секрэтав. Ключы API трэба размістыць у Secret Manager і завантажваць іх пад час выканання, а не ў звычайных змэнных сяродавішча ў фармаце тэксту.
roles/discoveryengine.viewer і roles/storage.objectViewer, і обмежуйце API-клучы конкрэтнімі API і довірэнімі IP-адрэсамі мерэжы.SearchRequest, шчоб рэзультаты булі обмежэні серэдовішчэм конкрэтного кліента.Очышчэння
Шчоб унікнуты постыйніх оплат, відаліць тыя, што було створэно за допомогою навчального посібніка.
Пошук у застосунку і хранільніцы дадзейнаў
Хранільніцу дадзейнаў не можна выдаліць, калі да яе прыяўжаны застосунак, таму спачатку выдаліце застосунак. У консалі:
- Перайдзіце да Agent Builder, а потым да Apps.
- Знайдзіце
acme-search-app, ачыніце More actions (тры крапкі) і выберыце Delete. - У дыялогавом вікні падтверджэння запісайце назву застосунку і падтвердзіце.
- Ачыніце Data Stores у меню навігацыі.
- Знайдзіце
acme-internal-kb, ачыніце More actions і выберыце Delete. - Падтвердзіце.
Бакет хранення
Для выдалення вёскі бакета достатнекаў адной команды:
export BUCKET_NAME="${PROJECT_ID}-internal-kb"
gcloud storage rm - recursive gs://${BUCKET_NAME}/
Клучы API
- Перайдзіце на раздзел APIs & Services, а пасля на Credentials.
- У роздзеле API Keys знайдзіце клуч, створаны для API Developer Knowledge.
- Нажміце на іконку кашлёка пры яму і падтвердзіце.
Локальныя файлы
Адчыніце свой камп’ютар і выдаліце скрыпты і прыкладны путаводзь:
rm -f app.py app_test.py client-acme-runbook.txt