0Pricing
AI Engineering Academy · Ders

Paylaşılan Bellek ve Ajanlar Arası İletişim

Ajanların okuyup yazdığı bir anahtar-değer deposu kullanan paylaşılan bir bellek katmanı uygulayın; böylece ajanlar arasında sıkı bağlılık olmadan eşzamansız iş birliği sağlayın.

Paylaşılan Bellek ve Ajanlar Arası İletişim, CoddyKit'te ücretsiz bir AI Engineering Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Engineering Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Engineering Academy kursu toplamda 4 dersten oluşur.

Aracı Yalıtımı Sorunu

Çok aracılı bir sistemde her aracı kendi bağlamında çalışır ve diğer aracıların ne yaptığından veya ne yaptığından haberdar değildir. Bir araştırmacı aracı önemli bir bilgi keşfederse yazar aracı bunu nasıl öğrenecek? Bir izleme aracı, kodlama aracı bir hatayla karşılaştığında bunu nasıl bilecek? Paylaşılan bir iletişim mekanizması olmadığında aracılar, etkili biçimde iş birliği yapamayan yalıtılmış adalar hâline gelir.

Paylaşılan Bellek: Blackboard Modeli

Çok aracılı iletişim için klasik çözüm blackboard modelidir: herhangi bir aracının okuyabildiği veya yazabildiği paylaşılan bir veri deposu (Blackboard). Aracılar bulgularını paylaşır, diğerlerinin katkılarını okur ve paylaşılan durum üzerinden örtük biçimde eş güdüm sağlar. Bu model, aracıları birbirinden bağımsızlaştırır; birbirlerinin varlığını, yalnızca paylaşılan belleğin yapısını bilmeleri gerekmez.

# 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()

Redis ile Kalıcı Paylaşılan Bellek

Aracıların ayrı işlemler veya hizmetler olarak çalıştığı üretim ortamlarındaki çok aracılı sistemler için bellek içi sözlükler yeterli değildir. Redis, paylaşılan aracı belleği için en popüler tercihtir: hızlıdır, zengin veri türlerini (metinler, karmalar, listeler, sıralı kümeler) destekler, sona erme için yerleşik TTL sunar ve eşzamanlı okuma ve yazma işlemlerini atomik işlemlerle güvenli biçimde yönetir.

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:')

Paylaşılan Belleği Ad Alanlarına Ayırma

Karmaşık çok aracılı sistemlerde aracılar birçok farklı veri türü yazar ve düz bir anahtar ad alanı kısa sürede karmaşık hâle gelir. Paylaşılan belleği açıkça düzenlemek için hiyerarşik ad alanları kullanın. Yaygın bir kalıp project_id:agent_role:data_type biçimindedir; örneğin proj_123:researcher:findings veya proj_123:coder:error_log. Bu sayede bir projeye ait tüm verileri veya belirli bir aracının tüm çıktılarını sorgulamak kolaylaşır.

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')

Yapılandırılmış ve Yapılandırılmamış Bellek

Paylaşılan bellek içeriği yapılandırılmamış (LLM'nin okuyacağı ham metin blokları) veya yapılandırılmış (türü belirlenmiş alanlara sahip JSON/Python nesneleri) olabilir. Yapılandırılmış bellek tercih edilir; çünkü programatik sorguları, doğrulamayı ve birleştirmeyi mümkün kılar. Her aracının paylaşılan belleğe ne yazacağı için her zaman bir şema tanımlayın, bu şemayı belgeleyin ve hatalı bir aracının bellek deposunu bozmasını önlemek için yazma işlemlerini bu şemaya göre doğrulayın.

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}')

Pub/Sub ile Olay Odaklı İletişim

Güncellemeleri kontrol etmek için paylaşılan belleği sürekli yoklamak yerine aracılar, bir görevi tamamladıklarında diğer aracıları bilgilendirmek için yayınla/abone ol (pub/sub) iletişimini kullanabilir. A Aracı bir olay (research_complete) yayınlar; bu olaya abone olan B Aracı uyanır ve işlemeye başlar. Redis pub/sub ile RabbitMQ veya Kafka gibi ileti kuyruğu sistemleri bu kalıbı destekler.

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

LangGraph'te Paylaşılan Bellek

LangGraph'te ajanlar arasındaki paylaşılan bellek, doğrudan graf durum nesnesidir. Her düğüm, aynı türü belirtilmiş durum sözlüğünden okur ve bu sözlüğe yazar. LangGraph, okuma ve yazma koordinasyonunu otomatik olarak yönetir. Daha karmaşık senaryolarda harici bir bellek istemcisini (Redis, veritabanı) bağımlılık enjeksiyonu yoluyla her düğüm işlevine de aktarabilirsiniz.

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}

