Agent Platform Memory Bank consente agli agenti di gestire i ricordi a lungo termine nelle varie sessioni. Se utilizzato con l'Agent Development Kit (ADK), l'agente può orchestrare automaticamente le chiamate a Memory Bank per archiviare e recuperare i ricordi in base alle interazioni degli utenti.
Questo documento spiega come creare un agente ADK, configurarlo per utilizzare Memory Bank e interagire con lui per generare e accedere ai ricordi.
Per informazioni su come effettuare chiamate dirette all'API senza ADK, consulta la guida rapida all'API Memory Bank.
Gestire i ricordi con il servizio di memoria ADK e Memory Bank
VertexAiMemoryBankService
è un wrapper ADK intorno a Memory Bank definito da
BaseMemoryService di ADK.
Puoi definire callback e strumenti che interagiscono con il servizio di memoria per leggere
e scrivere ricordi.
L'interfaccia VertexAiMemoryBankService include:
memory_service.add_session_to_memoryattiva una richiestaGenerateMemoriesa Memory Bank utilizzando tutti gli eventi neladk.Sessionfornito come contenuti di origine. Puoi orchestrare le chiamate a questo metodo utilizzandocallback_context.add_session_to_memorynei callback.from google.adk.agents.callback_context import CallbackContext async def add_session_to_memory_callback(callback_context: CallbackContext): await callback_context.add_session_to_memory() return Nonememory_service.add_events_to_memoryche attiva unaGenerateMemoriesrichiesta a Memory Bank utilizzando un sottoinsieme di eventi. Puoi orchestrare le chiamate a questo metodo utilizzandocallback_context.add_events_to_memorynei callback.from google.adk.agents.callback_context import CallbackContext async def add_events_to_memory_callback(callback_context: CallbackContext): await callback_context.add_events_to_memory(events=callback_context.session.events[-5:-1]) return Nonememory_service.search_memoryattiva una richiestaRetrieveMemoriesa Memory Bank per recuperare i ricordi pertinenti per l'user_ide l'app_namecorrenti. Puoi orchestrare le chiamate a questo metodo utilizzando strumenti di memoria integrati (LoadMemoryTooloPreloadMemoryTool) o uno strumento personalizzato che richiamatool_context.search_memory.
Prima di iniziare
Per completare i passaggi illustrati in questo tutorial, devi prima seguire i passaggi descritti nella sezione introduttiva della pagina Configurare Memory Bank.
Imposta le variabili di ambiente
Per utilizzare l'ADK, imposta le variabili di ambiente:
import os
os.environ["GOOGLE_GENAI_USE_ENTERPRISE"] = "TRUE"
os.environ["GOOGLE_CLOUD_PROJECT"] = "PROJECT_ID"
os.environ["GOOGLE_CLOUD_LOCATION"] = "LOCATION"
Sostituisci quanto segue:
- PROJECT_ID: il tuo ID progetto.
- LOCATION: la tua regione. Consulta le regioni supportate per Memory Bank.
Crea il tuo agente ADK
Per creare un agente con memoria, configura strumenti e callback che orchestrano le chiamate al servizio di memoria.
Definisci un callback di salvataggio di informazioni
Per orchestrare le chiamate per il salvataggio di informazioni, crea una funzione di callback che
attiva il salvataggio di informazioni. Puoi inviare un sottoinsieme di eventi (con
callback_context.add_events_to_memory) o tutti gli eventi di una sessione (con
callback_context.add_session_to_memory) da elaborare in background:
from google.adk.agents.callback_context import CallbackContext
async def generate_memories_callback(callback_context: CallbackContext):
# Option 1 (Recommended): Send events to Memory Bank for memory generation,
# which is ideal for incremental processing of events.
await callback_context.add_events_to_memory(
events=callback_context.session.events[-5:-1])
# Option 2: Send the full session to Memory Bank for memory generation.
# It's recommended to only call this at the end of a session to minimize
# how many times a single event is re-processed.
await callback_context.add_session_to_memory()
return None
Definisci uno strumento di recupero della memoria
Quando sviluppi il tuo agente ADK, includi uno strumento di memoria che controlli quando l'agente recupera i ricordi e come vengono inclusi nel prompt.
Se utilizzi PreloadMemoryTool, l'agente recupererà i ricordi all'inizio
di ogni turno e li includerà nell'istruzione di sistema, il che
è utile per stabilire il contesto di base dell'utente. Se utilizzi
LoadMemoryTool, il modello chiamerà questo strumento quando deciderà che le memorie
sono necessarie per rispondere alla query dell'utente.
from google import adk
from google.adk.tools.load_memory_tool import LoadMemoryTool
from google.adk.tools.preload_memory_tool import PreloadMemoryTool
memory_retrieval_tools = [
# Option 1: Retrieve memories at the start of every turn.
PreloadMemoryTool(),
# Option 2: Retrieve memories via tool calls. The model will only call this tool
# when it decides that memories are necessary to respond to the user query.
LoadMemoryTool()
]
agent = adk.Agent(
model="gemini-2.5-flash",
name='stateful_agent',
instruction="""You are a Vehicle Voice Agent, designed to assist users with information and in-vehicle actions.
1. **Direct Action:** If a user requests a specific vehicle function (e.g., "turn on the AC"), execute it immediately using the corresponding tool. You don't have the outcome of the actual tool execution, so provide a hypothetical tool execution outcome.
2. **Information Retrieval:** Respond concisely to general information requests with your own knowledge (e.g., restaurant recommendation).
3. **Clarity:** When necessary, try to seek clarification to better understand the user's needs and preference before taking an action.
4. **Brevity:** Limit responses to under 30 words.
""",
tools=memory_retrieval_tools,
after_agent_callback=generate_memories_callback
)
In alternativa, puoi creare uno strumento personalizzato per recuperare i ricordi, il che è utile quando vuoi fornire istruzioni al tuo agente su quando recuperare i ricordi:
from google import adk
from google.adk.tools import ToolContext, FunctionTool
async def search_memories(query: str, tool_context: ToolContext):
"""Query this tool when you need to fetch information about user preferences."""
return await tool_context.search_memory(query)
agent = adk.Agent(
model="gemini-2.5-flash",
name='stateful_agent',
instruction="""...""",
tools=[FunctionTool(func=search_memories)],
after_agent_callback=generate_memories_callback
)
Definisci un servizio di memoria e un runtime di Memory Bank ADK
Dopo aver creato l'agente con memoria, devi collegarlo a un servizio di memoria. La procedura di configurazione del servizio di memoria ADK dipende da dove viene eseguito l'agente ADK, che orchestra l'esecuzione di agenti, strumenti e callback.
Crea un'istanza di Agent Runtime
Per utilizzare Memory Bank, devi prima creare un'istanza di Agent Runtime. Questo passaggio è facoltativo se utilizzi Agent Runtime per il deployment dell'agente. Per ulteriori informazioni sulla personalizzazione del comportamento di Memory Bank, consulta la sezione Configurare l'istanza di Agent Runtime per Memory Bank nella pagina Configurare Memory Bank.
import vertexai
client = vertexai.Client(
project="PROJECT_ID",
location="LOCATION"
)
# If you don't have an Agent Runtime instance already, create an Agent Platform
# Memory Bank instance using the default configuration.
agent_engine = client.agent_engines.create()
# Optionally, print out the resource name. You will need the
# resource name if you want to interact with your Runtime instance later on.
print(agent_engine.api_resource.name)
agent_engine_id = agent_engine.api_resource.name.split("/")[-1]
Sostituisci quanto segue:
- PROJECT_ID: il tuo ID progetto.
- LOCATION: la tua regione. Consulta le regioni supportate per Memory Bank.
Crea un runtime ADK
Passa l'ID runtime dell'agente agli script di runtime o di deployment in modo che l'agente utilizzi Memory Bank come servizio di memoria dell'ADK.
Corriere locale
adk.Runner viene generalmente utilizzato in un ambiente locale, come
Colab. In questo caso, devi creare direttamente il servizio di memoria e il runner.
import asyncio
from google.adk.memory import VertexAiMemoryBankService
from google.adk.sessions import VertexAiSessionService
from google.genai import types
memory_service = VertexAiMemoryBankService(
project="PROJECT_ID",
location="LOCATION",
agent_engine_id="AGENT_ENGINE_ID",
)
# You can use any ADK session service. This example uses Sessions.
session_service = VertexAiSessionService(
project="PROJECT_ID",
location="LOCATION",
agent_engine_id="AGENT_ENGINE_ID",
)
runner = adk.Runner(
agent=agent,
app_name="APP_NAME",
session_service=session_service,
memory_service=memory_service
)
async def call_agent(query, session, user_id):
content = types.Content(role='user', parts=[types.Part(text=query)])
events = runner.run_async(
user_id=user_id, session_id=session, new_message=content)
async for event in events:
if event.is_final_response():
final_response = event.content.parts[0].text
print("Agent Response: ", final_response)
Sostituisci quanto segue:
- PROJECT_ID: il tuo ID progetto.
- LOCATION: la tua regione. Consulta le regioni supportate per Memory Bank.
- APP_NAME: nome dell'app ADK. Il nome dell'app verrà incluso nel dizionario
scopedei ricordi generati, in modo che i ricordi siano isolati tra utenti e app. - AGENT_ENGINE_ID: l'ID runtime dell'agente da utilizzare per Memory Bank e le sessioni di Agent Platform. Ad esempio,
456inprojects/my-project/locations/us-central1/reasoningEngines/456.
Agent Runtime
Il modello ADK di Agent Runtime (AdkApp) può essere utilizzato sia localmente sia per eseguire il deployment di un agente ADK in Agent Runtime. Se viene implementato su
Agent Platform, il modello ADK di Agent Runtime utilizza
VertexAiMemoryBankService come servizio di memoria predefinito, utilizzando la stessa
istanza di runtime per Memory Bank del
runtime. In questo modo, puoi creare l'istanza di Memory Bank e
deployarla in un runtime in un unico passaggio.
Consulta Configurare Agent Runtime per maggiori dettagli sulla configurazione dell'istanza di Agent Runtime, incluso come personalizzare il comportamento di Memory Bank.
Utilizza il seguente codice per eseguire il deployment dell'agente ADK abilitato alla memoria in Agent Runtime:
import asyncio
import vertexai
from vertexai.agent_engines import AdkApp
client = vertexai.Client(
project="PROJECT_ID",
location="LOCATION"
)
adk_app = AdkApp(agent=agent)
# Create a new resource with your agent deployed to Agent Runtime.
# The Agent Runtime instance will also include an empty Memory Bank.
agent_engine = client.agent_engines.create(
agent_engine=adk_app,
config={
"staging_bucket": "STAGING_BUCKET",
"requirements": ["google-cloud-aiplatform[agent_engines,adk]"]
}
)
# Alternatively, update an existing resource to deploy your agent to Agent Platform.
# Your agent will have access to the Runtime instance's existing memories.
agent_engine = client.agent_engines.update(
name=agent_engine.api_resource.name,
agent_engine=adk_app,
config={
"staging_bucket": "STAGING_BUCKET",
"requirements": ["google-cloud-aiplatform[agent_engines,adk]"]
}
)
async def call_agent(query, session_id, user_id):
async for event in agent_engine.async_stream_query(
user_id=user_id,
session_id=session_id,
message=query,
):
print(event)
Sostituisci quanto segue:
- PROJECT_ID: il tuo ID progetto.
- LOCATION: la tua regione. Consulta le regioni supportate per Memory Bank.
- STAGING_BUCKET: il bucket Cloud Storage da utilizzare per lo staging di Agent Runtime.
Quando viene eseguito localmente, il modello ADK utilizza InMemoryMemoryService come servizio di memoria predefinito. Tuttavia, puoi sostituire il servizio di memoria predefinito per utilizzare
VertexAiMemoryBankService:
def memory_bank_service_builder():
return VertexAiMemoryBankService(
project="PROJECT_ID",
location="LOCATION",
agent_engine_id="AGENT_ENGINE_ID"
)
adk_app = AdkApp(
agent=adk_agent,
# Override the default memory service.
memory_service_builder=memory_bank_service_builder
)
async def call_agent(query, session_id, user_id):
# adk_app is a local agent. If you want to deploy it to Agent Runtime,
# use `client.agent_engines.create(...)` or `client.agent_engines.update(...)`
# and call the returned Agent Runtime instance instead.
async for event in adk_app.async_stream_query(
user_id=user_id,
session_id=session_id,
message=query,
):
print(event)
Sostituisci quanto segue:
- PROJECT_ID: il tuo ID progetto.
- LOCATION: la tua regione. Consulta le regioni supportate per Memory Bank.
- AGENT_ENGINE_ID: l'ID runtime dell'agente da utilizzare per
Memory Bank. Ad esempio,
456inprojects/my-project/locations/us-central1/reasoningEngines/456.
Cloud Run
Per eseguire il deployment dell'agente su Cloud Run, consulta le istruzioni nella documentazione di ADK per scoprire come definire l'agente da eseguire il deployment su Cloud Run.
adk deploy cloud_run \
...
--memory_service_uri=agentengine://AGENT_ENGINE_ID
GKE
Per eseguire il deployment dell'agente in Google Kubernetes Engine (GKE), consulta le istruzioni nella documentazione di ADK per scoprire come definire l'agente da eseguire il deployment in GKE.
adk deploy gke \
...
--memory_service_uri=agentengine://AGENT_ENGINE_ID
ADK Web
L'interfaccia web dell'ADK ti consente di testare i tuoi agenti direttamente nel browser.
export GOOGLE_CLOUD_PROJECT="PROJECT_ID"
export GOOGLE_CLOUD_LOCATION="LOCATION"
adk web --memory_service_uri=agentengine://AGENT_ENGINE_ID
Sostituisci quanto segue:
- PROJECT_ID: il tuo ID progetto.
- LOCATION: la tua regione. Consulta le regioni supportate per Memory Bank.
- AGENT_ENGINE_ID: l'ID runtime dell'agente da utilizzare per
Memory Bank. Ad esempio,
456inprojects/my-project/locations/us-central1/reasoningEngines/456.
Interagire con l'agente
Dopo aver definito l'agente e configurato Memory Bank, puoi interagire con l'agente. Se hai fornito un callback per attivare la generazione di ricordi durante l'inizializzazione dell'agente, la generazione di ricordi verrà attivata ogni volta che l'agente viene richiamato.
Le memorie verranno archiviate utilizzando l'ambito {"user_id": USER_ID, "app_name":
APP_NAME} corrispondente all'ID utente e al nome dell'app utilizzati per eseguire l'agente.
Il metodo di interazione con l'agente dipende dal suo ambiente di esecuzione:
Corriere locale
# Use `asyncio.run(session_service.create(...))` if you're running this
# code as a standard Python script.
session = await session_service.create_session(
app_name="APP_NAME",
user_id="USER_ID"
)
# Use `asyncio.run(call_agent(...))` if you're running this code as a
# standard Python script.
await call_agent(
"Can you fix the temperature?",
session.id,
"USER_ID"
)
Sostituisci quanto segue:
- APP_NAME: il nome dell'app per il runner.
- USER_ID: un identificatore per l'utente. I ricordi generati da questa sessione sono identificati da questo identificatore opaco. L'ambito dei ricordi generati viene memorizzato come
{"user_id": "USER_ID"}.
Agent Runtime
Quando utilizzi il modello ADK, puoi chiamare Agent Runtime per interagire con la memoria e le sessioni.
# Use `asyncio.run(agent_engine.async_create_session(...))` if you're
# running this code as a standard Python script.
session = await agent_engine.async_create_session(user_id="USER_ID")
# Use `asyncio.run(call_agent(...))` if you're running this code as a
# standard Python script.
await call_agent(
"Can you fix the temperature?",
session.get("id"),
"USER_ID"
)
Sostituisci quanto segue:
- USER_ID: un identificatore per l'utente. I ricordi generati da
questa sessione sono identificati da questo identificatore opaco. L'ambito dei ricordi generati
viene memorizzato come
{"user_id": "USER_ID"}.
Cloud Run
Consulta la sezione Test dell'agente della documentazione sul deployment di ADK Cloud Run.
GKE
Consulta la sezione Test dell'agente della documentazione di implementazione di GKE dell'ADK.
ADK Web
Per utilizzare ADK Web, vai al server locale all'indirizzo http://localhost:8000.
Per impostazione predefinita, ADK Web imposta l'ID utente su user. Per eseguire l'override dell'ID utente
predefinito, includi userId neiparametri di ricercay, ad esempio
http://localhost:8000?userId=YOUR_USER_ID.
Per ulteriori informazioni, consulta la pagina ADK Web nella documentazione di ADK.
Interazione di esempio
Prima sessione
Se hai utilizzato PreloadMemoryTool, l'agente tenterà di recuperare i ricordi all'inizio di ogni turno per accedere alle preferenze che l'utente ha comunicato in precedenza all'agente. Durante la prima interazione dell'agente con l'utente,
non sono disponibili ricordi da recuperare. Pertanto, l'agente non conosce le preferenze dell'utente, ad esempio la temperatura preferita, come mostrato nell'esempio seguente:
Primo turno:
Utente: "Puoi regolare la temperatura?"
(Chiamata allo strumento): ADK tenta di recuperare i ricordi, ma non sono disponibili.
Modello: "Quale temperatura preferisci?"
(Callback): ADK attiva il salvataggio di informazioni. Non vengono estratti ricordi.
Secondo turno:
Utente: mi trovo bene a 22 °C.
(Chiamata allo strumento): ADK tenta di recuperare i ricordi, ma non sono disponibili.
Modello: ok, ho aggiornato la temperatura a 22 gradi.
(Callback): ADK attiva il salvataggio di informazioni. Viene creata la memoria "Mi piace la temperatura di 22 gradi".
Seconda sessione
La memoria estratta sarà disponibile per la sessione successiva per lo stesso nome dell'app e ID utente. Se l'utente fornisce informazioni simili o contraddittorie rispetto ai ricordi esistenti, le nuove informazioni verranno consolidate con i ricordi esistenti.
Primo turno
Utente: sistema la temperatura. È insopportabile!
(Chiamata allo strumento): l'ADK tenta di recuperare i ricordi. Viene recuperato il ricordo "Mi piace la temperatura di 22 gradi".
Modello: ok, ho aggiornato la temperatura a 22 gradi.
(Callback): ADK attiva il salvataggio di informazioni. Non vengono estratte memorie perché l'utente non ha condiviso nulla di significativo da conservare.
Secondo turno
Utente: In realtà, preferisco che la temperatura sia più alta al mattino.
(Chiamata allo strumento): l'ADK tenta di recuperare i ricordi. Viene recuperato il ricordo "Mi piace la temperatura di 22 gradi".
Modello: Ok, ho alzato la temperatura.
(Callback): l'ADK attiva il salvataggio di informazioni. Il ricordo esistente "Mi piace la temperatura di 21 gradi" viene aggiornato a "In genere mi piace la temperatura di 21 gradi, ma la preferisco più calda al mattino".
Utilizza una Memory Bank multiregionale con un runtime regionale
Per impostazione predefinita, l'agente e la Memory Bank vengono implementati nella stessa regione. Tuttavia, puoi separarli per utilizzare una Memory Bank multiregionale (ad esempio us) con un runtime regionale (ad esempio us-central1). Questa configurazione ti consente di mantenere una Memory Bank centrale in diverse implementazioni regionali.
Per utilizzare un Memory Bank multiregionale, devi sostituire il builder del servizio di memoria ADK predefinito in modo che punti alla posizione multiregionale e all'ID runtime corrispondente.
import vertexai
from google.adk.memory import VertexAiMemoryBankService
from vertexai.agent_engines import AdkApp
# Create the Memory Bank store in a multi-region location (for example, 'us')
client_mb = vertexai.Client(project="PROJECT_ID", location="us")
mb_engine = client_mb.agent_engines.create()
mb_engine_id = mb_engine.api_resource.name.split(\"/\")[-1]
# Point your memory service to the 'us' location, 'us' Memory Bank
def memory_bank_service_builder():
return VertexAiMemoryBankService(
project="PROJECT_ID",
location="us",
agent_engine_id=mb_engine_id
)
# Create the AdkApp with the overridden builder
adk_app = AdkApp(
agent=agent,
memory_service_builder=memory_bank_service_builder
)
# Deploy the runtime to a specific region (for example, 'us-central1')
client_runtime = vertexai.Client(project="PROJECT_ID", location="us-central1")
agent_engine = client_runtime.agent_engines.create(
agent=adk_app,
config={
"staging_bucket": "STAGING_BUCKET",
"requirements": ["google-cloud-aiplatform[agent_engines,adk]"]
}
)
Sostituisci quanto segue:
- PROJECT_ID: il tuo ID progetto.
- STAGING_BUCKET: Il bucket Cloud Storage da utilizzare per lo staging di Agent Runtime.
Esegui la pulizia
Per liberare spazio da tutte le risorse utilizzate in questo progetto, puoi eliminare il Google Cloud progetto utilizzato per la guida rapida.
In alternativa, puoi eliminare le singole risorse che hai creato in questo tutorial nel seguente modo:
Utilizza il seguente esempio di codice per eliminare l'istanza di Agent Runtime, che elimina anche le sessioni o le memorie appartenenti a questo runtime.
agent_engine.delete(force=True)Elimina tutti i file creati localmente.
Passaggi successivi
Guida rapida all'API Memory Bank
Inizia a utilizzare l'API Memory Bank per gestire i ricordi a lungo termine.