Sammanfattningsminne och tokenmedveten trunkering
Använd ConversationSummaryMemory för att automatiskt sammanfatta äldre turer och hålla konversationen koncentrerad samtidigt som viktiga fakta från tidigare i samtalet bevaras.
Sammanfattningsminne och tokenmedveten trunkering är en gratis lektion i AI Engineering Academy på CoddyKit. Detta är lektion 3 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för AI Engineering Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i AI Engineering Academy innehåller totalt 4 lektioner.
Tokenkostnaden för hela historiken
Conversation Buffer Memory behåller alla meddelanden som någonsin utväxlats, vilket snabbt förbrukar ert kontextfönster. En konversation på 100 turer kan använda 20 000 tokens enbart för historiken, vilket lämnar lite utrymme för själva svaret. Sammanfattningsminne löser detta genom att ersätta äldre turer med en komprimerad sammanfattning.
Så fungerar sammanfattningsminne
När det totala antalet tokens överskrider ett tröskelvärde skickar ConversationSummaryMemory de äldsta konversationsturerna till en LLM och ber den sammanfatta de viktigaste punkterna. De fullständiga turerna tas bort och ersätts med denna kompakta sammanfattning. Framtida turer läggs till ovanpå sammanfattningen.
- Äldre turer: ersätts av en sammanfattning
- Nya turer: behålls ordagrant
- Resultat: meningsfull komprimering med minimal informationsförlust
LangChain ConversationSummaryMemory
LangChain tillhandahåller ConversationSummaryMemory, som automatiskt sammanfattar när bufferten blir för stor. Ni skickar en LLM till minnesobjektet så att det kan anropa modellen för att generera sammanfattningar vid behov.
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({}))Sammanfattande buffertminne: Det bästa av två världar
ConversationSummaryBufferMemory är en hybridstrategi: den behåller de senaste turerna ordagrant för hög precision och sammanfattar endast de äldre turer som överskrider en max_token_limit. Ni får då exakt återgivning av den senaste kontexten och komprimerad återgivning av äldre kontext.
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)Räkna tokens före trunkering
För att kunna fatta smarta beslut om trunkering behöver ni veta hur många tokens era meddelanden förbrukar. Biblioteket tiktoken låter er räkna tokens för valfri OpenAI-modell. Därmed kan ni implementera tokenmedveten trunkering som strikt håller sig under en 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))Manuell tokenmedveten trunkering
Ibland vill ni ha full kontroll över trunkeringen utan LangChains minnesklasser. Ett enkelt tillvägagångssätt är att behålla alla meddelanden och sedan ta bort de äldsta meddelandena som inte är systemmeddelanden, ett i taget, tills det totala antalet tokens ryms inom er 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 resultGenerera sammanfattningsprompten
När ni bygger ett eget sammanfattningsminne utformar ni en prompt som ber LLM:en att destillera de viktigaste fakta. Prompten bör instruera modellen att fånga användarpreferenser, namngivna entiteter och olösta frågor — de fakta som sannolikt är viktigast i framtida turer.
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.contentIntegrera sammanfattningen i systemprompten
När ni har en sammanfattning infogar ni den i systemprompten, så att LLM:en alltid har kontext om konversationshistoriken. Placera sammanfattningen som ett kort kontextblock före de huvudsakliga instruktionerna för personan.
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 messagesUtlös sammanfattning automatiskt
Ett vanligt mönster är att utlösa sammanfattning när konversationen överskrider ett tokentröskelvärde — till exempel när den löpande historiken passerar 2 000 tokens. Då sammanfattar ni allt utom de två senaste turerna och ersätter det med sammanfattningen.
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 replyBevara namngivna entiteter i sammanfattningar
Sammanfattningens kvalitet beror i hög grad på sammanfattningsprompten. Om användare nämner sitt namn, sin plats, sina preferenser eller sina tidsfrister måste prompten uttryckligen instruera modellen att ta med dessa fakta. Generella sammanfattningar utelämnar ofta egennamn som är viktigast för personalisering.
- Inkludera: namn, datum, tekniska beslut, öppna frågor
- Utelämna: utfyllnad, bekräftelser, upprepade artighetsfraser
Avvägningar: sammanfattnings- kontra fönsterminne
Valet mellan sammanfattnings- och fönsterminne beror på ert användningsfall. Fönsterminne bevarar den exakta formuleringen, vilket är viktigt för precisa återgivningar men slösar tokens på irrelevant kontext. Sammanfattningsminne komprimerar kraftigt men medför ett extra LLM-anrop och kan förlora detaljer i ovanliga fall. De flesta chattbotar i produktion använder en hybrid: de senaste turerna exakt återgivna tillsammans med en rullande sammanfattning av äldre turer.
Snabbkontroll
Testa er förståelse av sammanfattningsminne och tokenmedveten trunkering.
Sammanfattning av lektionen
I den här lektionen har ni lärt er att: sammanfattningsminne komprimerar äldre turer genom ett LLM-anrop, ConversationSummaryBufferMemory kombinerar exakta, nya turer med sammanfattade äldre turer och tiktoken möjliggör tokenmedveten trunkering så att konversationer håller sig inom budgeten. Härnäst utforskar vi hur chatthistorik sparas i Redis och PostgreSQL för beständig, skalbar lagring.
Lär dig Python med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 30
- Lektioner
- 120
Vanliga frågor
Är lektionen ”Sammanfattningsminne och tokenmedveten trunkering” gratis?
Ja – hela texten till ”Sammanfattningsminne och tokenmedveten trunkering” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i AI Engineering Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i AI Engineering Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Sammanfattningsminne och tokenmedveten trunkering”?
Använd ConversationSummaryMemory för att automatiskt sammanfatta äldre turer och hålla konversationen koncentrerad samtidigt som viktiga fakta från tidigare i samtalet bevaras. Ni övar på AI Engineering Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig AI Engineering Academy?
Du behöver inga förkunskaper. Utbildningen i AI Engineering Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.
Hur lång tid tar lektionen ”Sammanfattningsminne och tokenmedveten trunkering”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här AI Engineering Academy-lektionen?
Ja. Varje AI Engineering Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Varför statslösa LLM:er behöver externt minne
- Buffert- och fönsterminne
- Sammanfattningsminne och tokenmedveten trunkering
- Lagra chatthistorik i Redis och PostgreSQL