Gå til indholdet

Tal med en LLM via kode – nu med hukommelse

Michell Cronberg

Info

Denne artikel bygger videre på Tal med en LLM via kode og viser, hvordan du kan føre en sammenhængende samtale – hvor modellen husker, hvad I allerede har talt om.

Det er rigtig smart at kunne få et svar fra en LLM i terminalen – men endnu smartere er det, når du kan føre en samtale med den. Det betyder, at du kan stille opfølgende spørgsmål og få svar, der bygger videre på tidligere svar. Men det sker ikke automatisk - en LLM har ikke hukommelse. Den kan ikke huske, hvad I talte om før, medmindre du fortæller den det.

Her er et eksempel på, hvordan det kan se ud uden hukommelse:

Spørgsmål til modellen:
Hvad er tyngdekraft?
Svar fra modellen:
Tyngdekraft er den kraft, som trækker alle ting mod Jorden...
Spørgsmål til modellen:
Hvad på månen?
Svar fra modellen:
Jeg forstår ikke spørgsmålet. Kan du uddybe?

Med hukommelse bliver samtalen mere naturlig, fordi modellen får hele historikken med.

Eksempel:

Spørgsmål til modellen:
Hvad er tyngdekraft?
Svar fra modellen:
Tyngdekraft er den kraft, som trækker alle ting mod Jorden...
Spørgsmål til modellen:
Hvad på månen?
Svar fra modellen:
På Månen er tyngdekraften cirka 1/6 af Jordens, så du vejer mindre...

Så de tidligere svar er ikke glemt, og modellen kan give et relevant svar på det nye spørgsmål.

Det er ret simpelt at implementere hukommelse i din kode, og det kræver ikke, at du bruger en database eller noget avanceret. Det handler om at gemme samtalens historik i en liste, som du så sender med hver gang, du spørger modellen. Der er dog nogle udfordringer:

  • Modellens hukommelse er begrænset. Hvis samtalen bliver meget lang, mister modellen kontekst fra starten.
  • Du skal selv styre hukommelsen. Det giver fleksibilitet, men kræver lidt ekstra kodearbejde.
  • Gem konteksten, hvis du vil kunne fortsætte samtalen senere. Du kan fx gemme messages i en fil.

Her er eksemplet fra tidligere, udbygget med hukommelse.

Først lidt praktisk

Vi bruger stadig Python og OpenRouter, men denne gang:

  • Gemmer vi din API-nøgle i en .env-fil (så den ikke ligger i koden)
  • Udbygger samtalen løbende med en messages-liste
  • Gør det muligt at afslutte med :quit

Installer først Python-pakken python-dotenv:

pip install python-dotenv

Opret derefter en .env-fil i samme mappe som din Python-kode:

OPENROUTER_API_KEY=sk-abc123...din nøgle her...
  • Gem følgende som talk_to_llm_with_memory.py:
import requests
import os
from dotenv import load_dotenv

load_dotenv()
api_key = os.getenv("OPENROUTER_API_KEY")

url = "https://openrouter.ai/api/v1/chat/completions"
headers = {
    "Authorization": f"Bearer {api_key}",
    "Content-Type": "application/json"
}

system_prompt = "Du er en erfaren fysiklærer. Svar kort og præcist, målrettet børn fra 10-15 år."

messages = [
    { "role": "system", "content": system_prompt }
]

print("Jeg er en erfaren fysiklærer og kan hjælpe dig med at forstå verden omkring dig.")
print("Skriv ':quit' for at afslutte.\n")

while True:
    spm = input("Hvad vil du spørge om? ")

    if spm.strip().lower() == ":quit":
        print("Tak for samtalen!")
        break

    messages.append({ "role": "user", "content": spm })

    response = requests.post(url, headers=headers, json={
        "model": "google/gemma-3-27b-it:free",
        "messages": messages
    })

    svar = response.json()["choices"][0]["message"]["content"]
    print("\nSvar fra modellen:\n", svar, "\n")

    messages.append({ "role": "assistant", "content": svar })
  • Kør koden:
python talk_to_llm_with_memory.py

Forklaring af koden

Husk at bruge din favorit-chatbot til at stille spørgsmål om koden, hvis du er i tvivl. Det gælder også, hvis du hellere vil kode i et andet sprog som JavaScript, C# eller Go.

God fornøjelse!