1. Pengantar

Masalah "Ikan Mas"
Bayangkan Anda menyewa agen perjalanan untuk merencanakan liburan impian Anda ke Tokyo. Gunakan Session Agent untuk melihat "The Goldfish Problem" secara langsung.
Anda masuk ke kantornya dan berkata:
"Halo! Saya ingin merencanakan perjalanan 2 hari ke Tokyo. Saya tertarik dengan situs bersejarah dan sushi."
Agen akan membalas dengan antusias:
"Great! Saya telah merencanakan kunjungan ke Istana Kekaisaran dan makan malam sushi di Sukiyabashi Jiro."
Anda tersenyum dan berkata:
"Kedengarannya sempurna! Bisa kirimkan itinerari perjalanannya kepada saya?"
Agen menatap Anda dengan kosong dan bertanya:
"Halo! Ada yang bisa kami bantu untuk merencanakan perjalanan Anda hari ini?"
Inilah yang disebut "Masalah Ikan Mas". Tanpa memori, setiap interaksi adalah awal yang baru. Kecerdasannya ada—agen tahu cara merencanakan perjalanan—tetapi kesinambungannya tidak ada. Agar benar-benar bermanfaat, agen AI perlu mengingat.
Misi Anda Hari Ini
Dalam workshop ini, Anda akan memecahkan Masalah Ikan Mas dengan membangun Agen Perjalanan yang mengingat, belajar, dan beradaptasi. Anda akan mempelajari 6 Tingkat Memori Agen, sehingga menciptakan sistem yang tidak terlalu mirip chatbot dan lebih mirip asisten pribadi khusus.
Tingkat | Konsep | "Kekuatan Super" |
Level 1 | Sesi & Status | Melakukan percakapan tanpa melupakan |
Level 2 | Status Multi-Agen | Membagikan catatan antaranggota tim |
Level 3 | Persistensi | Mengingat Anda bahkan setelah sistem dimulai ulang |
Level 4 | Callback | Memperbarui memori sepenuhnya secara mandiri |
Level 5 | Alat Kustom | Membaca & menulis profil pengguna terstruktur |
Level 6 | Memori Multimodal | "Melihat" dan mengingat foto & video |
Stack Memori ADK
Sebelum menulis kode, mari kita pahami alat yang kita gunakan. Google Agent Development Kit (ADK) menyediakan cara terstruktur untuk menangani memori:
- Sesi: Penampung untuk percakapan. Objek ini menyimpan histori percakapan.
- Status: "Area kerja" nilai kunci yang dilampirkan ke sesi. Agen menggunakannya untuk menyimpan fakta tertentu (misalnya,
destination="Tokyo"). - MemoryService: Penyimpanan jangka panjang. Di sini kami menyimpan data selamanya, seperti preferensi pengguna atau dokumen yang dianalisis.
2. Siapkan
Untuk mendukung agen AI kami, kami memerlukan dua hal: Project Google Cloud untuk menyediakan fondasi.
Bagian Satu: Aktifkan Akun Penagihan
- Mengklaim akun penagihan dengan kredit 5 dolar, Anda akan memerlukannya untuk deployment. Pastikan Anda login ke akun Gmail Anda.
Bagian Dua: Lingkungan Terbuka
- 👉 Klik link ini untuk langsung membuka Cloud Shell Editor
- 👉 Jika diminta untuk memberikan otorisasi kapan saja hari ini, klik Authorize untuk melanjutkan.

- 👉 Jika terminal tidak muncul di bagian bawah layar, buka terminal:
- Klik Lihat
- Klik Terminal

