SkillOpt
SkillOpt är ett ramverk med öppen källkod från Microsoft Research för att förbättra färdigheter hos AI-agenter utan att ändra språkmodellens parametrar. I stället för traditionell finjustering optimerar SkillOpt ett separat textdokument med instruktioner, regler och arbetsmetoder som agenten använder när den löser uppgifter.
Projektets grundidé är att behandla detta färdighetsdokument som om det vore modellens träningsbara tillstånd. Dokumentet förbättras stegvis genom körningar, analys av resultat, begränsade textredigeringar och validering mot separat testdata.
SkillOpt kan beskrivas som en optimerare i textrymden, på engelska text-space optimizer. Den underliggande språkmodellen förblir fryst under hela processen.
🧠 Grundprincip
En vanlig AI-agent styrs ofta med hjälp av en systemprompt, instruktioner eller manuellt skrivna arbetsflöden. Sådana instruktioner kan vara effektiva, men de är ofta statiska och svåra att förbättra systematiskt.
SkillOpt gör i stället instruktionerna till ett träningsbart dokument. Dokumentet kan exempelvis innehålla:
- regler för hur information ska sökas,
- metoder för att använda verktyg,
- strategier för att kontrollera svar,
- vanliga fel som ska undvikas,
- instruktioner för hur resultat ska formateras,
- domänspecifika arbetsmetoder.
Agenten genomför uppgifter med den aktuella versionen av dokumentet. Resultaten analyseras därefter av en separat optimerarmodell, som föreslår förbättringar.
En föreslagen förändring behålls endast om den ger ett bättre resultat på en separat valideringsmängd.
⚙️ Två modellroller
SkillOpt skiljer mellan två huvudsakliga roller.
🎯 Målmodell
Målmodellen är den AI-modell eller agent som ska förbättras. Den utför uppgifter med hjälp av det aktuella färdighetsdokumentet.
Målmodellens parametrar ändras inte. Det är därför möjligt att förbättra agentens arbetssätt utan att genomföra traditionell modellträning.
🛠️ Optimerarmodell
Optimerarmodellen analyserar målmodellens körningar. Den granskar både lyckade och misslyckade försök och föreslår förändringar i färdighetsdokumentet.
Optimerarmodellen kan bland annat föreslå att:
- en ny regel läggs till,
- en felaktig regel tas bort,
- en otydlig instruktion ersätts,
- liknande regler slås samman,
- en befintlig metod görs mer specifik.
Målmodellen och optimerarmodellen kan vara samma språkmodell, men en starkare optimerarmodell kan i vissa fall ge större förbättringar.
🔄 Optimeringsprocessen
SkillOpts träningsloop består av sex huvudsakliga steg.
1. 🚀 Körning
Målmodellen utför ett antal uppgifter med det aktuella färdighetsdokumentet. Varje körning kan innehålla meddelanden, verktygsanrop, mellanresultat, verifieringsdata och slutpoäng.
Dessa körningar kallas ofta rollouts eller trajektorier.
2. 🔎 Reflektion
Optimerarmodellen analyserar körningarna och försöker identifiera återkommande mönster.
Misslyckade körningar används för att upptäcka:
- saknade instruktioner,
- olämpliga strategier,
- felaktiga antaganden,
- problem med verktygsanvändning,
- bristande kontroll av resultat.
Lyckade körningar kan samtidigt användas för att bevara beteenden som redan fungerar bra.
3. 🧩 Sammanställning
Förslag som behandlar samma problem grupperas och slås samman. Syftet är att minska upprepningar och skapa mer generella instruktioner.
4. 📊 Urval
Förslagen rangordnas efter förväntad nytta. Endast ett begränsat antal redigeringar får genomföras under varje optimeringssteg.
Denna begränsning fungerar som en textbaserad motsvarighet till inlärningshastigheten vid träning av neurala nätverk.
5. ✏️ Uppdatering
De valda ändringarna appliceras på färdighetsdokumentet. Resultatet blir en ny kandidatversion av dokumentet.
SkillOpt stöder huvudsakligen tre typer av förändringar:
- tillägg,
- borttagning,
- ersättning.
6. ✅ Validering
Kandidatversionen testas på en separat valideringsmängd. Den accepteras endast om resultatet förbättras jämfört med den nuvarande versionen.
Denna mekanism kallas en valideringsgrind, på engelska validation gate.
🚧 Valideringsgrinden
Valideringsgrinden är en central del av SkillOpt. Den förhindrar att varje automatiskt genererat förbättringsförslag omedelbart blir permanent.
En kandidat kan få något av följande utfall:
accept_new_best– kandidaten är bättre än både den aktuella och den hittills bästa versionen,accept– kandidaten är bättre än den aktuella versionen men inte bättre än den bästa tidigare versionen,reject– kandidaten förbättrar inte resultatet och förkastas.
SkillOpt kan använda flera typer av utvärderingsmått:
hard– ett diskret mått, exempelvis exakt rätt eller fel,soft– ett kontinuerligt mått som kan ge delpoäng,mixed– en viktad kombination av hårda och mjuka resultat.
Valideringen gör processen mer kontrollerad än metoder där en agent tillåts skriva om sina egna instruktioner utan extern kontroll.
📚 Likheter med maskininlärning
SkillOpt är utformat så att flera begrepp från träning av neurala nätverk får en motsvarighet i textoptimeringen.
| Maskininlärning | SkillOpt |
|---|---|
| Modellparametrar | Färdighetsdokument |
| Framåtriktad beräkning | Agenten genomför uppgifter |
| Förlustfunktion eller poäng | Uppgiftens utvärderare |
| Bakåtpropagering | Reflektion över lyckade och misslyckade körningar |
| Gradienter | Föreslagna textredigeringar |
| Gradientaggregering | Sammanslagning av liknande redigeringar |
| Gradientklippning | Begränsning av antalet redigeringar |
| Inlärningshastighet | Maximalt antal textändringar per steg |
| Optimeringssteg | Ändringar appliceras på dokumentet |
| Valideringsmängd | Separat urvalsmängd för valideringsgrinden |
| Momentum | Långsam uppdatering mellan epoker |
| Metainlärning | Optimerarmodellens minne mellan epoker |
| Epok | En fullständig omgång över träningsuppgifterna |
Liknelsen innebär inte att SkillOpt beräknar matematiska gradienter. Förändringarna föreslås och bedöms i naturligt språk.
🎚️ Textbaserad inlärningshastighet
Parametern optimizer.learning_rate anger hur många redigeringsförslag som högst får appliceras under ett optimeringssteg.
En låg inlärningshastighet ger små och försiktiga förändringar. En hög inlärningshastighet kan ge snabbare utveckling, men ökar risken för att fungerande instruktioner skrivs över.
SkillOpt stöder bland annat följande scheman:
- konstant inlärningshastighet,
- linjärt avtagande inlärningshastighet,
- cosinusbaserat schema,
- autonomt valt redigeringsutrymme.
Begränsade uppdateringar är viktiga eftersom stora omskrivningar kan introducera nya fel samtidigt som tidigare fungerande beteenden försvinner.
🐢 Långsam uppdatering
SkillOpt har en mekanism som kallas långsam uppdatering, på engelska slow update. Den genomförs mellan träningsepoker och fungerar ungefär som momentum i traditionell maskininlärning.
Systemet jämför en äldre och en nyare version av färdigheten på samma uppgifter. Resultaten delas exempelvis in i:
- förbättrade uppgifter,
- försämrade uppgifter,
- kvarstående misslyckanden,
- stabila framgångar.
Optimerarmodellen skapar därefter mer övergripande vägledning. Denna vägledning placeras i en skyddad del av färdighetsdokumentet som vanliga stegvisa redigeringar inte får ändra.
Syftet är att minska risken för att agenten glömmer användbara strategier mellan olika epoker.
🧠 Metafärdighet och minne
SkillOpt kan även skapa en metafärdighet, på engelska meta skill. Detta är ett internt minne för optimerarmodellen.
Metafärdigheten beskriver bland annat:
- vilka typer av ändringar som fungerade,
- vilka ändringar som försämrade resultatet,
- vilka problem som återkommer,
- hur framtida förbättringsförslag bör prioriteras.
Detta minne används under kommande epoker, men inkluderas inte i den färdighet som distribueras till målmodellen.
📄 Det färdiga resultatet
Det viktigaste resultatet från en SkillOpt-körning är normalt filen:
best_skill.md
Filen innehåller den bäst validerade versionen av färdighetsdokumentet. Enligt projektets beskrivning är den vanligtvis relativt kompakt och kan användas direkt tillsammans med målmodellen.
Vid körning i produktion behövs normalt inte:
- optimerarmodellen,
- träningshistoriken,
- reflektionerna,
- förkastade redigeringar,
- metafärdigheten.
Det innebär att optimeringen inte behöver orsaka ytterligare modellanrop när den färdiga färdigheten används. Målmodellen får endast det slutliga dokumentet som instruktion.
🌙 SkillOpt-Sleep
SkillOpt-Sleep är en kompletterande funktion för återkommande förbättring av lokala kodagenter. Funktionen introducerades i SkillOpt version 0.2.0.
Tanken är att agentens tidigare arbetssessioner analyseras under en separat offlineprocess, exempelvis nattetid. Processen omfattar fyra övergripande steg:
- insamling av tidigare erfarenheter,
- identifiering av återkommande mönster,
- återuppspelning av representativa uppgifter,
- konsolidering av validerade färdigheter.
SkillOpt-Sleep kan även använda erfarenhetsåterspelning, syntetiska körningar och långsiktigt minne. Uppdateringar måste fortfarande passera en separat valideringsgrind innan de accepteras.
Funktionen distribueras med kommandoradsverktyget skillopt-sleep och är avsedd för integration med olika agentmiljöer och kodverktyg.
🧪 Inbyggda testmiljöer
SkillOpt levereras med stöd för sex typer av testmiljöer.
| Testmiljö | Typ av uppgift |
|---|---|
| SearchQA | Frågesvar med textsökning |
| DocVQA | Frågesvar baserade på dokument |
| ALFWorld | Textbaserade uppgifter i simulerade miljöer |
| LiveMathematicianBench | Matematiska problemlösningsuppgifter |
| SpreadsheetBench | Kodgenerering och arbete med kalkylblad |
| OfficeQA | Frågor som kräver användning av kontorsverktyg |
Varje testmiljö innehåller normalt komponenter för:
- datainläsning,
- agentkörningar,
- poängsättning,
- reflektion,
- en inledande färdighet.
Egna testmiljöer kan skapas genom att implementera motsvarande komponenter.
🔌 Modell- och agentstöd
SkillOpt har utbytbara modellbakändar och kan anslutas till flera typer av språkmodeller och agentmiljöer.
Projektets dokumentation beskriver bland annat stöd för:
- Azure OpenAI,
- OpenAI-kompatibla gränssnitt,
- Anthropic Claude,
- lokala Qwen-modeller via vLLM,
- Codex-baserade exekveringsmiljöer,
- Claude Code.
Version 0.2.0 utökade även projektet med integrationsskal för fler agentverktyg.
Optimerarmodellen och målmodellen kan använda olika leverantörer, modeller eller tekniska bakändar.
📈 Rapporterade resultat
Enligt projektets forskningsrapport utvärderades SkillOpt med:
- sex testmiljöer,
- sju målmodeller,
- flera exekveringsmiljöer,
- både direkta chattkörningar och agentbaserade arbetsflöden.
Microsofts projektsida uppger att SkillOpt nådde bäst eller delat bäst resultat i samtliga 52 utvärderade kombinationer av modell, testmiljö och körmiljö.
För GPT-5.5 rapporteras en genomsnittlig förbättring på 23,5 procentenheter jämfört med körning utan färdighet i direkt chatt. Projektet rapporterar även förbättringar i agentmiljöer baserade på Codex och Claude Code.
Resultaten bör tolkas utifrån de modeller, datauppdelningar, poängsystem och konfigurationer som användes i studien. De innebär inte att samma förbättring automatiskt uppstår för alla typer av agenter och uppgifter.
🔁 Överföring mellan modeller och miljöer
En viktig egenskap hos SkillOpt är att den färdiga textfärdigheten kan återanvändas.
Projektet har undersökt överföring:
- mellan olika modellstorlekar,
- mellan olika agentramverk,
- mellan närliggande testmiljöer,
- från en träningsmiljö till en annan körmiljö.
Eftersom färdigheten består av naturligt språk är den inte tekniskt bunden till en viss modellparameteruppsättning. Överförbarheten beror dock på att den mottagande modellen kan förstå och följa instruktionerna.
💻 Installation
SkillOpt kräver Python 3.10 eller senare. Paketet kan installeras från Python Package Index:
pip install skillopt
Valfria komponenter kan installeras separat:
pip install "skillopt[alfworld]" pip install "skillopt[webui]" pip install "skillopt[claude]"
För utveckling kan projektet installeras direkt från källkoden:
git clone https://github.com/microsoft/SkillOpt.git cd SkillOpt pip install -e .
Installationen kan kontrolleras med:
python -c "import skillopt; print('SkillOpt ready!')"
Användaren behöver även åtkomstuppgifter till minst en kompatibel modellbakände. Testdata ingår inte fullständigt i paketet och måste i flera fall hämtas eller förberedas separat.
🗂️ Datauppdelning
En egen datamängd delas normalt upp i tre delar:
data/my_split/ ├── train/items.json ├── val/items.json └── test/items.json
Delarna används på följande sätt:
| Mapp | Användning |
|---|---|
train | Körningar som ligger till grund för förbättringsförslag |
val | Valideringsmängd som avgör om en kandidat accepteras |
test | Slutlig utvärdering på tidigare osedda uppgifter |
Det är viktigt att testmängden inte används för att välja redigeringar. Annars finns risk för överanpassning och missvisande resultat.
🏋️ Exempel på träning
En grundläggande träningskörning kan startas med projektets träningsskript:
python scripts/train.py \ --config configs/searchqa/default.yaml \ --split_dir /sökväg/till/searchqa_split \ --azure_openai_endpoint https://din-resurs.openai.azure.com/ \ --optimizer_model DIN_OPTIMERARMODELL \ --target_model DIN_MÅLMODELL
Vanliga inställningar omfattar:
- antal epoker,
- mängden träningsdata,
- batchstorlek,
- minibatchstorlek,
- inlärningshastighet,
- schema för inlärningshastighet,
- antal parallella analysarbetare,
- mått för valideringsgrinden,
- sökväg till inledande färdighetsdokument.
📁 Utdata från en körning
En träningskörning skapar normalt en katalog med följande struktur:
outputs/run_name/ ├── config.json ├── history.json ├── runtime_state.json ├── best_skill.md ├── skills/ ├── steps/ ├── slow_update/ └── meta_skill/
Filerna innehåller bland annat:
- fullständig körningskonfiguration,
- träningshistorik,
- återupptagningsinformation,
- den bästa validerade färdigheten,
- mellanversioner av färdighetsdokumentet,
- föreslagna och förkastade ändringar,
- resultat från långsamma uppdateringar,
- optimerarmodellens minne.
SkillOpt sparar tillstånd efter varje avslutat steg. En avbruten körning kan därför normalt fortsätta från den senaste kontrollpunkten.
🖥️ Webbgränssnitt
Projektet innehåller ett valfritt webbgränssnitt för övervakning av körningar. Komponenten bygger på Gradio.
Den installeras och startas med:
pip install "skillopt[webui]" python -m skillopt_webui.app
Webbgränssnittet kan användas för att följa optimeringsprocessen och granska mellanresultat.
🧰 Användningsområden
SkillOpt kan vara användbart när en AI-agent behöver utveckla återanvändbara arbetsmetoder inom ett tydligt avgränsat område.
Exempel på möjliga användningsområden är:
- förbättring av kodagenter,
- dokumentanalys,
- informationssökning,
- matematisk problemlösning,
- automatisering av kalkylblad,
- verktygsanvändande assistenter,
- interna företagsagenter,
- återkommande kvalitetskontroll,
- specialiserade frågesvarssystem.
Metoden passar särskilt bra när uppgifterna kan poängsättas automatiskt eller kontrolleras med en tillförlitlig utvärderare.
⚠️ Begränsningar
SkillOpt löser inte alla problem med AI-agenter.
Viktiga begränsningar är:
- Optimeringen kräver ett relevant och tillförlitligt poängsystem.
- Dålig träningsdata kan leda till dåliga eller alltför snäva instruktioner.
- Små valideringsmängder kan ge instabila beslut.
- Många agentkörningar och modellanrop kan medföra betydande kostnader.
- En förbättring på testuppgifter behöver inte motsvara bättre beteende i verklig användning.
- Färdighetsdokument kan överanpassas till en specifik modell eller testmiljö.
- Automatiskt genererade regler kan innehålla olämpliga eller motsägelsefulla instruktioner.
- Överföring mellan olika modeller fungerar inte nödvändigtvis för alla uppgifter.
- SkillOpt förbättrar instruktioner men förändrar inte modellens grundläggande kunskap eller kapacitet.
Systemet bör därför kombineras med manuell granskning, separata säkerhetstester och tydliga begränsningar för vilka verktyg agenten får använda.
🔐 Säkerhetsaspekter
Ett självförbättrande färdighetsdokument kan påverka hur en agent använder verktyg, hanterar data och fattar beslut. Därför bör optimeringsprocessen omfattas av säkerhetskontroller.
Lämpliga åtgärder omfattar:
- separata säkerhets- och kvalitetsmått,
- granskning av accepterade textändringar,
- versionshantering av färdighetsdokument,
- begränsad åtkomst till känsliga verktyg,
- testning mot manipulativa instruktioner,
- kontroll av att säkerhetsregler inte skrivs över,
- loggning av alla optimeringssteg,
- möjlighet att återgå till en tidigare version.
En förbättrad uppgiftspoäng är inte i sig ett bevis på att agenten blivit säkrare eller mer tillförlitlig.
⚖️ SkillOpt jämfört med andra metoder
| Metod | Vad som förändras | Typiska egenskaper |
|---|---|---|
| Promptutveckling | En manuellt skriven instruktion | Enkel men ofta beroende av manuellt arbete |
| Automatisk promptoptimering | En prompt eller ett mindre antal instruktioner | Kan vara effektiv för avgränsade uppgifter |
| Finjustering | Modellens parametrar | Kan ge djupare anpassning men kräver mer infrastruktur |
| Förstärkningsinlärning | Modellens policy eller parametrar | Kräver belöningssignal och ofta omfattande träning |
| Retrieval-Augmented Generation | Externt informationsunderlag | Tillför kunskap men ändrar inte nödvändigtvis arbetsmetoden |
| SkillOpt | Ett externt färdighetsdokument | Ändrar agentens procedurer utan att ändra modellparametrar |
SkillOpt kan kombineras med flera av dessa metoder. En agent kan exempelvis använda både informationshämtning, verktyg och ett SkillOpt-optimerat färdighetsdokument.
📝 Sammanfattning
SkillOpt är ett Microsoft-projekt för systematisk optimering av AI-agenters instruktioner och arbetsmetoder. I stället för att träna om språkmodellen förbättrar systemet ett externt dokument i naturligt språk.
Processen bygger på:
- upprepade agentkörningar,
- analys av lyckade och misslyckade försök,
- begränsade textredigeringar,
- separat validering,
- minne mellan träningsepoker,
- export av en kompakt och återanvändbar färdighet.
Den viktigaste skillnaden mot okontrollerad självrevidering är att varje kandidatförändring prövas innan den accepteras. SkillOpt representerar därmed ett försök att överföra principer från maskininlärningens optimeringsprocesser till instruktioner skrivna i naturligt språk.
🔍 Mer information
Sök efter detta ämne på ...
Artiklar: