Vårt flöde läser förfrågningsunderlag med dussintals parallella agenter. Några av de mest värdefulla ändringarna i dess historia är borttagningar. Här är fyra av dem, och arbetsregeln de lämnade efter sig.
Borttagningen
När en granskningskörning fläktas ut över ett stort förfrågningsunderlag blir dussintals block klara oberoende av varandra, vart och ett med strukturerade fynd och källhänvisningar. Ett sista LLM-anrop vävde ihop dem till en syntes. Det anropet dubbelräknade budgetposter, la latens på varje körning och parafraserade fynd som redan var korrekta. Vi raderade det och konkatenerar råresultaten i stället. Diffen tog bort 119 rader och la till 35.
Lite sammanhang. Flödet i fråga läser förfrågningsunderlag för bygg- och infrastrukturprojekt: hundratals sidor administrativa föreskrifter, tekniska beskrivningar och mängdförteckningar. En körning klassificerar dokumenten, delar dem i block och kör dussintals agentpass parallellt. Det raderade anropet satt allra sist, där alla parallella fynd möts, för det kändes självklart att en modell skulle väva ihop dem.
Ingenting blev sämre när det försvann. Agenterna returnerar redan sina fynd i fast struktur, så att lägga dem bredvid varandra tappar ingen information. Syntesskiktet hade ingen uppsida kvar, bara den stående risken i varje modellpass: varje tur genom en LLM är en chans för en siffra att ändras, och en ändrad siffra i en anbudsgranskning är ett fel, inte en stilfråga.
En äldre lärdom
Vi hade sett mönstret förut. En tidigare generation av flödet slutade med en LLM som formaterade aggregerat underlag till leveransstrukturen. Den var långsam, kostade tokens och blev då och då kreativ med innehåll den bara skulle arrangera. Idag är det steget schemavalidering följt av JSON.stringify. Noll modellanrop, identiskt resultat, varje gång.
Det låter som ett skämt om modellval: årets bästa modellbeslut var JSON.stringify. Men resonemanget är tråkigt och hållbart. Formatering är transformation, transformation har ett facit, och arbete som har ett facit ska inte passera en samplingsprocess. Steget har inte behövt felsökas en enda gång sedan bytet.
Tre timmar
Majoritetsröstning är läroboksförsvaret mot hallucination: kör flera repliker, behåll det de flesta är överens om. Vi kör redan upp till fem repliker av vår extraktionsagent över varje del av ett dokument, var och en med olika beteendedirektiv, så röstningen var en eftermiddags arbete. Vi implementerade den, diffade resultaten mot riktiga förfrågningsunderlag och raderade den samma kväll.
Diffen förklarade varför. Replikerna kör på låg temperatur, och den exakta matchningen uppströms är deterministisk, så hallucinerade fynd är redan sällsynta när omröstningen skulle hållas. Det replikerna faktiskt är oense om är de sällsynta giltiga fynd som bara en av dem fångar: kravet i en bilaga som bara repliken som läser bakifrån når med uppmärksamheten kvar. En omröstning kastar exakt de fynden. Röstning bekämpar hallucination; när hallucinationen redan är död uppströms dödar den bara recall.
Återtaget
Alla subtraktioner var inte interna steg. Vi byggde extraktion av ritningsskalor, den där 1:50 eller 1:100 som står tryckt på en ritning, så att mängder kunde rimlighetskontrolleras mot geometrin. Den levererades, och den gjorde sig bra i demos. Vi tog tillbaka den. Skaltexter sitter på inkonsekventa ställen, ofta per vy snarare än per ritning, och en självsäkert fel skala är värre än ingen skala i ett verktyg entreprenörer lutar sig mot när de prissätter anbud. I vår domän är "oftast rätt" en belastning.
Funktionen kan komma tillbaka den dag den går att verifiera deterministiskt. Tills dess är frånvaron den säkrare funktionen.
Regeln
Fyra subtraktioner, ett mönster. Varje raderat anrop satt på en punkt i flödet där uppgiften hade ett facit, och varje anrop ersattes av något deterministiskt eller av ingenting alls. Metoden var densamma varje gång: implementera, diffa mot riktiga dokument, tro på diffen. Ingen av borttagningarna krävde mod i efterhand; diffen hade redan avgjort saken.
| Vad vi tog bort | Ersattes med | Vad som blev bättre |
|---|---|---|
| Majoritetsröstning över repliker | Unionen av alla replikers fynd | Recall |
| LLM-formaterare i sista steget | Schemavalidering + JSON.stringify | Hastighet, determinism |
| Syntes av parallella fynd | Ren konkatenering | Korrekthet, latens, 119 färre rader |
| Skalextraktion från ritningar | Ingenting | Förtroende |
Arbetsregeln som växte fram: LLM för omdöme, kod för transformation. En modell förtjänar sin plats där uppgiften faktiskt kräver läsning och avvägning: lägger den här klausulen risken på entreprenören, gäller det här kravet i det här anbudet. Att slå ihop resultat, formatera utdata och flytta data mellan steg är transformation, och kod gör transformation snabbare, billigare och likadant vid varje körning. Allt som kan vara deterministiskt ska vara det.
Instinkten efter en lyckad demo är att lägga till modellanrop. Våra dokument fortsätter lära oss den motsatta disciplinen. Varje anrop vi raderar är ett ställe mindre där en siffra kan ändras på vägen till en ingenjör som ska lita på den.
Yesper är AI-civilingenjören för bygg och infrastruktur. AFRY, COWI, NRC Group och andra nordiska bolag använder den för att halvera tiden i en utredning, räkna om på minuter, och fånga fel som annars slinker förbi. Hör av dig om du vill se vad den kan göra för er.
Boka demoFå nästa text i mejlen. Avregistrera när du vill.
Relaterat