Memoria basata sui riepiloghi e troncamento consapevole dei token
Utilizzerà ConversationSummaryMemory per riepilogare automaticamente i turni più vecchi, mantenendo la conversazione concisa e preservando i fatti chiave menzionati in precedenza dall'utente.
Memoria basata sui riepiloghi e troncamento consapevole dei token è una lezione AI Engineering Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento AI Engineering Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso AI Engineering Academy include 4 lezioni in totale.
Il costo in token della cronologia completa
La Conversation Buffer Memory conserva ogni messaggio scambiato, consumando rapidamente la finestra di contesto. Una conversazione di 100 scambi potrebbe utilizzare 20.000 token solo per la cronologia, lasciando poco spazio alla risposta effettiva. La Summary Memory risolve il problema sostituendo gli scambi meno recenti con un riepilogo compresso.
Come funziona la memoria con riepilogo
Quando il numero totale di token supera una soglia, ConversationSummaryMemory invia gli scambi meno recenti della conversazione a un LLM e gli chiede di riepilogare i punti chiave. Gli scambi completi vengono eliminati e sostituiti da questo riepilogo compatto. Gli scambi successivi si accumulano sopra il riepilogo.
- Scambi meno recenti: sostituiti dal riepilogo
- Scambi recenti: conservati integralmente
- Risultato complessivo: compressione significativa con una perdita minima di informazioni
ConversationSummaryMemory di LangChain
LangChain fornisce ConversationSummaryMemory, che riepiloga automaticamente la conversazione quando il buffer diventa troppo grande. Si passa un LLM all'oggetto di memoria, così può chiamare il modello per generare riepiloghi quando necessario.
from langchain.memory import ConversationSummaryMemory
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model='gpt-4o-mini')
memory = ConversationSummaryMemory(
llm=llm,
return_messages=True
)
# Add messages manually
memory.save_context(
{'input': 'My name is Alice and I am building a RAG system.'},
{'output': 'Great, I can help you build a RAG system, Alice.'}
)
print(memory.load_memory_variables({}))Memoria con buffer e riepilogo: il meglio di entrambe
ConversationSummaryBufferMemory è un approccio ibrido: conserva integralmente gli scambi più recenti per garantire precisione e riepiloga solo quelli meno recenti che superano un max_token_limit. In questo modo offre un recupero esatto del contesto recente e un recupero compresso del contesto precedente.
from langchain.memory import ConversationSummaryBufferMemory
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model='gpt-4o-mini')
memory = ConversationSummaryBufferMemory(
llm=llm,
max_token_limit=500, # Summarize when older turns exceed 500 tokens
return_messages=True
)
# As the conversation grows, old turns get summarized automatically
print('Moving summary:', memory.moving_summary_buffer)Conteggio dei token prima del troncamento
Per prendere decisioni intelligenti sul troncamento, è necessario sapere quanti token consumano i messaggi. La libreria tiktoken consente di contare i token per qualsiasi modello OpenAI. In questo modo può implementare un troncamento consapevole dei token che rimane rigorosamente entro un budget.
import tiktoken
def count_tokens(messages: list, model: str = 'gpt-4o') -> int:
encoding = tiktoken.encoding_for_model(model)
total = 0
for msg in messages:
# Each message has overhead tokens for role framing
total += 4
total += len(encoding.encode(msg.get('content', '')))
total += 2 # Reply primer
return total
messages = [
{'role': 'user', 'content': 'Explain RAG to me.'},
{'role': 'assistant', 'content': 'RAG stands for Retrieval-Augmented Generation...'}
]
print('Token count:', count_tokens(messages))Troncamento manuale consapevole dei token
A volte è necessario avere il pieno controllo sul troncamento senza utilizzare le classi di memoria di LangChain. Un approccio semplice consiste nel conservare tutti i messaggi e poi rimuovere uno alla volta i messaggi meno recenti che non siano di sistema finché il conteggio totale dei token rientra nel budget.
def truncate_to_budget(messages: list, budget: int, model: str = 'gpt-4o') -> list:
'''Remove oldest non-system messages until under budget.'''
import tiktoken
encoding = tiktoken.encoding_for_model(model)
def token_count(msgs):
total = 2
for m in msgs:
total += 4 + len(encoding.encode(m.get('content', '')))
return total
result = list(messages)
while token_count(result) > budget and len(result) > 1:
# Never remove the system prompt at index 0
if result[0]['role'] == 'system':
del result[1]
else:
del result[0]
return resultGenerazione del prompt per il riepilogo
Quando costruisce una memoria con riepilogo personalizzata, prepari un prompt che chieda all'LLM di estrarre i fatti principali. Il prompt deve indicare al modello di acquisire le preferenze dell'utente, le entità nominate e le domande ancora irrisolte: i fatti più probabilmente rilevanti negli scambi futuri.
from openai import OpenAI
client = OpenAI()
def summarize_history(old_summary: str, new_turns: list) -> str:
turns_text = '\n'.join(
f'{m["role"].capitalize()}: {m["content"]}' for m in new_turns
)
prompt = f'''Current summary:\n{old_summary}\n\nNew conversation turns:\n{turns_text}\n\nWrite an updated summary that captures key facts, user preferences, and open questions.'''
resp = client.chat.completions.create(
model='gpt-4o-mini',
messages=[{'role': 'user', 'content': prompt}]
)
return resp.choices[0].message.contentIntegrazione del riepilogo nel prompt di sistema
Una volta ottenuto un riepilogo, lo inserisca nel prompt di sistema, così l'LLM avrà sempre il contesto della cronologia della conversazione. Anteprima il riepilogo come breve blocco di contesto, prima delle istruzioni principali sulla personalità.
def build_messages_with_summary(summary: str, recent_turns: list, user_input: str) -> list:
system_content = (
'You are a helpful AI assistant.'
+ ('\n\n[Conversation summary]\n' + summary if summary else '')
)
messages = [{'role': 'system', 'content': system_content}]
messages.extend(recent_turns)
messages.append({'role': 'user', 'content': user_input})
return messagesAttivazione automatica del riepilogo
Un approccio comune consiste nell'attivare il riepilogo quando la conversazione supera una soglia di token, ad esempio quando la cronologia accumulata oltrepassa i 2.000 token. A quel punto, riepiloghi tutti gli scambi tranne gli ultimi due e li sostituisca con il riepilogo.
class SummaryBufferChat:
def __init__(self, max_tokens=2000):
self.summary = ''
self.recent_turns = []
self.max_tokens = max_tokens
def chat(self, user_message: str) -> str:
from openai import OpenAI
client = OpenAI()
messages = build_messages_with_summary(self.summary, self.recent_turns, user_message)
resp = client.chat.completions.create(model='gpt-4o', messages=messages)
reply = resp.choices[0].message.content
self.recent_turns.append({'role': 'user', 'content': user_message})
self.recent_turns.append({'role': 'assistant', 'content': reply})
if count_tokens(self.recent_turns) > self.max_tokens:
to_summarize = self.recent_turns[:-2]
self.recent_turns = self.recent_turns[-2:]
self.summary = summarize_history(self.summary, to_summarize)
return replyConservazione delle entità nominate nei riepiloghi
La qualità del riepilogo dipende fortemente dal prompt di riepilogo. Se gli utenti menzionano il proprio nome, luogo, preferenze o scadenze, il prompt deve indicare esplicitamente al modello di includere questi fatti. I riepiloghi generici spesso omettono i nomi propri più importanti per la personalizzazione.
- Includere: nomi, date, scelte tecniche effettuate, domande aperte
- Escludere: scambi riempitivi, conferme, convenevoli ripetuti
Compromessi: memoria con riepilogo o a finestra
La scelta tra memoria con riepilogo e memoria a finestra dipende dal caso d'uso. La memoria a finestra preserva la formulazione esatta, importante per un recupero preciso, ma spreca token per il contesto irrilevante. La memoria con riepilogo comprime in modo aggressivo, ma introduce una chiamata LLM aggiuntiva e può perdere dettagli di casi limite. La maggior parte dei chatbot di produzione utilizza un approccio ibrido: scambi recenti esatti più un riepilogo progressivo del contesto precedente.
Verifica rapida
Verifichi di aver compreso i concetti della memoria con riepilogo e del troncamento consapevole dei token.
Riepilogo della lezione
In questa lezione ha imparato che: la memoria con riepilogo comprime gli scambi meno recenti tramite una chiamata LLM, ConversationSummaryBufferMemory combina gli scambi recenti esatti con quelli precedenti riepilogati e tiktoken consente un troncamento consapevole dei token per mantenere le conversazioni entro il budget. Ora analizzeremo la persistenza della cronologia delle chat in Redis e PostgreSQL per ottenere un'archiviazione durevole e scalabile.
Domande Frequenti
La lezione «Memoria basata sui riepiloghi e troncamento consapevole dei token» è gratuita?
Sì — il testo completo di «Memoria basata sui riepiloghi e troncamento consapevole dei token» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso AI Engineering Academy, passa a CoddyKit PRO. Il corso AI Engineering Academy include 4 lezioni in totale.
Cosa imparerò in «Memoria basata sui riepiloghi e troncamento consapevole dei token»?
Utilizzerà ConversationSummaryMemory per riepilogare automaticamente i turni più vecchi, mantenendo la conversazione concisa e preservando i fatti chiave menzionati in precedenza dall'utente. Eserciti AI Engineering Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare AI Engineering Academy?
Non è richiesta alcuna esperienza precedente. AI Engineering Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «Memoria basata sui riepiloghi e troncamento consapevole dei token»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione AI Engineering Academy?
Sì. Ogni lezione AI Engineering Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Perché gli LLM stateless hanno bisogno di memoria esterna
- Memoria a buffer e a finestra
- Memoria basata sui riepiloghi e troncamento consapevole dei token
- Persistenza della cronologia chat in Redis e PostgreSQL