Hoppa till innehållet
AI-grafen
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:

StrategiHurTappar
Glidande fönsterbehåll de N senaste meddelandenaallt äldre, abrupt
Sammanfattningkomprimera äldre delar till en sammanfattningdetaljer och exakta formuleringar
Retrieval över historikenhämta relevanta äldre meddelanden vid behovsammanhanget mellan dem
Strukturerat tillståndextrahera fakta till en liten JSON som alltid följer medallt 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

Alla källor och licenser