AI-avtal på esignering.se

Marcus Olsson,

Lanserade här i dagarna möjligheten för användare av esignering.se att låta en AI generera förslag på avtalsmallar.

Fortfarande i väldigt tidigt beta-stadie, men det är en rolig funktion att experimentera med även om det kanske är lite tidigt för att lita på AI:n fullt ut för alla sina behov av dokument- och avtalsmallar.

Ja, jag vet att metoderna och tekniken här är tekniskt sett inte "riktig" fullskalig AI som kan kan utföra uppgifter åt en, utan att jag förlitar mig på OpenAIs LLM ("Large Language Models").

Varför AI?

Ingen kan ju ha undgått den snabba utvecklingen av AI de senaste månaderna – allt ifrån Stable Diffusion, DALL·E och Midjourney som imponerar med extremt verklighetstrogna bilder och tolkning av indatan, till GPT som verkar kunna det mesta om det mesta och formulera det tydligt i text.

Jag experimenterade en del med OpenAI:s GPT-3 när den släpptes i beta, sedan även med ChatGPT och GPT-3.5. Har även använt Githubs/Microsofts CoPilot i drygt två år. Men de senaste veckorna så har man sett mer och mer prov på att AI allt snabbare kommer att ge avtryck på hur vi utför vårt arbete.

Min roll som "traditionell" webbutvecklare vet jag med säkerhet inte kommer att finnas kvar om tio år, det kommer helt enkelt inte finnas anledning till att låta en människa att skriva det mesta av koden. Men med det sagt, webbutvecklare och programmerare kommer fortfarande att finnas kvar lång tid framöver – det måste fortfarande finnas förståelse för hur slutprodukter ska se ut, vara strukturerade och fungera; vad man ska instruera AI:n till att göra.

Och det är just där kruxet ligger, precis som man instruerar en dator genom programmering så måste man veta vad man ska instruera AI:n för att få ut något vettigt ur den svarta lådan.

Lika lönlöst som det är att lämna över en kravspecifiktion till en programmerare där det bara står "Jag vill ha en Blocket-kopia" (får dessa nästan månadsvis...), lika lönlöst är det att be AI:n om samma sak. Blocket är en samling funktioner som definieras helt olika för mig, dig och en AI.

Första experimenten

I alla fall, för ett par veckor sedan fick jag loss lite tid till att faktiskt bygga något med AI som faktiskt kan göra något för att lära mig mer om verktyg och tillvägagångssätt. Min första idé var en "bespoke" chat-/support-bot för esignering.se, som endast svarade på frågor kring just esignering och tjänsten.

Men redan här stöter man på problem. Jag ville inte börja i "low level" ML (machine learning) och träna en AI på olika data sets, utan ville använda OpenAIs GPT-3, men GPT-3 kan man inte direkt träna till specifika uppgifter – utan GPT är mer en allt-i-allo språkmodell. Utan vad man får göra är att leverera en kontext, och be den svara utefter kontexten.

Till min hjälp arbetade jag med LlamaIndex (tidigare GPT Index), som i sin tur bl.a. använder sig av langchain. Med dessa verktygen kunde jag av en dump av all text på esignering.se bygga upp ett index, som jag sedan kunde serva till GPT-3. Efter lite experimenterande hade jag denna prompten:

1"Du är en chat-bot som kan allt om esignering.se, men undvik att hitta på egna svar."
2"Vänligen svara på följande fråga endast med hjälp av följande kontext\n"
3"---\n"
4"Kontext: {context_str}"
5"\n"
6"Fråga:\n {query_str}"
7"\n---\n"
8"Svar:\n"
1"Du är en chat-bot som kan allt om esignering.se, men undvik att hitta på egna svar."
2"Vänligen svara på följande fråga endast med hjälp av följande kontext\n"
3"---\n"
4"Kontext: {context_str}"
5"\n"
6"Fråga:\n {query_str}"
7"\n---\n"
8"Svar:\n"

Men oj vilken varierande kvalité det var på svaren, ofta hamnade "den" helt off-topic eller helt hittade på egna svar som inte stämde överens med verkligheten (även med låg temperature), vilket är direkt skadligt för en support-bot.

Basic auth Laravel esignering.se har inte ens några konton, och nämner explicit att konton inte behövs, en av grundpelarna av för produkten.

