AI Engineering Academy · Ders

Redis ve PostgreSQL'de Sohbet Geçmişini Kalıcı Hâle Getirme

Belleğin uygulama yeniden başlatmalarından sonra da korunması ve birden çok örnek arasında ölçeklenmesi için konuşma geçmişini RedisChatMessageHistory ve PostgresChatMessageHistory kullanarak harici olarak depolayın.

4. ders / 413 adım

Redis ve PostgreSQL'de Sohbet Geçmişini Kalıcı Hâle Getirme, 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.

Sohbet Geçmişi Neden Harici Olarak Kalıcılaştırılmalı?

Bellek içi görüşme geçmişi, uygulamanız yeniden başlatıldığında veya birden çok örneğe ölçeklendiğinde ortadan kaybolur. Harici kalıcılaştırma üç sorunu çözer: geçmiş çökmelerden sonra da korunur, birden çok sunucu örneği aynı geçmişi paylaşır ve geri dönen kullanıcılar için geçmiş oturumları yükleyebilirsiniz. Redis ve PostgreSQL bunun için en popüler iki arka uçtur.

LangChain Sohbet İletisi Geçmişi Arayüzü

LangChain, BaseChatMessageHistory arayüzünü iki yöntemle tanımlar: add_message(message) ve messages (özellik). Bu arayüzü uygulayan herhangi bir depolama arka ucu, tüm LangChain zincirlerinde bellek olarak doğrudan kullanılabilir. Redis ve PostgreSQL uygulamalarının her ikisi de bu arayüzü izler.

from langchain_community.chat_message_histories import RedisChatMessageHistory

# Each unique session_id gets its own history namespace
history = RedisChatMessageHistory(
    session_id='user:alice:session:42',
    url='redis://localhost:6379'
)

# Add messages
history.add_user_message('What is RAG?')
history.add_ai_message('RAG stands for Retrieval-Augmented Generation...')

# Retrieve stored messages
for msg in history.messages:
    print(msg.type, ':', msg.content[:50])

Redis Geçmişini Bir Zincire Bağlama

Zincirinizi RunnableWithMessageHistory ile sarın ve her oturum için doğru geçmiş nesnesini döndüren bir fabrika işlevi sağlayın. LangChain, her çağrıdan önce geçmişi otomatik olarak yükler ve her yanıttan sonra yeni iletileri kaydeder.

from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_community.chat_message_histories import RedisChatMessageHistory
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder

llm = ChatOpenAI(model='gpt-4o-mini')
prompt = ChatPromptTemplate.from_messages([
    ('system', 'You are a helpful assistant.'),
    MessagesPlaceholder(variable_name='history'),
    ('human', '{input}')
])

chain = prompt | llm

chain_with_history = RunnableWithMessageHistory(
    chain,
    lambda session_id: RedisChatMessageHistory(
        session_id=session_id,
        url='redis://localhost:6379'
    ),
    input_messages_key='input',
    history_messages_key='history'
)

Zinciri Oturum Kimliğiyle Çağırma

İleti geçmişiyle sarılmış bir zinciri çağırırken oturum kimliğini config sözlüğünde configurable altında geçirin. LangChain, her çağrıyı doğru geçmiş deposuna otomatik olarak yönlendirir; böylece Alice ve Bob'un konuşma geçmişleri tamamen ayrı kalır.

# First turn for session alice-001
response = chain_with_history.invoke(
    {'input': 'My name is Alice.'},
    config={'configurable': {'session_id': 'alice-001'}}
)
print(response.content)

# Second turn — the chain remembers Alice's name from Redis
response = chain_with_history.invoke(
    {'input': 'What is my name?'},
    config={'configurable': {'session_id': 'alice-001'}}
)
print(response.content)  # Should say 'Your name is Alice.'

Konuşma Geçmişi için Redis Anahtar Tasarımı

Redis, her oturumun iletilerini oturum kimliğinden türetilen bir anahtarın altında liste olarak saklar. Uygulamalar arasındaki anahtar çakışmalarını önlemek ve kullanıcıya göre verimli tarama yapabilmek için chat:<app>:<user_id>:<session_id> gibi yapılandırılmış bir anahtar şeması kullanın. Eski oturum anahtarlarına, depolamanın sınırsız büyümesini önlemek için bir TTL belirleyin.

import redis

r = redis.Redis.from_url('redis://localhost:6379')

# List all chat sessions for user alice
keys = r.keys('message_store:alice-*')
print('Active sessions:', len(keys))

# Set a 30-day TTL on a session to auto-expire old history
for key in keys:
    r.expire(key, 60 * 60 * 24 * 30)

PostgreSQL Konuşma Geçmişi Tablosu Tasarımı

SQL tabanlı kalıcılık için oturum kimliği, ileti rolü, içerik ve zaman damgası sütunlarını içeren bir tablo oluşturun. Konuşma geçmişinizin sorgulanması, denetlenmesi veya kullanıcı hesabı verileriyle birleştirilmesi gerekiyorsa PostgreSQL ideal bir seçenektir. langchain_postgres paketi, kullanıma hazır bir uygulama sunar.

-- SQL table for storing chat messages
CREATE TABLE chat_messages (
    id          SERIAL PRIMARY KEY,
    session_id  TEXT NOT NULL,
    role        TEXT NOT NULL,   -- 'human' or 'ai'
    content     TEXT NOT NULL,
    created_at  TIMESTAMPTZ DEFAULT NOW()
);

CREATE INDEX idx_chat_session ON chat_messages (session_id, created_at);

LangChain'de PostgresChatMessageHistory

