Tal med en LLM via kode – nu med hukommelse
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
:
Opret derefter en .env
-fil i samme mappe som din Python-kode:
- 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:
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!