- 👉💻 Di terminal, verifikasi bahwa Anda sudah diautentikasi dan project disetel ke project ID Anda menggunakan perintah berikut:
gcloud auth list - 👉💻 Clone project bootstrap dari GitHub:
git clone https://github.com/cuppibla/memory_agent_starter - 👉💻 Jalankan skrip penyiapan dari direktori project.
Skrip akan menangani sisa proses penyiapan secara otomatis.cd ~/memory_agent_starter ./init.sh - 👉💻 Tetapkan Project ID yang diperlukan:
gcloud config set project $(cat ~/project_id.txt) --quiet
Bagian Tiga: Menyiapkan izin
- 👉💻 Aktifkan API yang diperlukan menggunakan perintah berikut. Tindakan ini memerlukan waktu beberapa menit.
gcloud services enable \ cloudresourcemanager.googleapis.com \ servicenetworking.googleapis.com \ run.googleapis.com \ aiplatform.googleapis.com \ compute.googleapis.com - 👉💻 Berikan izin yang diperlukan dengan menjalankan perintah berikut di terminal:
. ~/memory_agent_starter/set_env.sh
Perhatikan bahwa file .env dibuat untuk Anda. Bagian ini menampilkan informasi project Anda.
3. Dasar-Dasar - Sesi & Status

Konsep: Konteks adalah Hal Utama
Bentuk memori yang paling dasar adalah Memori Sesi. Hal inilah yang memungkinkan agen mengetahui bahwa "itu" dalam kalimat "Saya ingin membeli itu" merujuk pada sepatu yang Anda bicarakan 10 detik yang lalu.
Di ADK, kita mengelola hal ini dengan objek Session.
- Pendekatan Stateless: Membuat sesi baru untuk setiap pesan.
- Pendekatan Stateful: Membuat satu sesi dan menggunakannya kembali untuk seluruh percakapan.
Langkah 1: Periksa Agen
👉💻 Di terminal Cloud Shell, buka file di Cloud Shell Editor dengan menjalankan:
cloudshell edit ~/memory_agent_starter/01_session_agent/agent.py
Buka ~/memory_agent_starter/01_session_agent/agent.py.
👉 Temukan komentar # TODO: Create a root agent di dalam fungsi agent.py.
Ganti seluruh baris ini dengan kode berikut:
root_agent = LlmAgent(
name="multi_day_trip_agent",
model="gemini-2.5-flash",
description="Agent that progressively plans a multi-day trip, remembering previous days and adapting to user feedback.",
instruction="""
You are the "Adaptive Trip Planner" 🗺️ - an AI assistant that builds multi-day travel itineraries step-by-step.
Your Defining Feature:
You have short-term memory. You MUST refer back to our conversation to understand the trip's context, what has already been planned, and the user's preferences. If the user asks for a change, you must adapt the plan while keeping the unchanged parts consistent.
Your Mission:
1. **Initiate**: Start by asking for the destination, trip duration, and interests.
2. **Plan Progressively**: Plan ONLY ONE DAY at a time. After presenting a plan, ask for confirmation.
3. **Handle Feedback**: If a user dislikes a suggestion (e.g., "I don't like museums"), acknowledge their feedback, and provide a *new, alternative* suggestion for that time slot that still fits the overall theme.
4. **Maintain Context**: For each new day, ensure the activities are unique and build logically on the previous days. Do not suggest the same things repeatedly.
5. **Final Output**: Return each day's itinerary in MARKDOWN format.
""",
tools=[google_search]
)
Petunjuk memberi tahu LLM untuk mengingat, tetapi kode harus menyediakan kemampuan untuk mengingat.
Langkah 2: Dua Skenario
Buka ~/memory_agent_starter/01_session_agent/main.py.
👉 Di terminal Cloud Shell, buka file di Cloud Shell Editor dengan menjalankan:
cloudshell edit ~/memory_agent_starter/01_session_agent/main.py
Buka ~/memory_agent_starter/01_session_agent/main.py, temukan komentar # TODO: Create a runner with in memorysession service di dalam fungsi main.py.
Ganti seluruh baris ini dengan kode berikut:
runner = Runner(
agent=agent,
session_service=session_service,
app_name=agent.name
)
👉 Temukan komentar # TODO: create a different session to test di dalam fungsi main.py.
Ganti seluruh baris ini dengan kode berikut:
tokyo_session_2 = await session_service.create_session(
app_name=multi_day_agent.name,
user_id=user_id
)
Melakukan pengujian
Kita memiliki dua fungsi yang menunjukkan perbedaan antara memori "Ikan Mas" dan "Gajah".
Skenario 1: Stateful (Sesi Bersama)
async def run_trip_same_session_scenario(session_service, user_id):
# 1. Create ONE session
trip_session = await session_service.create_session(...)
# 2. Turn 1
await run_agent_query(..., trip_session, ...)
# 3. Turn 2 - REUSING the same session!
# The agent can "see" Turn 1 because it's in the session history.
await run_agent_query(..., trip_session, ...)
Skenario 2: Stateless (Sesi Baru Setiap Kali)
async def run_trip_different_session_scenario(session_service, user_id):
# Turn 1
tokyo_session = await session_service.create_session(...)
await run_agent_query(..., tokyo_session, ...)
# Turn 2 - Creating a FREASH session
# The agent has NO IDEA what happened in Turn 1.
tokyo_session_2 = await session_service.create_session(...)
await run_agent_query(..., tokyo_session_2, ...)
Langkah 3: Jalankan Agen
Mari kita lihat perbedaannya. Jalankan skrip:
👉💻 Di command line, jalankan command line di bawah:
cd ~/memory_agent_starter
uv run python ~/memory_agent_starter/01_session_agent/main.py
Amati Skenario 1: Agen mengingat preferensi Anda dari pesan pertama dan menyesuaikan rencana dalam pesan kedua.
Mengamati Skenario 2: Pada giliran kedua ("apakah kamu ingat apa yang saya sukai dari makanan itu?"), agen gagal sepenuhnya karena ini adalah sesi baru. Hal ini secara efektif mengatakan, "Saya tidak tahu apa yang Anda bicarakan".
Poin Penting
Aturan #1 Memori: Selalu gunakan kembali session.id untuk mempertahankan konteks percakapan. Objek Session adalah buffer memori jangka pendek agen Anda.
4. Tim - Status Multi-Agen

