Memori Bersama dan Komunikasi Antar-Agen
Implementasikan lapisan memori bersama menggunakan penyimpanan kunci-nilai yang dapat dibaca dan ditulisi oleh agen, sehingga kolaborasi asinkron dapat berlangsung tanpa keterikatan erat antaragen.
Memori Bersama dan Komunikasi Antar-Agen adalah pelajaran AI Engineering Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Engineering Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Engineering Academy mencakup 4 pelajaran total.
Masalah Isolasi Agen
Dalam sistem multiagen, setiap agen berjalan dalam konteksnya sendiri dan tidak mengetahui apa yang sedang atau telah dilakukan agen lain. Jika agen peneliti menemukan fakta penting, bagaimana agen penulis mengetahuinya? Bagaimana agen pemantau mengetahui saat agen pembuat kode mengalami error? Tanpa mekanisme komunikasi bersama, agen menjadi silo terisolasi yang tidak dapat berkolaborasi secara efektif.
Memori Bersama: Model Blackboard
Solusi klasik untuk komunikasi multiagen adalah model Blackboard: penyimpanan data bersama (blackboard) yang dapat dibaca atau ditulis oleh agen mana pun. Agen memublikasikan temuan mereka, membaca kontribusi agen lain, dan berkoordinasi secara implisit melalui status bersama. Model ini memisahkan ketergantungan antaragen — agen tidak perlu mengetahui keberadaan satu sama lain, melainkan hanya struktur memori bersama.
# Simple in-memory blackboard using a dictionary
from threading import Lock
class Blackboard:
def __init__(self):
self._data = {}
self._lock = Lock() # thread-safe for parallel agents
def write(self, key: str, value, agent_id: str):
with self._lock:
self._data[key] = {'value': value, 'written_by': agent_id}
print(f'[{agent_id}] wrote: {key}')
def read(self, key: str):
with self._lock:
return self._data.get(key, {}).get('value')
def keys(self):
with self._lock:
return list(self._data.keys())
blackboard = Blackboard()Memori Bersama Persisten dengan Redis
Untuk sistem multiagen produksi yang agennya berjalan sebagai proses atau layanan terpisah, kamus dalam memori tidaklah memadai. Redis adalah pilihan paling populer untuk memori agen bersama: Redis cepat, mendukung tipe data yang kaya (string, hash, daftar, dan himpunan terurut), memiliki TTL bawaan untuk kedaluwarsa, serta menangani pembacaan dan penulisan bersamaan dengan aman melalui operasi atomik.
import redis
import json
class RedisSharedMemory:
def __init__(self, prefix='agent:'):
self.redis = redis.Redis(host='localhost', port=6379, decode_responses=True)
self.prefix = prefix
def set(self, key: str, value, ttl_seconds=3600):
full_key = self.prefix + key
self.redis.setex(full_key, ttl_seconds, json.dumps(value))
def get(self, key: str):
full_key = self.prefix + key
raw = self.redis.get(full_key)
return json.loads(raw) if raw else None
def append_to_list(self, key: str, item):
full_key = self.prefix + key
self.redis.rpush(full_key, json.dumps(item))
def get_list(self, key: str):
full_key = self.prefix + key
return [json.loads(x) for x in self.redis.lrange(full_key, 0, -1)]
memory = RedisSharedMemory(prefix='research_project:')Membuat Ruang Nama untuk Memori Bersama
Dalam sistem multiagen yang kompleks, agen menulis banyak jenis data yang berbeda, dan ruang nama kunci yang datar dengan cepat menjadi kacau. Gunakan ruang nama hierarkis untuk mengatur memori bersama dengan jelas. Pola yang umum adalah project_id:agent_role:data_type, misalnya proj_123:researcher:findings atau proj_123:coder:error_log. Dengan demikian, Anda dapat dengan mudah meminta semua data untuk suatu proyek atau semua keluaran dari agen tertentu.
class NamespacedMemory:
def __init__(self, project_id: str, agent_id: str, redis_client):
self.base = f'{project_id}:{agent_id}'
self.redis = redis_client
def write_finding(self, topic: str, content: str):
key = f'{self.base}:findings:{topic}'
self.redis.set(key, content)
def read_all_findings(self, project_id: str):
# Read findings from ALL agents in this project
pattern = f'{project_id}:*:findings:*'
keys = self.redis.keys(pattern)
return {k: self.redis.get(k) for k in keys}
# Usage
researcher_memory = NamespacedMemory('proj_123', 'researcher', redis_client)
researcher_memory.write_finding('competitors', 'OpenAI, Anthropic, Google...')
writer_memory = NamespacedMemory('proj_123', 'writer', redis_client)
all_findings = writer_memory.read_all_findings('proj_123')Memori Terstruktur vs Tidak Terstruktur
Konten memori bersama dapat berupa tidak terstruktur (blok teks mentah yang akan dibaca LLM) atau terstruktur (objek JSON/Python dengan bidang bertipe). Memori terstruktur lebih disarankan karena memungkinkan kueri terprogram, validasi, dan penggabungan. Selalu definisikan skema untuk data yang ditulis setiap agen ke memori bersama, dokumentasikan skema tersebut, dan validasikan penulisan terhadapnya agar satu agen yang bermasalah tidak merusak penyimpanan memori.
from pydantic import BaseModel
from typing import Optional, list
from datetime import datetime
class ResearchFinding(BaseModel):
topic: str
summary: str
sources: list[str]
confidence: float # 0.0 to 1.0
written_by: str
timestamp: datetime
# Validated write - bad data is caught before it enters shared memory
def write_finding(memory, finding_dict: dict):
finding = ResearchFinding(**finding_dict) # validates on creation
memory.set(f'findings:{finding.topic}', finding.model_dump())
print(f'Validated finding written for topic: {finding.topic}')Komunikasi Berbasis Peristiwa dengan Pub/Sub
Alih-alih memeriksa memori bersama secara berkala untuk mencari pembaruan, agen dapat menggunakan komunikasi publish/subscribe (pub/sub) untuk memberi tahu agen lain saat mereka menyelesaikan tugas. Agen A memublikasikan sebuah peristiwa ('research_complete'), lalu Agen B, yang berlangganan peristiwa tersebut, aktif dan mulai memproses. Redis pub/sub dan antrean pesan seperti RabbitMQ atau Kafka mendukung pola ini.
import redis
# Publisher (researcher agent)
def researcher_agent(topic, redis_client):
findings = do_research(topic)
redis_client.set(f'findings:{topic}', findings)
# Notify all subscribers that research is done
redis_client.publish('agent_events', f'research_complete:{topic}')
print(f'Research complete, published event for topic: {topic}')
# Subscriber (writer agent) - runs in separate process
def writer_agent_listener(redis_client):
pubsub = redis_client.pubsub()
pubsub.subscribe('agent_events')
for message in pubsub.listen():
if message['type'] == 'message':
event = message['data']
if event.startswith('research_complete:'):
topic = event.split(':')[1]
findings = redis_client.get(f'findings:{topic}')
write_draft(findings) # start writing immediatelyMemori Bersama di LangGraph
Di LangGraph, memori bersama antaragen adalah objek status graf itu sendiri. Setiap simpul membaca dari dan menulis ke kamus status bertipe yang sama. LangGraph menangani koordinasi pembacaan dan penulisan secara otomatis. Untuk skenario yang lebih kompleks, Anda juga dapat memasukkan klien memori eksternal (Redis, basis data) ke setiap fungsi simpul melalui injeksi dependensi.
from langgraph.graph import StateGraph
from typing import TypedDict
class SharedState(TypedDict):
# All shared data lives here - every node can read any field
query: str
research_findings: str # written by researcher, read by writer
written_draft: str # written by writer, read by reviewer
review_notes: str # written by reviewer, read by writer (loop)
final_output: str # written by synthesizer
# Researcher writes to 'research_findings'
def researcher(state: SharedState) -> dict:
findings = search_and_summarize(state['query'])
return {'research_findings': findings} # partial state update
# Writer reads 'research_findings', writes 'written_draft'
def writer(state: SharedState) -> dict:
draft = write_from_findings(state['research_findings']) # reads researcher output
return {'written_draft': draft}Konflik dan Konsistensi Memori
Ketika beberapa agen menulis ke memori bersama secara bersamaan, konflik penulisan dapat terjadi. Dua agen mungkin saling menimpa hasil kerja atau membaca data kedaluwarsa di antara operasi pembacaan dan penulisan. Tangani hal ini dengan: penguncian optimistis (memeriksa versi sebelum menulis), operasi bandingkan-dan-tukar atomik di Redis, atau membuat penulisan berseri melalui agen orkestrator yang menjadi satu-satunya penulis untuk bidang memori penting.
# Optimistic locking with Redis
def safe_write(redis_client, key, new_value, expected_version):
with redis_client.pipeline() as pipe:
try:
pipe.watch(key + ':version') # watch for concurrent modification
current_version = int(pipe.get(key + ':version') or 0)
if current_version != expected_version:
raise ValueError(f'Version conflict: expected {expected_version}, got {current_version}')
pipe.multi() # start transaction
pipe.set(key, new_value)
pipe.set(key + ':version', current_version + 1)
pipe.execute() # atomic commit
print('Write successful')
except redis.WatchError:
print('Conflict detected, retry write')TTL dan Pembersihan Memori
Memori bersama agen terus terakumulasi dan dapat bertambah tanpa batas jika tidak dikelola. Selalu tetapkan masa berlaku (TTL) pada entri memori agar kedaluwarsa secara otomatis. Untuk memori dalam cakupan proyek, bersihkan semua entri ketika proyek selesai. Gunakan nilai TTL yang sesuai dengan durasi alur kerja yang diharapkan: TTL singkat (menit) untuk data sementara, dan TTL lebih panjang (jam hingga hari) untuk hasil yang mungkin digunakan kembali.
def cleanup_project_memory(redis_client, project_id: str):
pattern = f'{project_id}:*'
keys = redis_client.keys(pattern)
if keys:
redis_client.delete(*keys)
print(f'Cleaned up {len(keys)} memory entries for project {project_id}')
# Set TTL when writing
def write_with_ttl(redis_client, key, value, ttl_hours=2):
redis_client.setex(
key,
ttl_hours * 3600, # convert to seconds
json.dumps(value)
)
# Register cleanup callback when workflow completes
def on_workflow_complete(project_id):
cleanup_project_memory(redis_client, project_id)
print(f'Workflow {project_id} complete, memory cleaned up')Memori sebagai Riwayat Agen
Memori bersama juga dapat menyimpan riwayat tindakan agen, bukan hanya hasilnya. Mencatat agen mana yang melakukan tindakan apa, kapan, dan mengapa akan menghasilkan jejak audit yang sangat berharga untuk men-debug kegagalan, memahami cara suatu hasil akhir dibuat, dan melanjutkan alur kerja yang terhenti. Catatan tindakan ini merupakan padanan berbasis memori dari pelacakan LangSmith.
import time
from dataclasses import dataclass
@dataclass
class AgentAction:
agent_id: str
action_type: str # 'research', 'write', 'review', 'tool_call'
input_summary: str
output_summary: str
timestamp: float
success: bool
def log_action(memory, action: AgentAction):
key = f'action_log:{action.agent_id}:{action.timestamp}'
memory.set(key, vars(action))
# Usage in an agent
def researcher_with_logging(state, memory):
start = time.time()
findings = do_research(state['query'])
log_action(memory, AgentAction(
agent_id='researcher',
action_type='research',
input_summary=state['query'][:100],
output_summary=findings[:100],
timestamp=start,
success=True
))
return findingsMemilih Arsitektur Memori
Arsitektur memori bersama yang tepat bergantung pada model penerapan Anda. Untuk alur kerja LangGraph satu proses, status graf sudah memadai. Untuk agen multiproses atau terdistribusi, gunakan Redis. Untuk proyek berumur panjang yang memerlukan ketahanan data setelah dimulai ulang, gunakan basis data relasional dengan pengindeksan yang tepat. Untuk koordinasi berbasis peristiwa antarlayanan, tambahkan pub/sub di atas penyimpanan apa pun yang Anda pilih.
Pemeriksaan Singkat
Uji pemahaman Anda tentang memori bersama dan komunikasi antaragen dari pelajaran ini.
Rangkuman Pelajaran
Dalam pelajaran ini Anda mempelajari bahwa: model papan tulis menggunakan penyimpanan data bersama yang dapat dibaca dan ditulis oleh agen mana pun, sehingga memungkinkan koordinasi implisit tanpa keterikatan langsung antaragen; Redis merupakan pilihan utama untuk memori bersama persisten dalam sistem multiagen terdistribusi; dan pub/sub memungkinkan komunikasi berbasis peristiwa sehingga agen segera merespons ketika dependensi selesai. Selanjutnya, kita akan membahas perulangan eksekusi kode untuk tugas agen.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Memori Bersama dan Komunikasi Antar-Agen” gratis?
Ya — teks lengkap “Memori Bersama dan Komunikasi Antar-Agen” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Engineering Academy, upgrade ke CoddyKit PRO. Kursus AI Engineering Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Memori Bersama dan Komunikasi Antar-Agen”?
Implementasikan lapisan memori bersama menggunakan penyimpanan kunci-nilai yang dapat dibaca dan ditulisi oleh agen, sehingga kolaborasi asinkron dapat berlangsung tanpa keterikatan erat antaragen. Kamu berlatih AI Engineering Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai AI Engineering Academy?
Tidak diperlukan pengalaman sebelumnya. AI Engineering Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Memori Bersama dan Komunikasi Antar-Agen” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Engineering Academy ini?
Ya. Setiap pelajaran AI Engineering Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Mengapa Agen Tunggal Menemui Jalan Buntu
- Pola Orkestrator-Subagen
- Membangun Alur Pemrosesan Multi-Agen dengan LangGraph
- Memori Bersama dan Komunikasi Antar-Agen