{"id":415,"date":"2025-12-26T13:29:31","date_gmt":"2025-12-26T12:29:31","guid":{"rendered":"http:\/\/www.kristedal.se\/?p=415"},"modified":"2025-12-29T13:07:58","modified_gmt":"2025-12-29T12:07:58","slug":"att-bygga-ett-llm-minne","status":"publish","type":"post","link":"https:\/\/www.kristedal.se\/?p=415","title":{"rendered":"Att bygga ett LLM minne"},"content":{"rendered":"\n<p>Att bygga ett personligt minne runt en lokal LLM<br>\u2013 eller varf\u00f6r arkitektur sl\u00e5r r\u00e5 GPU-kraft<br><br>Jag b\u00f6rjade inte med en tydlig m\u00e5lbild. Det fanns inget \u201dnu ska jag bygga ett minnessystem f\u00f6r LLM:er\u201d. Det b\u00f6rjade snarare med en liten irritation: k\u00e4nslan av att varje ny chatt b\u00f6rjade fr\u00e5n noll, trots att jag sj\u00e4lv t\u00e4nkte iterativt, l\u00e5ngsamt och ofta i sidosp\u00e5r.<br><br>Jag anv\u00e4nder lokala modeller via Ollama och Open WebUI. I praktiken inneb\u00e4r det att jag pendlar mellan tv\u00e5 system: en kraftfull speldator med GPU och en betydligt svagare garageserver som fallback via Nginx. Det i sig s\u00e4tter gr\u00e4nser. Allt som \u00e4r f\u00f6r tungt i prompten k\u00e4nns direkt n\u00e4r man hamnar p\u00e5 CPU.<br><br>Det var d\u00e4r min fr\u00e5ga uppstod:<br><br>Hur f\u00e5r man kontinuitet i AI?<br><br>Insikten blev att minne inte \u00e4r samma sak som kontext. <br><br>Det \u00e4r l\u00e4tt att t\u00e4nka att l\u00f6sningen \u00e4r \u201dst\u00f6rre kontextf\u00f6nster\u201d. Mer tokens, mer historik. Men i praktiken \u00e4r det precis tv\u00e4rtom, s\u00e4rskilt p\u00e5 en CPU (eller har svagt grafikkort)<br><br>\u2013 stora prompts \u00e4r dyra f\u00f6r prestandan<br>\u2013 Cache v\u00e4xer  <br>\u2013 varje genererad token blir l\u00e5ngsammare  <br><br>S\u00e5 i st\u00e4llet f\u00f6r att f\u00f6rs\u00f6ka f\u00e5 modellen att minnas allt, t\u00e4nkte jag:<br><br>Vad \u00e4r det minsta m\u00f6jliga som beh\u00f6ver f\u00f6lja med f\u00f6r att samtal\/chat ska k\u00e4nnas sammanh\u00e4ngande?<br><br>Svaret blev inte l\u00e5ng historik. Det blev ett specialicerat minne.<br><br>Minne som ett externt system utanf\u00f6r modellen. <br><br>Det avg\u00f6rande var att separera tre saker som ofta blandas ihop:<br><br>1. Chatthistorik \u2013 allt som sagts (f\u00f6r insyn och backup)  <br>2. L\u00e5ngtidsminne \u2013 s\u00e5dant som b\u00f6r kunna \u00e5terkallas senare  <br>3. Aktuell kontext \u2013 det modellen faktiskt ser just nu  <br><br>N\u00e4r man g\u00f6r den separationen blir det uppenbart att modellen inte ska se hela historiken. Den ska se ett urval av endast relevant bakgrund.<br><br>Det \u00e4r exakt d\u00e4r embeddings och RAG h\u00f6r hemma.<br><br>Men automatiskt minne har en nedsida.<br><br>Det problemet d\u00f6k upp snabbt. Om allt som l\u00e5ter viktigt automatiskt sparas, blir minnet snabbt r\u00f6rigt. \u00c4nnu v\u00e4rre fel saker f\u00e5r f\u00f6r h\u00f6g prioritet.<br><br>Jag ville inte ville ha ett \u201dsmart\u201d system som gissar vad som \u00e4r viktigt. Jag ville ha ett f\u00f6ruts\u00e4gbart system.<br><br>L\u00f6sningen blev till vissa delar manuell, men en l\u00e4ttviktig m\u00e4rkning\/tagning.<br><br>Mark\u00f6rer som speglar hur du t\u00e4nker.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"http:\/\/www.kristedal.se\/wp-content\/uploads\/2025\/12\/Screenshot_20251229_130649-1024x554.jpg\" alt=\"\" class=\"wp-image-428\"\/><\/figure>\n\n\n\n<p><br><br>Efter en hel del f\u00f6renklingar landade jag i tre begrepp som t\u00e4cker n\u00e4stan allt jag bryr mig om:<br><br>KRAV \u2013 saker som inte f\u00e5r brytas  <br>BESLUT \u2013 val som redan \u00e4r gjorda  <br>VIKTIGT \u2013 bakgrund och preferenser  <br><br>Och f\u00f6r att det ska fungera i praktiken (\u00e4ven p\u00e5 mobil) beh\u00f6vde syntaxen vara trivial. Resultatet:<br>KOM IH\u00c5G KRAV. <br>KOM IH\u00c5G BESLUT.   <br>KOM IH\u00c5G.<br><br>Inga hakparenteser. Inga kolon. Bara en punkt.<br><br>Det l\u00e5ter banalt \u2013 men det gjorde systemet mindre komplext och mer skalbart. <br><br>Parallellt ins\u00e5g jag att allt inte ska ligga i samma mentala l\u00e5da. N\u00e4r man jobbar med lokal LLM-arkitektur t\u00e4nker jag annorlunda \u00e4n n\u00e4r jag t\u00e4nker p\u00e5 n\u00e4tverk, eller p\u00e5 skrivprojekt eller spelutveckling (lore).<br><br>S\u00e5 projekt introducerades, men med en viktig begr\u00e4nsning:<br><br>Projekt \u00e4r till f\u00f6r mig som person, inte f\u00f6r operativa agenter.<br><br>N\u00e4r jag senare b\u00f6rjade t\u00e4nka p\u00e5 LLM-styrda playerbots i AzerothCore blev det tydligt att de inte h\u00f6r hemma h\u00e4r alls. De ska leva i en egen instans, p\u00e5 en annan port, med egen minnespolicy.<br><br>Den insikten gjorde arkitekturen renare.<br><br>Det fanns ett v\u00e4gval: optimera olika profiler f\u00f6r GPU och CPU, eller k\u00f6ra samma \u00f6verallt.<br><br>Jag valde medvetet en kompromiss:<br>\u2013 ett minnesblock runt 400 tokens  <br>\u2013 Top-K = 3  <br>\u2013 checkpoints som sammanfattar i st\u00e4llet f\u00f6r att ackumulera  <br><br>Det g\u00f6r systemet tillr\u00e4ckligt snabbt p\u00e5 garageservern, tillr\u00e4ckligt smart p\u00e5 speldatorn och enkelt att drifta.<br><br>Slutresultatet<br><br>Det som b\u00f6rjade som en irritation slutade i en arkitektur som:<br><br>\u2013 ger l\u00e5ng kontinuitet utan stora prompts  <br>\u2013 fungerar b\u00e5de med och utan GPU  <br>\u2013 \u00e4r l\u00e4tt att replikera till nya instanser  <br>\u2013 inte f\u00f6rs\u00f6ker vara smartare \u00e4n anv\u00e4ndaren  <\/p>\n\n\n\n<p><br>Vad har du f\u00f6r tankar kring AI modeller och hur de kan visareutvecklas?<br><\/p>\n\n\n\n\n\n\n","protected":false},"excerpt":{"rendered":"<p>Att bygga ett personligt minne runt en lokal LLM\u2013 eller varf\u00f6r arkitektur sl\u00e5r r\u00e5 GPU-kraft Jag b\u00f6rjade inte med en tydlig m\u00e5lbild. Det fanns inget \u201dnu ska jag bygga ett minnessystem f\u00f6r LLM:er\u201d. Det b\u00f6rjade snarare med en liten irritation: k\u00e4nslan av att varje ny chatt b\u00f6rjade fr\u00e5n noll, trots att jag sj\u00e4lv t\u00e4nkte iterativt, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-415","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.kristedal.se\/index.php?rest_route=\/wp\/v2\/posts\/415","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kristedal.se\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kristedal.se\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kristedal.se\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kristedal.se\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=415"}],"version-history":[{"count":6,"href":"https:\/\/www.kristedal.se\/index.php?rest_route=\/wp\/v2\/posts\/415\/revisions"}],"predecessor-version":[{"id":429,"href":"https:\/\/www.kristedal.se\/index.php?rest_route=\/wp\/v2\/posts\/415\/revisions\/429"}],"wp:attachment":[{"href":"https:\/\/www.kristedal.se\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=415"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kristedal.se\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=415"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kristedal.se\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=415"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}