Konsep: "Permainan Telepon"
Saat beberapa agen bekerja sama, mereka seperti rekan kerja yang saling bertukar folder file. Jika satu agen menulis catatan di folder, agen berikutnya harus dapat membacanya.
Di ADK, "folder" ini adalah State.
- State adalah kamus (
{"key": "value"}) yang ada di dalam Sesi. - Agen mana pun dalam sesi dapat membaca atau menulis ke dalamnya.
Langkah 1: Periksa Alur Kerja
👉💻 Di terminal Cloud Shell, buka file di Cloud Shell Editor dengan menjalankan:
cloudshell edit ~/memory_agent_starter/02_multi_agent/agent.py
👉Di file ~/memory_agent_starter/02_multi_agent/agent.py, temukan komentar # TODO: foodie agent.
Ganti seluruh baris ini dengan kode berikut:
foodie_agent = LlmAgent(
name="foodie_agent",
model="gemini-2.5-flash",
tools=[google_search],
instruction="""You are an expert food critic. Your goal is to find the best restaurant based on a user's request.
When you recommend a place, you must output *only* the name of the establishment and nothing else.
For example, if the best sushi is at 'Jin Sho', you should output only: Jin Sho
""",
output_key="destination" # ADK will save the agent's final response to state['destination']
)
👉 Temukan komentar # TODO: transportation agent di dalam fungsi agent.py.
Ganti seluruh baris ini dengan kode berikut:
transportation_agent = LlmAgent(
name="transportation_agent",
model="gemini-2.5-flash",
tools=[google_search],
instruction="""You are a navigation assistant. Given a destination, provide clear directions.
The user wants to go to: {destination}.
Analyze the user's full original query to find their starting point.
Then, provide clear directions from that starting point to {destination}.
""",
)
👉 Temukan komentar # TODO: root_agent di dalam fungsi agent.py.
Ganti seluruh baris ini dengan kode berikut:
root_agent = SequentialAgent(
name="find_and_navigate_agent",
sub_agents=[foodie_agent, transportation_agent],
description="A workflow that first finds a location and then provides directions to it."
)
Sekarang kita memiliki dua agen yang bekerja secara berurutan:
- Agen Pecinta Kuliner (Foodie Agent): Menemukan restoran.
- Agen Transportasi: Memberikan petunjuk arah ke restoran tersebut.
Pengalihan Ajaib: Perhatikan cara foodie_agent mengalihkan tongkat estafet ke transportation_agent.
foodie_agent = LlmAgent(
# ...
# CRITICAL: This tells ADK to save the agent's output to state['destination']
output_key="destination"
)
transportation_agent = LlmAgent(
# ...
# CRITICAL: This injects state['destination'] into the prompt
instruction="""
The user wants to go to: {destination}.
Provide clear directions...
""",
)
output_key="destination": Jawaban Agen Pecinta Kuliner disimpan secara efisien.{destination}: Agen Transportasi membaca jawaban tersebut secara otomatis.
(Tidak Perlu Tindakan) Langkah 2: Orchestrator
Buka 02_multi_agent/main.py.
Kita menggunakan SequentialAgent untuk menjalankannya secara berurutan.
# 1. Create a single session for the sequential agent
session = await session_service.create_session(...)
# 2. Run the query
# The SequentialAgent manages the state flow:
# Query -> Foodie -> state['destination'] -> Transportation -> Final Answer
await run_agent_query(root_agent, query, ...)
Pengguna mengirim satu perintah:
"Find best sushi in Palo Alto and then tell me how to get there."
Agen bekerja sama untuk menjawabnya.
Langkah 3: Jalankan Tim
👉💻 Di Cloud Shell Terminal, jalankan alur kerja multi-agen:
cd ~/memory_agent_starter
uv run python ~/memory_agent_starter/02_multi_agent/main.py
Apa yang terjadi?
- Agen Pecinta Kuliner (Foodie Agent): Menemukan "Jin Sho" (atau yang serupa).
- ADK: Menyimpan "Jin Sho" ke
state['destination']. - Agen Transportasi: Menerima "Jin Sho" dalam instruksinya.
- Hasil: "Untuk menuju Jin Sho dari stasiun Caltrain, berjalanlah di University Ave..."
Poin Penting
Aturan #2 Memori: Gunakan Status untuk meneruskan informasi terstruktur antar-agen. Gunakan output_key untuk menulis dan {placeholders} untuk membaca.
5. Reboot - Persistensi

