0Pricing
AI Engineering Academy · Pelajaran

Menyimpan Riwayat Obrolan di Redis dan PostgreSQL

Simpan riwayat percakapan secara eksternal menggunakan RedisChatMessageHistory dan PostgresChatMessageHistory agar memori tetap ada setelah aplikasi dimulai ulang dan dapat diskalakan di beberapa instans.

Menyimpan Riwayat Obrolan di Redis dan PostgreSQL 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.

Mengapa Menyimpan Riwayat Percakapan Secara Eksternal?

Riwayat percakapan dalam memori akan hilang ketika aplikasi Anda dimulai ulang atau diskalakan ke beberapa instans. Penyimpanan eksternal mengatasi tiga masalah: riwayat tetap tersedia setelah kerusakan, beberapa instans server dapat berbagi riwayat yang sama, dan Anda dapat memuat sesi sebelumnya untuk pengguna yang kembali. Redis dan PostgreSQL adalah dua backend yang paling populer untuk hal ini.

Antarmuka Riwayat Pesan Percakapan LangChain

LangChain mendefinisikan antarmuka BaseChatMessageHistory dengan dua metode: add_message(message) dan messages (properti). Backend penyimpanan apa pun yang menerapkan antarmuka ini dapat digunakan sebagai memori untuk rantai LangChain apa pun. Implementasi Redis dan PostgreSQL sama-sama mengikuti antarmuka ini.

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

Menghubungkan Riwayat Redis ke Rantai

Bungkus rantai Anda dengan RunnableWithMessageHistory dan sediakan fungsi pabrik yang mengembalikan objek riwayat yang tepat untuk setiap sesi. LangChain secara otomatis memuat riwayat sebelum setiap pemanggilan dan menyimpan pesan baru setelah setiap respons.

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

Memanggil Rantai dengan ID Sesi

Saat Anda memanggil rantai yang dibungkus dengan riwayat pesan, teruskan ID sesi dalam kamus config di bawah configurable. LangChain secara otomatis mengarahkan setiap pemanggilan ke penyimpanan riwayat yang tepat, sehingga riwayat percakapan Alice dan Bob sepenuhnya terpisah.

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

Desain Kunci Redis untuk Riwayat Obrolan

Redis menyimpan pesan setiap sesi sebagai daftar di bawah kunci yang diturunkan dari ID sesi. Gunakan skema kunci terstruktur seperti chat:<app>:<user_id>:<session_id> untuk menghindari bentrokan kunci antar aplikasi dan memungkinkan pemindaian yang efisien berdasarkan pengguna. Tetapkan TTL pada kunci sesi lama untuk mencegah pertumbuhan penyimpanan tanpa batas.

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)

Desain Tabel Riwayat Obrolan PostgreSQL

Untuk persistensi berbasis SQL, buat tabel dengan kolom untuk ID sesi, peran pesan, isi, dan stempel waktu. PostgreSQL ideal ketika riwayat obrolan perlu dikueri, diaudit, atau digabungkan dengan data akun pengguna. Paket langchain_postgres menyediakan implementasi siap pakai.

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

PostgresChatMessageHistory di LangChain

Kelas PostgresChatMessageHistory dari langchain_postgres bekerja seperti versi Redis, tetapi menyimpan pesan di basis data PostgreSQL Anda. Teruskan string koneksi dan ID sesi, lalu kelas ini akan menangani pembuatan tabel dan serialisasi pesan secara otomatis.

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

Memuat Sesi Sebelumnya untuk Pengguna yang Kembali

Saat pengguna kembali ke aplikasi Anda setelah menutupnya, Anda dapat memulihkan sesi terakhir mereka dengan memuat riwayat dari Redis atau PostgreSQL. Tampilkan ringkasan tentang posisi terakhir mereka, atau lanjutkan dengan lancar dengan menyisipkan riwayat tersimpan ke dalam perintah berikutnya.

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

Memangkas Riwayat di Basis Data

Sesi yang berlangsung lama dapat mengumpulkan ribuan pesan. Terapkan strategi pemangkasan yang menghapus pesan yang lebih lama dari batas waktu tertentu atau hanya menyimpan N pesan terakhir di basis data. Dengan demikian, pengambilan tetap cepat dan jendela konteks tidak meluap saat Anda memuat riwayat.

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

Memilih antara Redis dan PostgreSQL

Kedua backend siap digunakan dalam produksi, tetapi memiliki keunggulan yang berbeda. Redis menawarkan pembacaan dalam waktu kurang dari satu milidetik, sehingga ideal untuk obrolan waktu nyata yang sangat mementingkan latensi. PostgreSQL menawarkan kemampuan kueri SQL penuh, transaksi ACID, dan integrasi yang mudah dengan basis data pengguna yang sudah ada untuk analitik dan audit. Banyak sistem produksi menggunakan Redis sebagai singgahan utama dan PostgreSQL untuk pengarsipan yang tahan lama.

Keamanan: Mengisolasi Riwayat Multi-Penyewa

Dalam aplikasi multi-penyewa, Anda harus memastikan bahwa pengguna tidak dapat mengakses riwayat satu sama lain. Selalu sertakan ID pengguna dalam kunci sesi, validasikan bahwa ID sesi dimiliki oleh pengguna yang telah diautentikasi sebelum memuat riwayat, dan jangan pernah mengekspos kunci sesi mentah dalam URL atau kuki sisi klien.

  • Kunci yang baik: chat:app1:user:42:session:abc
  • Kunci yang buruk: session:abc (mudah ditebak, tanpa cakupan pengguna)

Pemeriksaan Singkat

Uji pemahaman Anda tentang persistensi riwayat obrolan secara eksternal.

Ringkasan Pelajaran

Dalam pelajaran ini, Anda mempelajari bahwa: RedisChatMessageHistory menyimpan riwayat obrolan di Redis dengan kunci per sesi, PostgresChatMessageHistory menyediakan penyimpanan tahan lama yang dapat dikueri melalui SQL, dan RunnableWithMessageHistory menghubungkan backend apa pun ke rantai Anda melalui pabrik session_id. Selanjutnya, kita akan membahas kerangka kerja ReAct untuk membangun agen yang dapat bernalar dan bertindak.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Menyimpan Riwayat Obrolan di Redis dan PostgreSQL” gratis?

Ya — teks lengkap “Menyimpan Riwayat Obrolan di Redis dan PostgreSQL” 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 “Menyimpan Riwayat Obrolan di Redis dan PostgreSQL”?

Simpan riwayat percakapan secara eksternal menggunakan RedisChatMessageHistory dan PostgresChatMessageHistory agar memori tetap ada setelah aplikasi dimulai ulang dan dapat diskalakan di beberapa ins… 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 “Menyimpan Riwayat Obrolan di Redis dan PostgreSQL” 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 LLM Tanpa Status Membutuhkan Memori Eksternal
  2. Memori Penyangga dan Jendela
  3. Memori Ringkasan dan Pemotongan yang Sadar Token
  4. Menyimpan Riwayat Obrolan di Redis dan PostgreSQL
← Kembali ke AI Engineering Academy