E· Universitetminnessystem· ca 60 min· utvecklande· verifierad 2026-09-20
Arbetsminne: kontext, sammanfattning, fönster
Kunna hantera lång dialog med sammanfattning och glidande fönster.
Förkunskaper
Intuition
Ett samtal växer tills kontextfönstret tar slut. Fyra strategier, som kan kombineras:
| Strategi | Hur | Tappar |
|---|---|---|
| Glidande fönster | behåll de N senaste meddelandena | allt äldre, abrupt |
| Sammanfattning | komprimera äldre delar till en sammanfattning | detaljer och exakta formuleringar |
| Retrieval över historiken | hämta relevanta äldre meddelanden vid behov | sammanhanget mellan dem |
| Strukturerat tillstånd | extrahera fakta till en liten JSON som alltid följer med | allt som inte extraherats |
Det som aldrig får tappas hålls utanför fönstret: systemprompten, användarens uttalade preferenser, och pågående uppgiftstillstånd. Lägg dem i en fast del av prompten — inte i historiken.
Kod
class Arbetsminne:
def __init__(self, llm, tok, tak_tokens=6000, behall_senaste=8):
self.llm, self.tok = llm, tok
self.tak, self.behall = tak_tokens, behall_senaste
self.sammanfattning = ""
self.meddelanden: list[dict] = []
self.tillstand: dict = {} # fast, komprimerat, tappas aldrig
def _tokens(self, texter):
return sum(len(self.tok(t)["input_ids"]) for t in texter)
def lagg_till(self, roll, innehall):
self.meddelanden.append({"role": roll, "content": innehall})
self._komprimera_vid_behov()
def _komprimera_vid_behov(self):
texter = [m["content"] for m in self.meddelanden] + [self.sammanfattning]
if self._tokens(texter) <= self.tak:
return
gamla = self.meddelanden[:-self.behall]
if not gamla:
return
self.sammanfattning = self.llm(
"Uppdatera sammanfattningen av samtalet. Behåll beslut, preferenser, öppna frågor "
"och allt användaren bett om. Max 200 ord.\n\n"
f"TIDIGARE: {self.sammanfattning}\n\nNYA MEDDELANDEN:\n" +
"\n".join(f"{m['role']}: {m['content']}" for m in gamla), temperature=0)
self.meddelanden = self.meddelanden[-self.behall:]
def prompt(self, system):
delar = [{"role": "system", "content": system}]
if self.tillstand:
delar.append({"role": "system", "content": f"Aktuellt tillstånd: {self.tillstand}"})
if self.sammanfattning:
delar.append({"role": "system", "content": f"Tidigare i samtalet: {self.sammanfattning}"})
return delar + self.meddelanden
Två saker som ofta går fel: sammanfattningen tappar det användaren uttryckligen bad om (lös med en explicit instruktion om vad som måste bevaras), och komprimeringen sker mitt i ett verktygsanrop (lös med att aldrig klippa mellan ett anrop och dess resultat).
Behärskning innebär
- Hanterar lång dialog inom kontextfönstret
- Väljer mellan glidande fönster, sammanfattning och retrieval
- Bevarar det som inte får tappas
Logga in för att göra övningarna och bygga upp din behärskning.
Källor
- arXiv — MemGPT: Towards LLMs as Operating Systems — arXiv (öppen åtkomst; licens per artikel)
- arXiv — Lost in the Middle: How Language Models Use Long Contexts — arXiv (öppen åtkomst; licens per artikel)