Konsep: "Masalah Reboot"
Sejauh ini, memori kita telah InMemory. Jika Anda menghentikan skrip dan memulainya lagi, agen akan melupakan semuanya. Hal ini seperti komputer yang menghapus hard drive-nya setiap kali Anda mematikannya.
Untuk memperbaikinya, kita memerlukan Persistensi. Kita menukar InMemorySessionService dengan DatabaseSessionService.
Langkah 1: Peralihan Database
👉💻 Di terminal Cloud Shell, buka file di Cloud Shell Editor dengan menjalankan:
cloudshell edit ~/memory_agent_starter/03_persistent_agent/main.py
👉 Di file ~/memory_agent_starter/03_persistent_agent/main.py, cari komentar # TODO: Configuration for Persistent Sessions.
Ganti seluruh baris ini dengan kode berikut:
SESSIONS_DIR = Path(os.path.expanduser("~")) / ".adk_codelab" / "sessions"
os.makedirs(SESSIONS_DIR, exist_ok=True)
SESSION_DB_FILE = SESSIONS_DIR / "trip_planner.db"
SESSION_URL = f"sqlite:///{SESSION_DB_FILE}"
Sekarang, setiap sesi dan peristiwa disimpan ke file SQLite.
Langkah 2: Pengambilan Lintas Sesi
Persistensi tidak hanya memungkinkan melanjutkan percakapan, tetapi juga belajar dari percakapan sebelumnya.
Di file yang sama ~/memory_agent_starter/03_persistent_agent/main.py, lihat Test Case 3: Cross-Session Retrieval.
👉 Temukan komentar # TODO: retrieve the previous session manually
Ganti seluruh baris ini dengan kode berikut:
old_session = await session_service.get_session(
app_name=root_agent.name, user_id="user_01", session_id=session_id
)
👉 Temukan komentar # TODO: Extract content from the OLD session di dalam fungsi main.py.
Ganti seluruh baris ini dengan kode berikut:
previous_context += f"- {role}: {text}\n"
👉 Temukan komentar # TODO: Manually inject the context to the query di dalam fungsi main.py.
Ganti seluruh baris ini dengan kode berikut:
query_3 = f"""
{previous_context}
I'm planning a new trip to Osaka this time.
Based on my previous preferences (above), what should I eat?
"""
Hal ini menyimulasikan pengguna yang kembali beberapa bulan kemudian. Hanya dengan database Anda dapat mengambil histori lama tersebut.
Langkah 3: Bertahan dari Mulai Ulang
👉💻 Di terminal, jalankan skrip:
cd ~/memory_agent_starter
uv run python ~/memory_agent_starter/03_persistent_agent/main.py
Tindakan ini akan membuat file ~/memory_agent_starter/trip_planner.db. Coba ini: Jalankan skrip dua kali.
- Pada proses kedua, cari "Melanjutkan sesi yang ada".
- Agen akan mengingat konteks dari proses pertama karena memuat dari file database.
Poin Penting
Aturan #3 Memori: Gunakan DatabaseSessionService untuk produksi. Hal ini memastikan percakapan pengguna tetap ada saat server dimulai ulang dan memungkinkan analisis histori jangka panjang.
6. Spy - Callback