langchain_postgres içindeki PostgresChatMessageHistory sınıfı, Redis sürümüyle aynı şekilde çalışır; ancak iletileri PostgreSQL veritabanınızda saklar. Bir bağlantı dizesi ve oturum kimliği geçirin; tablo oluşturma ve ileti serileştirme işlemlerini otomatik olarak yönetir.

from langchain_postgres import PostgresChatMessageHistory
import psycopg

CONNECTION_STRING = 'postgresql://user:pass@localhost:5432/mydb'

# Create history object for a session
history = PostgresChatMessageHistory(
    table_name='chat_messages',
    session_id='alice-001',
    connection=psycopg.connect(CONNECTION_STRING)
)

history.add_user_message('Tell me about embeddings.')
history.add_ai_message('Embeddings are dense vector representations...')

print(f'Stored {len(history.messages)} messages')

Geri Dönen Kullanıcılar için Önceki Oturumları Yükleme

Bir kullanıcı uygulamanızı kapattıktan sonra geri döndüğünde, Redis veya PostgreSQL'den geçmişi yükleyerek son oturumunu geri yükleyebilirsiniz. Kullanıcıya kaldığı yeri özetleyebilir veya kayıtlı geçmişi bir sonraki isteme ekleyerek konuşmaya sorunsuzca devam edebilirsiniz.

def get_or_create_history(user_id: str, session_id: str):
    history = RedisChatMessageHistory(
        session_id=f'{user_id}:{session_id}',
        url='redis://localhost:6379'
    )
    if history.messages:
        print(f'Resuming session with {len(history.messages)} messages.')
    else:
        print('Starting a new session.')
    return history

Veritabanındaki Geçmişi Kısaltma

Uzun süre devam eden oturumlarda binlerce ileti birikebilir. Bir kesme zamanından daha eski iletileri silen veya veritabanında yalnızca son N iletiyi tutan bir kısaltma stratejisi uygulayın. Bu yaklaşım, geçmişi yüklediğinizde getirme işlemini hızlı tutar ve bağlam pencerelerinin taşmasını önler.

# Keep only the last 20 messages per session in PostgreSQL
CLEAN_SQL = '''
    DELETE FROM chat_messages
    WHERE session_id = %s
    AND id NOT IN (
        SELECT id FROM chat_messages
        WHERE session_id = %s
        ORDER BY created_at DESC
        LIMIT 20
    )
'''

def trim_session(conn, session_id: str, keep_last: int = 20):
    with conn.cursor() as cur:
        cur.execute(CLEAN_SQL, (session_id, session_id))
    conn.commit()

Redis ile PostgreSQL Arasında Seçim Yapma

Her iki arka uç da üretim kullanımı için hazırdır; ancak güçlü oldukları yönler farklıdır. Redis, milisaniyenin altında okuma süreleri sunarak gecikmenin en önemli unsur olduğu gerçek zamanlı konuşmalar için idealdir. PostgreSQL tam SQL sorgulanabilirliği, ACID işlemleri ve analiz ile denetim için mevcut kullanıcı veritabanınızla kolay entegrasyon sağlar. Birçok üretim sistemi birincil önbellek olarak Redis'i, kalıcı arşivleme içinse PostgreSQL'i kullanır.

Güvenlik: Çok Kiracılı Geçmişleri Birbirinden Ayırma

Çok kiracılı uygulamalarda kullanıcıların birbirlerinin geçmişlerine erişememesini sağlamalısınız. Oturum anahtarına her zaman kullanıcı kimliğini ekleyin, geçmişi yüklemeden önce oturum kimliğinin kimliği doğrulanmış kullanıcıya ait olduğunu doğrulayın ve ham oturum anahtarlarını istemci tarafındaki URL'lerde veya çerezlerde hiçbir zaman göstermeyin.

  • İyi anahtar: chat:app1:user:42:session:abc
  • Kötü anahtar: session:abc (tahmin edilebilir, kullanıcı kapsamı yok)

Hızlı Kontrol

Konuşma geçmişini harici olarak kalıcılaştırma konusundaki anlayışınızı test edin.

Ders Özeti

Bu derste şunları öğrendiniz: RedisChatMessageHistory, konuşma geçmişini oturum başına anahtarlarla Redis'te saklar, PostgresChatMessageHistory, SQL ile sorgulanabilen kalıcı depolama olanağı sunar ve RunnableWithMessageHistory, session_id fabrikası aracılığıyla herhangi bir arka ucu zincirinize bağlar. Sırada, akıl yürütme ve eylem gerçekleştiren aracıları oluşturmak için ReAct çerçevesini inceleyeceğiz.

Başlamak ücretsiz

Yapay zeka eğitmeniyle Python öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
30
Dersler
120

Sıkça Sorulan Sorular

“Redis ve PostgreSQL'de Sohbet Geçmişini Kalıcı Hâle Getirme” dersi ücretsiz mi?

Evet — “Redis ve PostgreSQL'de Sohbet Geçmişini Kalıcı Hâle Getirme” 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.

“Redis ve PostgreSQL'de Sohbet Geçmişini Kalıcı Hâle Getirme” dersinde ne öğreneceğim?

Belleğin uygulama yeniden başlatmalarından sonra da korunması ve birden çok örnek arasında ölçeklenmesi için konuşma geçmişini RedisChatMessageHistory ve PostgresChatMessageHistory kullanarak harici… 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.

“Redis ve PostgreSQL'de Sohbet Geçmişini Kalıcı Hâle Getirme” 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. Durumsuz LLM'lerin Harici Belleğe İhtiyaç Duymasının Nedeni
  2. Tampon ve Pencere Belleği
  3. Özet Belleği ve Token Farkındalıklı Kısaltma
  4. Redis ve PostgreSQL'de Sohbet Geçmişini Kalıcı Hâle Getirme
← AI Engineering Academy Sayfasına Dön