Här är också problem att just GPT-3 inte är i närheten av lika bra på svenska som på engelska, tester på engelskt innehåll och prompter gav betydligt bättre resultat. Så medan jag lärde mig mycket och det var roliga experiment så övergav jag idén ganska snabbt.

Enter GPT-3.5

Nästa idé var då dessa avtalsmallar för esignering.se. Men nu valde jag ett helt annat tillvägagångssätt. Jag kopplade in mig på API:t för chatGPT som använder sig av den nyare LLM:en GPT-3.5. Och denna har betydligt bättre kontroll över svenskan.

Men här kan man inte riktigt ladda in kontexter på samma sätt som i ovanstående (som använder sig av embeddings och completions), utan istället får man föra en konversation med AI:n där man gör övertydliga instruktioner för vad man förväntar sig.

En tidig prompt var t.ex.

1Din uppgift är att skapa ett juridiskt bindande avtal som kommer att signeras elektroniskt genom
2esignering.se. Givet nedanför specificerade två avtalspartners, skapa ett giltigt avtal enligt
3efterföljande parametrar. Svaret ska vara skrivet i markdown i ett kodblock.
4I svaret ska inte specifika platser, adresser, datum eller summor eller antaganden om nuvarande
5livssituation så som redan existerande avtal eller liknande finnas med - så vidare de inte nämns
6i vad avtalet avser. Anta inte heller rollernas expertiser eller kunskaper, utan var mer generiskt.
7 
8Använd följande svarsmall:
9 
10Undertecknas genom esignering.se av:
11@foreach ($signees as $signee)
12{{ $signee->name }}
13@endforeach
14 
15Parametrar:
16 
17Avtalspartners: {{ collect($signees)->pluck('name')->implode(', ') }}
18 
19Avtalet avser (generiskt): {{ $question }}
1Din uppgift är att skapa ett juridiskt bindande avtal som kommer att signeras elektroniskt genom
2esignering.se. Givet nedanför specificerade två avtalspartners, skapa ett giltigt avtal enligt
3efterföljande parametrar. Svaret ska vara skrivet i markdown i ett kodblock.
4I svaret ska inte specifika platser, adresser, datum eller summor eller antaganden om nuvarande
5livssituation så som redan existerande avtal eller liknande finnas med - så vidare de inte nämns
6i vad avtalet avser. Anta inte heller rollernas expertiser eller kunskaper, utan var mer generiskt.
7 
8Använd följande svarsmall:
9 
10Undertecknas genom esignering.se av:
11@foreach ($signees as $signee)
12{{ $signee->name }}
13@endforeach
14 
15Parametrar:
16 
17Avtalspartners: {{ collect($signees)->pluck('name')->implode(', ') }}
18 
19Avtalet avser (generiskt): {{ $question }}

Då esignering.se är byggt i PHP och Laravel så byggde jag en enkel wrapper för OpenAIs API i PHP, samlar in data från användare och sedan helt enkelt läser in prompten via en vanlig blade-template:

1$prompt = (string) view('ai.template', [
2 'question' => $question,
3 'signees' => $signees
4]);
5 
6$openAI = new OpenAi($prompt);
7$answer = $openAI->ask();
1$prompt = (string) view('ai.template', [
2 'question' => $question,
3 'signees' => $signees
4]);
5 
6$openAI = new OpenAi($prompt);
7$answer = $openAI->ask();

Nu är detta långt ifrån perfekt än så länge, men det är i alla fall en bra start på något – duger att experimentera med och samla in feedback i alla fall.

Basic auth Laravel

Efter att jag började skriva denna artikeln har även GPT4 släppts, har själv dock inte hunnit testa det ännu.

Adapt or die

Alla yrken som har med språk att göra är i farozonen – inte så att AI kommer att direkt ta alla dessa yrken. Men i många delar av yrkesrollerna finns det helt enkelt ingen anledning att för en människa att utföra.

Precis som jag nämnde ovanför så kommer min egna roll garanterat inte att finnas kvar i framtiden, då programmering är det enklaste av alla språk – det finns inga utrymmen för tolkningar, dialekter, vinklingar, sarkasm eller tvetydlighet. Det är bara ett språk för att ge instruktioner till en dator. Gissningsvis så kommer det inom ett par år finnas långt effektivare programmeringsspråk som en människa inte rimligtvis kan lära sig.

Vi blir kanske den första rollen i historien som byggt bort sig själv ur ekvationen. Det är upp till oss själva att lära oss använda tekniken till vår egna fördel för att hålla oss relevanta.