Terkadang, Anda perlu memperbarui memori secara otomatis berdasarkan tindakan agen, bukan hanya apa yang dikatakannya. Anda menginginkan "mata-mata" yang mengawasi agen dan membuat catatan.
Di ADK, spy ini adalah Callback. 
after_tool_callback: Fungsi yang berjalan setiap kali agen bekerja.ToolContext: Cara menulis ke State dari dalam fungsi tersebut.
Langkah 1: Logika
👉💻 Di terminal Cloud Shell, buka file di Cloud Shell Editor dengan menjalankan:
cloudshell edit ~/memory_agent_starter/04_stateful_agent/agent.py
👉 Di file ~/memory_agent_starter/04_stateful_agent/agent.py, temukan komentar # TODO: Implement call back logic
Ganti seluruh baris ini dengan kode berikut:
def save_activity_type_callback(
tool,
args: Dict[str, Any],
tool_context: ToolContext,
tool_response: Dict[str, Any],
) -> Optional[Dict[str, Any]]:
"""
Callback to save the TYPE of activity just planned into the session state.
"""
# 1. Get the actual agent name.
if tool.name == "transfer_to_agent":
agent_name = args.get("agent_name")
else:
agent_name = tool.name
activity_type = "unknown"
# 2. Determine the type based on which agent was actually used
if agent_name == "museum_expert":
activity_type = "CULTURAL"
elif agent_name == "restaurant_expert":
activity_type = "FOOD"
elif agent_name == "outdoor_expert":
activity_type = "OUTDOOR"
print(f"\n🔔 [CALLBACK] The planner transferred to '{agent_name}'.")
# 3. Update the state directly
tool_context.state["last_activity_type"] = activity_type
print(f"💾 [STATE UPDATE] 'last_activity_type' is now set to: {activity_type}\n")
return tool_response
👉 Di file yang sama, Temukan komentar # TODO: add callback to root agent di dalam fungsi 04_stateful_agent/agent.py.
Ganti seluruh baris ini dengan kode berikut:
after_tool_callback=save_activity_type_callback,
Petunjuk Dinamis: Petunjuk agen kini berupa fungsi, bukan string. Perubahan ini didasarkan pada status!
def get_planner_instruction(context):
last_activity = context.state.get("last_activity_type", "None")
return f"""
The last activity was: {last_activity}
If last_activity is 'CULTURAL' -> `museum_expert` is BANNED.
"""
Langkah 3: Uji Spy
👉💻 Di terminal, jalankan skrip dengan menyalin dan menempelkan perintah di bawah:
cd ~/memory_agent_starter
uv run python ~/memory_agent_starter/04_stateful_agent/main.py
Saat menjalankan agen ini, Anda akan melihat loop.
- Giliran 1: Anda meminta museum. Set mata-mata
last_activity="CULTURAL". - Giliran 2: Anda meminta museum lain.
- Pembaruan Petunjuk Agen: "CULTURAL is BANNED".
- Agen mengatakan: "Saya tidak bisa pergi ke museum lain. Bagaimana kalau ke taman?"
Lihat log konsol untuk [CALLBACK] dan [STATE UPDATE]. Anda dapat melihat perubahan memori secara real time saat agen bekerja.
Poin Penting
Aturan #4 Memori: Gunakan Callback untuk mengotomatiskan pengelolaan status. Agen Anda membangun konteksnya sendiri hanya dengan melakukan tugasnya.
7. Lemari Arsip - Alat Kustom
Konsep: "Memori Terstruktur"

