Gå til hovedindhold

Generer eller reducer agenten?

Indsendt af Lennart den

I verdenen af funktionel programmering findes der to titaner inden for iteration: Unfold (genererer en strøm fra et frø) og Fold (reducerer en strøm til en enkelt værdi).

I Nushell repræsenteres disse af generate og reduce. Efter at have bygget agenter med begge, er det klart, at selvom de ofte kan opnå de samme mål, er deres "filosofi" fundamentalt forskellig.

Hvad er reduce?

reduce-kommandoen (ofte kaldet fold i andre sprog) tager en samling og en "startværdi" (akkumulatoren). Den gennemgår derefter samlingen og anvender en lukning, der kombinerer det aktuelle element med akkumulatoren.

[1 2 3] | reduce --fold 0 {|it, acc| $acc + $it} # Resultat: 6

I vores agent_reduce.nu-implementering brugte vi dette til at "tråde" en samtalehistorik gennem en række potentielle drejninger.

Se også: Fold an Agent in Nushell | docujAI

Fordele ved reduce

1. Deterministisk tilstandsstyring

Med reduce er tilstanden aldrig "skjult". Akkumulatoren sendes eksplicit fra trin til trin. Dette gør fejlfinding utroligt enkel: hvis din agents historik er forkert ved drejning 4, kan du præcist se, hvordan drejning 3's output blev foldet ind i tilstanden.

2. Indbyggede sikkerhedsnet (Mønsteret "Max Dybde")

Agenter er tilbøjelige til uendelige løkker. De kan hallucinere et værktøjsopkald, der fører tilbage til det samme spørgsmål. Ved at bruge reduce over et interval (som 1..5) pålægger du en hård grænse for agentens "tænketid" uden ekstra logik. Løkken kan ikke overskride grænserne for inputintervallet.

3. Endelighed

reduce returnerer en enkelt værdi. Når du bygger et værktøj, der skal "få svaret og gemme det i en fil", er reduce det rigtige værktøj. Du behøver ikke indsamle en strøm eller administrere delvise resultater; outputtet er det færdige produkt.

Ulemper

1. Ingen indbygget "Break"

Den største forhindring med reduce i Nushell er, at den ikke har en break-kommando. For at stoppe tidligt (f.eks. når agenten giver et endeligt svar), skal du implementere "gennemstrømnings"-logik:

if $is_done { $acc } else { ... do work ... }

Dette betyder, at løkken fortsætter med at køre for de resterende elementer i intervallet, selvom den bare sender data videre. Selvom det er beregningsmæssigt billigt for 5-10 drejninger, er det mindre "rent" end en generator, der stopper øjeblikkeligt.

2. Ikke en Strøm

Fordi reduce venter med at afslutte hele foldningen, før den returnerer, mister du den "live" følelse. Du kan ikke sende mellemliggende resultater til skærmen, efterhånden som de sker, uden at bruge print inde i lukningen, hvilket bryder den funktionelle renhed.

Sammenligning: reduce (Fold) vs. generate (Unfold)

Funktion generate (Agent 1.0) reduce (Agent 2.0)
Koncept Unfold: Frø -> Strøm Fold: Interval -> Resultat
Output En doven strøm af beskeder En enkelt endelig historikpost
UX Realtid (strøm løbende) Batch (vent på fuldførelse)
Sikkerhed Kræver manuel exit-logik Naturlig grænse via inputinterval
Anvendelsessag Chatbots, interaktive CLIs Datapipelines, baggrundsopgaver

Konklusion

Hvis du bygger en agent, der skal føles levende og responsiv, er generate din bedste ven. Den behandler agenten som en producent af information.

Men hvis du bygger en agent til at være en pålidelig komponent i et større system – en, der transformerer en prompt til en struktureret historik – er reduce det mere robuste valg. Den bytter den "live" strøm for deterministiske grænser og et klart, endeligt resultat.

Husk at læse: A very simple and slightly better way to create an AI agent using nushell generate instead of a normal agent loop | docujAI