0Pricing
AI Engineering Academy · Pelajaran

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 immediately

Memori 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 findings

Memilih 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

  1. Mengapa Agen Tunggal Menemui Jalan Buntu
  2. Pola Orkestrator-Subagen
  3. Membangun Alur Pemrosesan Multi-Agen dengan LangGraph
  4. Memori Bersama dan Komunikasi Antar-Agen
← Kembali ke AI Engineering Academy