Sejauh ini, "Memori" berupa log chat atau key-value pair sederhana. Namun, bagaimana jika Anda perlu mengingat profil pengguna yang rumit? Misalnya, diet: vegan, budget: high, pets: [cat, dog].
Untuk itu, kita memperlakukan memori sebagai Alat. Agen secara eksplisit memutuskan kapan harus membuka lemari file (membaca) dan kapan harus mengajukan laporan (menulis). 
Langkah 1: Alat
👉💻 Di terminal Cloud Shell, buka file di Cloud Shell Editor dengan menjalankan:
cloudshell edit ~/memory_agent_starter/05_profile_agent/tools.py
👉 Dalam file ini: ~/memory_agent_starter/05_profile_agent/tools.py.
Kita perlu menerapkan dua alat khusus ini:
save_user_preferences: Menulis ke database.recall_user_preferences: Membaca dari database.
Temukan komentar # TODO: implement save_user_preferences tools di dalam fungsi ~/memory_agent_starter/05_profile_agent/tools.py.
Ganti seluruh baris ini dengan kode berikut:
def save_user_preferences(tool_context: ToolContext, new_preferences: Dict[str, Any]) -> str:
user_id = tool_context.session.user_id
with sqlite3.connect(USER_DB_FILE) as conn:
for key, value in new_preferences.items():
conn.execute("INSERT INTO user_preferences (user_id, pref_key, pref_value) VALUES (?, ?, ?) ON CONFLICT(user_id, pref_key) DO UPDATE SET pref_value = excluded.pref_value;",
(user_id, key, json.dumps(value)))
return f"Preferences updated: {list(new_preferences.keys())}"
👉 Temukan komentar # TODO: implement recall_user_preferences tools di dalam fungsi 05/tools.py.
Ganti seluruh baris ini dengan kode berikut:
def recall_user_preferences(tool_context: ToolContext) -> Dict[str, Any]:
user_id = tool_context.session.user_id
preferences = {}
with sqlite3.connect(USER_DB_FILE) as conn:
rows = conn.execute("SELECT pref_key, pref_value FROM user_preferences WHERE user_id = ?", (user_id,)).fetchall()
if not rows: return {"message": "No preferences found."}
for key, value_str in rows: preferences[key] = json.loads(value_str)
return preferences
Petunjuk ini memaksakan alur kerja:
instruction="""
1. RECALL FIRST: First action MUST be `recall_user_preferences`.
3. LEARN: If a user states a new preference, use `save_user_preferences`.
"""
Langkah 2: Pelaksanaan
👉💻 Di terminal Cloud Shell, buka file di Cloud Shell Editor dengan menjalankan:
cloudshell edit ~/memory_agent_starter/05_profile_agent/main.py
Buka ~/memory_agent_starter/05_profile_agent/main.py.
Tidak seperti modul sebelumnya yang ADK menangani status secara otomatis, di sini Agent yang mengontrol.
- Bot memilih untuk memanggil
recall_user_preferencesdi awal. - Aplikasi ini memilih untuk memanggil
save_user_preferencessaat Anda mengatakan "Saya seorang vegan".
Langkah 3: Buat Profil
👉💻 Jalankan skrip:
cd ~/memory_agent_starter
uv run python ~/memory_agent_starter/05_profile_agent/main.py
Coba alur percakapan ini:
- "Hai, rencanakan makan malam." -> Agen memeriksa DB, tidak menemukan apa pun. Meminta preferensi.
- "Saya seorang vegan." -> Agen menyimpan "vegan" ke DB.
- Mulai ulang skrip.
- "Hai, rencanakan makan malam." -> Agen memeriksa DB, melihat "vegan", dan langsung menyarankan restoran vegan.
Poin Penting
Aturan #5 Memori: Untuk data terstruktur yang kompleks, berikan Alat Baca/Tulis kepada agen Anda. Biarkan LLM mengelola penyimpanan jangka panjangnya sendiri.
8. Otak - Memori Multimodal

