RunnableWithMessageHistory & Memoria Conversațională în LangChain & LangGraph

Înfășoară orice lanț LCEL pentru a gestiona automat istoricul conversației pe sesiuni de utilizatori (session_id), citind și salvând replicile la fiecare apel.

Sintaxă & invocare Python
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_core.chat_history import InMemoryChatMessageHistory

chain_cu_memorie = RunnableWithMessageHistory(
    chain, get_session_history,
    input_messages_key='input', history_messages_key='istoric'
)

Descriere & Utilizare

Modelele LLM sunt complet stateless (fără memorie): dacă îi spui ‘Mă numesc Andrei’ și în apelul următor îl întrebi ‘Cum mă cheamă?’, nu va ști răspunsul dacă nu îi retrimiți toată conversația anterioară.

RunnableWithMessageHistory automatizează această gestionare pentru aplicații multi-utilizator: înainte de a apela modelul, încarcă mesajele asociate unui session_id și le injectează în MessagesPlaceholder('istoric'). După ce modelul răspunde, salvează automat atât întrebarea utilizatorului, cât și răspunsul AI în istoric.

Pentru teste locale se folosește InMemoryChatMessageHistory, iar în producție se conectează la Redis, PostgreSQL sau MongoDB.

Cum să o reții ușor

💡 Ca un dosar medical la recepția unei clinici: când pacientul își spune CNP-ul (`session_id`), asistenta îi scoate fișa cu toate vizitele trecute, i-o dă medicului, iar la plecare notează în dosar noua consultație.

Opțiuni și parametri tehnici

  • Interceptează apelul .invoke() și citește parametrul config={'configurable': {'session_id': '...'}}.
  • Apelează funcția callback get_session_history(session_id) pentru a obține depozitul de mesaje.
  • Populează cheia de istoric și atașează noile mesaje HumanMessage și AIMessage la finalul execuției.

Exemple practice și cazuri de utilizare

  • Funcție de stocare în RAM: store = {}
    def get_session_history(sid: str):
    if sid not in store: store[sid] = InMemoryChatMessageHistory()
    return store[sid]
  • Apel cu sesiune: chain_cu_memorie.invoke({'input': 'Salut, sunt Alex'}, config={'configurable': {'session_id': 'user_42'}})

Sfaturi de configurare & capcane

Dacă dezvolți aplicații noi complexe sau agenți în 2025+, echipa LangChain recomandă utilizarea LangGraph cu un MemorySaver checkpointer în locul RunnableWithMessageHistory, deoarece oferă un control mult mai fin asupra stării.

Comenzi și ghiduri înrudite