Bellek Çakışmaları ve Tutarlılık

Birden çok ajan paylaşılan belleğe eşzamanlı olarak yazdığında yazma çakışmaları oluşabilir. İki ajan birbirinin çalışmasının üzerine yazabilir veya okuma ile yazma arasında güncel olmayan verileri okuyabilir. Bunu şu yöntemlerle yönetin: yazmadan önce sürümü denetleyen iyimser kilitleme, Redis'te atomik karşılaştırma ve değiştirme işlemleri ya da kritik bellek alanlarına yalnızca düzenleyici ajanın yazdığı yazma işlemlerini sıraya koyma.

# 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')

Bellek TTL'si ve Temizleme

Paylaşılan ajan belleği zamanla birikir ve yönetilmezse sınırsız biçimde büyüyebilir. Bellek girdilerinin otomatik olarak süresinin dolması için her zaman bir yaşam süresi (TTL) belirleyin. Proje kapsamındaki bellek için proje tamamlandığında tüm girdileri temizleyin. İş akışının beklenen süresiyle uyumlu TTL değerleri kullanın: geçici veriler için kısa TTL'ler (dakikalar), yeniden kullanılabilecek sonuçlar için daha uzun TTL'ler (saatlerden günlere kadar).

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')

Ajan Geçmişi Olarak Bellek

Paylaşılan bellek, yalnızca ajanların çıktılarını değil, ajan eylemlerinin geçmişini de saklayabilir. Hangi ajanın neyi, ne zaman ve neden yaptığını kaydetmek; hataları ayıklamak, nihai çıktının nasıl üretildiğini anlamak ve kesintiye uğrayan iş akışlarını sürdürmek için son derece değerli bir denetim izi oluşturur. Bu eylem günlüğü, LangSmith izleme özelliğinin bellek tabanlı karşılığıdır.

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

Bellek Mimarisi Seçme

Doğru paylaşılan bellek mimarisi, dağıtım modelinize bağlıdır. Tek işlemli LangGraph iş akışları için graf durumu yeterlidir. Çok işlemli veya dağıtılmış ajanlar için Redis kullanın. Yeniden başlatmalar arasında kalıcılık gerektiren uzun ömürlü projeler için uygun dizinlemeye sahip ilişkisel bir veritabanı kullanın. Hizmetler arasında olay güdümlü koordinasyon için seçtiğiniz depolama katmanının üzerine yayınlama/abone olma özelliği ekleyin.

Kısa Kontrol

Bu derste paylaşılan bellek ve ajanlar arası iletişim konusundaki anlayışınızı sınayın.

Ders Özeti

Bu derste şunları öğrendiniz: karatahta modeli, herhangi bir ajanın okuyup yazabildiği paylaşılan bir veri deposu kullanarak ajanları doğrudan birbirine bağlamadan örtük koordinasyon sağlar; dağıtılmış çok ajanlı sistemlerde kalıcı paylaşılan bellek için Redis tercih edilen seçenektir; yayınlama/abone olma özelliği, bağımlılıklar tamamlandığında ajanların hemen tepki vermesini sağlayan olay güdümlü iletişimi mümkün kılar. Sırada ajan görevleri için kod yürütme döngüsünü inceleyeceğiz.

Sıkça Sorulan Sorular

“Paylaşılan Bellek ve Ajanlar Arası İletişim” dersi ücretsiz mi?

Evet — “Paylaşılan Bellek ve Ajanlar Arası İletişim” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Engineering Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Engineering Academy kursu toplamda 4 dersten oluşur.

“Paylaşılan Bellek ve Ajanlar Arası İletişim” dersinde ne öğreneceğim?

Ajanların okuyup yazdığı bir anahtar-değer deposu kullanan paylaşılan bir bellek katmanı uygulayın; böylece ajanlar arasında sıkı bağlılık olmadan eşzamansız iş birliği sağlayın. AI Engineering Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

AI Engineering Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te AI Engineering Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Paylaşılan Bellek ve Ajanlar Arası İletişim” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu AI Engineering Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her AI Engineering Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Tekil Ajanların Neden Tıkandığı
  2. Orkestratör-Alt Ajan Deseni
  3. LangGraph ile Çok Ajanlı İş Akışları Oluşturma
  4. Paylaşılan Bellek ve Ajanlar Arası İletişim
← AI Engineering Academy Sayfasına Dön