Konsep: "Pengalaman Manusia"
Manusia mengingat lebih dari sekadar teks. Kita mengingat suasana foto, suara orang, perasaan video.
Vertex AI Memory Bank memungkinkan agen Anda menangani Multimodal Memory. Model ini dapat memproses gambar, video, dan audio, "memahaminya", dan mengambilnya nanti.
Langkah 1: Konfigurasi
👉💻 Di terminal Cloud Shell, buka file di Cloud Shell Editor dengan menjalankan:
cloudshell edit ~/memory_agent_starter/06_multimodal_agent/main.py
👉 Buka 06_multimodal_agent/main.py. Temukan komentar # TODO: Configure Memory Bank Topic.
Ganti seluruh baris ini dengan kode berikut:
travel_topics = [
MemoryTopic(
managed_memory_topic=ManagedMemoryTopic(
managed_topic_enum=ManagedTopicEnum.USER_PREFERENCES
)
),
MemoryTopic(
managed_memory_topic=ManagedMemoryTopic(
managed_topic_enum=ManagedTopicEnum.USER_PERSONAL_INFO
)
),
MemoryTopic(
custom_memory_topic=CustomMemoryTopic(
label="travel_experiences",
description="""Memorable travel experiences including:
- Places visited and impressions
- Favorite restaurants, cafes, and food experiences
- Preferred accommodation types and locations
- Activities enjoyed (museums, hiking, beaches, etc.)
- Travel companions and social preferences
- Photos and videos from trips with location context""",
)
),
MemoryTopic(
custom_memory_topic=CustomMemoryTopic(
label="travel_preferences",
description="""Travel style and preferences:
- Budget preferences (luxury, mid-range, budget)
- Transportation preferences (flying, trains, driving)
- Trip duration preferences
- Season and weather preferences
- Cultural interests and language abilities
- Dietary restrictions and food preferences""",
)
),
MemoryTopic(
custom_memory_topic=CustomMemoryTopic(
label="travel_logistics",
description="""Practical travel information:
- Passport and visa information
- Frequent flyer numbers and hotel loyalty programs
- Emergency contacts
- Medical considerations and insurance
- Packing preferences and essentials
- Time zone preferences and jet lag strategies""",
)
),
]
Cari komentar # TODO: Configure Memory Bank Customization
Ganti seluruh baris ini dengan kode berikut:
memory_bank_config = {
"customization_configs": [
{
"memory_topics": travel_topics,
}
],
"similarity_search_config": {
"embedding_model": f"projects/{PROJECT_ID}/locations/{LOCATION}/publishers/google/models/gemini-embedding-001"
},
"generation_config": {
"model": f"projects/{PROJECT_ID}/locations/{LOCATION}/publishers/google/models/gemini-2.5-flash"
},
}
Langkah 2: Menyerap Dunia
Di test_trip_planner, kami mengirim:
- Pesan teks ("Halo")
- Gambar (Tempat Terkenal)
- Video (Laut Mediterania)
- Klip Audio (Catatan suara tentang Gaeta)
Temukan komentar # TODO create session service and memory service di dalam fungsi 6_multimodal_agent/main.py.
Ganti seluruh baris ini dengan kode berikut:
session_service = VertexAiSessionService(
project=PROJECT_ID, location=LOCATION, agent_engine_id=agent_engine_id
)
memory_service = VertexAiMemoryBankService(
project=PROJECT_ID, location=LOCATION, agent_engine_id=agent_engine_id
)
👉 Dalam file 06_multimodal_agent/main.py yang sama, temukan komentar # TODO: create memory from session
Ganti seluruh baris ini dengan kode berikut:
await memory_service.add_session_to_memory(final_session_state)
Ini adalah garis ajaib. Aplikasi ini mengirimkan semua media kaya tersebut ke Vertex AI, yang memproses dan mengindeksnya.
Langkah 3: Pengambilan
👉💻 Di terminal Cloud Shell, buka file di Cloud Shell Editor dengan menjalankan:
cloudshell edit ~/memory_agent_starter/06_multimodal_agent/agent.py
Agen memiliki PreloadMemoryTool.
tools=[PreloadMemoryTool(), budget_tool]
Saat sesi baru dimulai, alat ini akan otomatis menelusuri Bank Memori untuk menemukan pengalaman masa lalu yang relevan dan menyisipkannya ke dalam konteks.
Langkah 4: Jalankan Brain
👉💻 Di terminal Cloud Shell, jalankan skrip (Catatan: Ini memerlukan Project Google Cloud dengan Vertex AI yang diaktifkan):
cd ~/memory_agent_starter
uv run python ~/memory_agent_starter/06_multimodal_agent/main.py
Tonton langkah verifikasi terakhir:
"Berdasarkan gambar, video, DAN audio yang saya bagikan kepada Anda sebelumnya..."
Agen akan membalas:
"Anda harus mengunjungi Gaeta! Anda menunjukkan kepada saya video Laut Mediterania, dan klip audio yang mengatakan bahwa Anda menyukai Gaeta."
Alat ini menghubungkan titik-titik di berbagai jenis media dari masa lalu.
Poin Penting
Aturan #6 Memori: Gunakan Vertex AI Memory Bank untuk pengalaman memori terbaik. Fitur ini menyatukan teks, gambar, dan video ke dalam satu otak yang dapat ditelusuri.
9. Kesimpulan
Anda telah melakukan perjalanan dari Ikan Mas yang pelupa hingga Gajah Multimodal.
Anda Membuat | Kemampuan |
Session Agent | Memori percakapan jangka pendek |
Multi-Agent | Memori tim bersama |
Persistent Agent | Histori jangka panjang |
Agen Stateful | Memori dinamis yang diperbarui sendiri |
Profile Agent | Memori data terstruktur |
Agen Multimodal | Memori sensorik seperti manusia |
Kepercayaan dibangun berdasarkan ingatan. Dengan menerapkan pola ini, Anda membuat agen yang menghargai waktu dan histori pengguna, sehingga menghasilkan interaksi yang lebih mendalam dan efektif.
Mulai bangun agen yang dipersonalisasi Anda sekarang.