Du lanserar en AI-funktion, användare klagar på “slumpmässiga” svar och du fastnar i att diskutera åsikter i Slack. Samtidigt är grundproblemet enklare: ni jämför inte modellernas svar på ett konsekvent sätt som går att granska i efterhand. Den här OpenAI Sheets eval-automationen löser det.
Produktchefer märker det direkt när kvaliteten faller precis innan lansering. Marknadsansvariga märker det när varumärkets tonalitet glider mellan kampanjer. Och byråer som bygger chatbots åt kunder får det från båda håll: “gör det bättre” plus “bevisa det.”
Det här flödet kör två LLM:er på samma prompt, visar båda svaren sida vid sida i chatten och loggar allt i Google Sheets så att du kan välja en vinnare med underlag.
Så fungerar den här automationen
Hela n8n-flödet, från trigger till slutresultat:
n8n Workflow Template: OpenAI + Google Sheets: bevisa vilka svar som vinner
flowchart LR
subgraph sg0["When chat message received Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "When chat message received", pos: "b", h: 48 }
n1@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n2@{ icon: "mdi:memory", form: "rounded", label: "Simple Memory", pos: "b", h: 48 }
n3@{ icon: "mdi:memory", form: "rounded", label: "Chat Memory Manager", pos: "b", h: 48 }
n4@{ icon: "mdi:brain", form: "rounded", label: "OpenRouter Chat Model", pos: "b", h: 48 }
n5@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set model, sessionId, chatIn..", pos: "b", h: 48 }
n6@{ icon: "mdi:robot", form: "rounded", label: "AI Agent", pos: "b", h: 48 }
n7@{ icon: "mdi:cog", form: "rounded", label: "Concatenate Chat Answers", pos: "b", h: 48 }
n8@{ icon: "mdi:cog", form: "rounded", label: "Group Model Outputs for Eval..", pos: "b", h: 48 }
n9@{ icon: "mdi:database", form: "rounded", label: "Add Model Results to Google ..", pos: "b", h: 48 }
n10@{ icon: "mdi:swap-vertical", form: "rounded", label: "Prepare Data for Chat and Go..", pos: "b", h: 48 }
n11@{ icon: "mdi:swap-vertical", form: "rounded", label: "Define Models to Compare", pos: "b", h: 48 }
n12@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Models into Items", pos: "b", h: 48 }
n13@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set Output for Chat UI", pos: "b", h: 48 }
n6 --> n3
n2 -.-> n3
n2 -.-> n6
n1 --> n7
n1 --> n8
n1 --> n6
n3 --> n10
n4 -.-> n6
n12 --> n5
n7 --> n13
n11 --> n12
n0 --> n11
n8 --> n9
n10 --> n1
n5 --> n1
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n0 trigger
class n6 ai
class n4 aiModel
class n2,n3 ai
class n9 database
Problemet: att välja en LLM baserat på känsla
LLM:er är icke-deterministiska, vilket är ett fint sätt att säga att samma prompt kan ge märkbart olika svar mellan körningar, modeller eller till och med små kontextändringar. Därför “testar” team ofta på sämsta möjliga sätt: någon klistrar in några prompts i ett chattgränssnitt, skärmdumpar svaret som ser bäst ut och utser en vinnare. En vecka senare matchar produktionsresultaten inte den där enda bra skärmdumpen. Nu måste ni öppna beslutet igen, bränner tid och bygger fortfarande ingen återanvändbar vana för utvärdering.
Friktionen växer. Här är var det faller isär.
- Du kan inte granska beslut i efterhand eftersom prompts, kontext och output inte sparas tillsammans någonstans.
- Folk jämför olika versioner av en prompt, så ni bedömer promptförfattaren, inte modellen.
- Feedback blir subjektiv eftersom intressenter inte ser samma input och outputs sida vid sida.
- Manuell testning blir i det tysta dyr när du kör dussintals prompts över flera modeller och glömmer vad du redan provat.
Lösningen: kör två modeller, logga allt, granska i Sheets
Det här flödet gör modellutvärdering till ett repeterbart system istället för ett engångsexperiment. Du skickar ett meddelande i chattgränssnittet, och n8n duplicerar input så att två LLM:er kan svara oberoende. Varje modell får sin egen minneskontext (så att du kan utvärdera realistiskt “assistent över tid”-beteende, inte bara enstaka svar). Därefter slår flödet ihop svaren för en korrekt formaterad sida-vid-sida-vy i chatten och lägger till en strukturerad rad i Google Sheets: din input, tidigare kontext, vilken modell som svarade och vad den producerade. Sen kan ni poängsätta raderna manuellt i teamet, eller till och med lägga till en automatiserad utvärderarmodell när ni är redo.
Flödet startar när ett chattmeddelande kommer in. Det väljer modelalternativ, loopar igenom dem och skickar samma prompt genom AI Agent två gånger. Till sist aggregerar det resultaten, skriver en prydlig loggrad per modell till Google Sheets och visar båda svaren tillbaka i chatten för direkt jämförelse.
Det du får: automation vs. resultat
| Vad det här flödet automatiserar | Resultat du får |
|---|---|
|
|
Exempel: så här ser det ut i praktiken
Säg att du testar en supportagent-prompt med 30 riktiga kundfrågor. Manuellt skulle du klistra in varje fråga i två modellchattar, kopiera båda svaren och logga dem någonstans, vilket lätt blir 5 minuter per fråga (cirka 2,5 timmar totalt). Med det här flödet släpper du in varje fråga i chatten och det loggar båda svaren till Google Sheets automatiskt. Du lägger kanske 30 minuter på att granska sheetet, inte timmar på att bygga det.
Det här behöver du
- n8n-instans (prova n8n Cloud gratis)
- Självhostat alternativ om du föredrar det (Hostinger fungerar bra)
- Google Sheets för att logga prompts, kontext och output
- OpenAI (eller OpenRouter) för att generera och jämföra modellsvar
- API-nyckel (hämta den i din modellproviders dashboard)
Svårighetsgrad: Nybörjare. Du kopplar konton, kopierar en sheet-mall och justerar en systemprompt om du vill ha bättre resultat.
Vill du inte sätta upp detta själv? Prata med en automationsexpert (gratis 15-minuters konsultation).
Så fungerar det
Ett chattmeddelande triggar körningen. Incoming Chat Trigger tar emot din prompt och startar utvärderingssessionen.
Flödet väljer modeller och skapar sessionsfält. n8n bygger en liten “modellista” (två modeller som standard) och sätter sessionsmetadata som används för korrekt formaterad loggning och visning.
Varje modell får samma input, med minne. Flödet loopar igenom modellistan, skickar ditt meddelande till AI Agent och använder minneshubben så att båda svaren speglar konversationskontext. Det är här jämförelserna blir ärliga, eftersom många fel först visar sig efter några turer.
Resultaten slås ihop, visas och loggas. De två svaren kombineras till en sida-vid-sida-liknande output i chatten, medan de strukturerade detaljerna läggs till i Google Sheets för granskning och poängsättning senare.
Du kan enkelt ändra modellistan för att jämföra tre eller fyra alternativ utifrån dina behov. Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementering
Steg 1: konfigurera chattriggern
Konfigurera den inkommande chattriggern som startar jämförelseflödet och skickar användarens prompt vidare till flödet för modellval.
- Lägg till och öppna Incoming Chat Trigger.
- Lämna Options tomt om ni inte behöver anpassade chattinställningar.
- Bekräfta att kopplingen från Incoming Chat Trigger till Select Model Options finns på plats.
Steg 2: anslut Google Sheets
Konfigurera målarket där modellresultat läggs till för utvärdering och jämförelse.
- Öppna Append Results to Sheet.
- Inloggningsuppgift krävs: anslut era googleApi-inloggningsuppgifter.
- Ställ in Authentication på
serviceAccount. - Ställ in Document på ert sheet-ID (ersätt
[YOUR_ID]). - Ställ in Sheet Name på
llms_eval(gid=0). - Verifiera att kolumnmappningarna använder dessa uttryck:
{{ $json.sessionIdBase[0] }},{{ $json.model[0] }},{{ $json.model[1] }},{{ $json.chatInput[0] }},{{ $json.model_answer[0] }},{{ $json.model_answer[1] }},{{ $json.context[0] }},{{ $json.context[1] }}.
model_1_id) kommer datan inte att mappas korrekt.Steg 3: konfigurera AI-agent och minne
Konfigurera AI-motorn, agentens beteende och minnet så att flödet kan generera utdata per modell med konversationskontext.
- Öppna OpenRouter Chat Engine och ställ in Model på
{{ $json.model }}. - Inloggningsuppgift krävs: anslut era openRouterApi-inloggningsuppgifter.
- Bekräfta att OpenRouter Chat Engine är ansluten som språkmodell för LLM Agent Processor.
- Öppna Buffer Memory Store och ställ in Session Key på
{{ $('Assign Session Fields').item.json.sessionId }}och Session ID Type påcustomKey. - Observera att Buffer Memory Store och Conversation Memory Hub är undernoder för AI-minne; inloggningsuppgifter (om de behövs) ska läggas till i den överordnade noden de hör till, inte i undernoderna.
- Öppna LLM Agent Processor och behåll Return Intermediate Steps inställt på
false.
Steg 4: konfigurera modellval och iteration
Definiera vilka modeller som ska jämföras, dela upp listan i enskilda objekt och tilldela sessionskontext före varje iteration.
- I Select Model Options, ställ in models på
["openai/gpt-4.1", "mistralai/mistral-large"]. - I Split Model Array, ställ in Field To Split Out på
models. - I Assign Session Fields, ställ in följande värden: model till
{{ $json.models }}, sessionId till{{ $('Incoming Chat Trigger').item.json.sessionId }}{{$json.models }}, chatInput till{{ $('Incoming Chat Trigger').item.json.chatInput }}och sessionIdBase till{{ $('Incoming Chat Trigger').item.json.sessionId }}. - Bekräfta flödet från Assign Session Fields in i Iterate Model List.
Steg 5: konfigurera aggregering och routning av utdata
Formatera utdata för visning, aggregera modellresultat för lagring och sätt upp de parallella körningsgrenarna.
- I Format Chat and Sheet Data, ställ in output på
### `{{ $('Assign Session Fields').item.json.model }}` answered :\n\n\n{{ $('LLM Agent Processor').item.json.output }}\n\n----------\n. - I Format Chat and Sheet Data, ställ in context till det tillhandahållna flerradsuttrycket som extraherar tidigare historik.
- Bekräfta körordningen: Conversation Memory Hub → Format Chat and Sheet Data → Iterate Model List.
- Validera den parallella routningen: Iterate Model List skickar utdata till både Merge Chat Replies och Aggregate Model Results parallellt.
- I Merge Chat Replies, säkerställ att den konkatenerar fältet output med
\nsom avgränsare. - I Prepare Chat Display, ställ in output på
{{ $json.concatenated_output }}.
Steg 6: testa och aktivera ert workflow
Kör ett manuellt test för att verifiera chattutdata, aggregering och tillägg i arket, och aktivera sedan för produktion.
- Klicka på Execute Workflow och skicka ett exempelmeddelande till Incoming Chat Trigger.
- Bekräfta att Prepare Chat Display returnerar sammanfogade utdata för varje modell.
- Verifiera att Append Results to Sheet lägger till en ny rad med två modell-ID:n, två svar och två kontextfält.
- När resultaten ser korrekta ut, slå på workflowet till Active.
Vanliga fallgropar
- Google Sheets-autentisering kan löpa ut eller kräva specifika behörigheter. Om något slutar fungera, kontrollera först vilket Google-konto som är kopplat och n8n:s credential-inställningar.
- Om du använder Wait-noder eller extern rendering varierar processtiderna. Öka väntetiden om nedströmsnoder misslyckas på grund av tomma svar.
- Standardprompter i AI-noder är generiska. Lägg in din varumärkeston tidigt, annars kommer du att redigera output för alltid.
Vanliga frågor
Cirka 30 minuter om dina konton är redo.
Nej. Du kommer mest att koppla konton och klistra in en sheet-mall. Den enda “tekniska” delen är att välja vilka två modeller du vill jämföra.
Ja. n8n har ett gratis självhostat alternativ och en gratis provperiod på n8n Cloud. Cloud-planer börjar på 20 USD/månad för högre volym. Du behöver också räkna med API-kostnader för modellerna, och eftersom varje prompt körs två gånger kan du förvänta dig ungefär dubbla antalet tokens jämfört med chatt med en enda modell.
Två alternativ: n8n Cloud (hanterat, enklast att komma igång) eller självhosting på en VPS. För självhosting är Hostinger VPS prisvärt och hanterar n8n bra. Självhosting ger dig obegränsat antal körningar men kräver grundläggande serveradministration.
Ja, men du behöver utöka modellistan och uppdatera loopen som itererar igenom den. I det här flödet justerar du steget för modelalternativ (noden som väljer modelalternativ) och låter loopen “Iterate Model List” köra över den utökade uppsättningen. Du kan också vilja justera förberedelsen av chattvyn så att jämförelsen förblir läsbar. Om du planerar att jämföra fyra eller fler modeller regelbundet är det värt att lägga till en enkel poängkolumn i Google Sheets så att granskare inte blir överväldigade.
Oftast beror det på en utgången eller felaktig API-nyckel. Uppdatera credential som används av OpenAI/OpenRouter-chattnoden i n8n och kör sedan en testprompt igen. Om det fortfarande misslyckas, kontrollera fakturering hos leverantören och håll koll på rate limits när du batchar många prompts efter varandra.
Väldigt många, så länge du budgeterar för tokens.
För sida-vid-sida-utvärdering av LLM:er är n8n oftast ett bättre val eftersom det hanterar loopar, förgreningar och flerstegslogik som “kör två modeller och slå sedan ihop resultaten” utan problem. Du får också ett riktigt självhostat alternativ, vilket spelar roll om du planerar att köra många prompts utan att hålla koll på task-limiter. Zapier eller Make kan fortfarande fungera, helt ärligt, men du kommer att känna av komplexiteten när du lägger till minneskontext, aggregering och strukturerad loggning. Om du är osäker, välj verktyget du kan förvalta. Prata med en automationsexpert så hjälper vi dig att välja.
Du slutar gissa och börjar välja modeller med ett revisionsspår. Sätt upp det en gång, och låt sedan varje riktig prompt lära dig vad “bättre” faktiskt betyder.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.