Gå til hovedindhold

Brug af reduce-kommandoen i Nushell med LLM'er

Indsendt af Lennart den
reduce

I Nushell handler reduce om at tage en liste og folde den ned til en enkelt værdi. Når du tilslutter en LLM til den "foldeproces", giver du i bund og grund modellen en "hukommelse" af alt, hvad den har behandlet i pipelinen hidtil.

Her er tre overordnede mønstre til at bruge reduce med en LLM i din terminal.

Sådan fungerer reduce (LLM Mental Modellen)

Før vi dykker ned, husk syntaksen: list | reduce { |it, acc| ... }.

  • it: Det aktuelle element fra din pipeline.
  • acc: "Akkumulatoren" (resultatet af LLM'ens arbejde fra det forrige trin).

1. "Snebold" opsummeringen (Kontekstuel aggregering)

Hvis du har en massiv logfil eller et langt dokument, der overstiger et kontekstvindue, kan du ikke bare pipe det hele. I stedet "sneboller" du det. Du opsummerer det første stykke, sender derefter den opsummering (acc) sammen med det næste stykke (it) til LLM'en for at skabe en opdateret opsummering.

# Opdel en stor fil i stykker på 2KB og "fold" dem til én opsummering
open big_doc.txt | chunks 2000 | reduce -f "" { |it, acc|
    echo $"Aktuel opsummering: ($acc)\n\nNæste stykke: ($it)" | llm "Opdater opsummeringen til at inkludere den nye information fra det næste stykke."
}

  • Hvorfor dette virker: Det forhindrer LLM'en i at "glemme" begyndelsen af filen, da akkumulatoren konstant bærer den destillerede essens af de tidligere stykker.

2. Den sekventielle forfiner (Slibe loopet)

Lad os sige, at du har et udkast til et script, og du har en liste over "forbedringsobjektiver" (f.eks. "gør det mere idiomatisk", "tilføj fejlhåndtering", "dokumenter funktionerne").

let lenses = ["gør det idiomatisk nushell", "tilføj robust fejlhåndtering", "tilføj docstrings"]
let initial_code = (open my_script.nu)

$lenses | reduce -f $initial_code { |it, acc|
    echo $acc | llm $"Omskriv denne kode ved hjælp af følgende instruktion: ($it)"
}

  • Hvorfor dette virker: I stedet for at bede LLM'en om at gøre ti ting på én gang (hvilket ofte fører til hallucinationer eller oversete instruktioner), tvinger du den til at fokusere på én specifik forbedring ad gangen, byggende på den tidligere version.

3. "Turnering" udvælgelsen (Find den bedste post)

Antag, at du har en liste med 50 genererede slogans eller ideer. Du vil have LLM'en til at vælge den absolut bedste. Hvis du giver den alle 50, kan den blive overvældet. Med reduce kan du få den til at køre en "turnering".

ls *.txt | get name | reduce { |it, acc|
    llm $"Mellem disse to filnavne, hvilket er mest beskrivende for et projekt om AI? 
    A: ($it)
    B: ($acc)
    Returner kun det bedste filnavn."
}

  • Hvorfor dette virker: Dette udfører en parvis sammenligning. "Vinderen" forbliver i akkumulatoren og står over for den næste "udfordrer" på listen, indtil kun én er tilbage.

Et hurtigt tip om ydeevne

Brug af reduce med LLM'er er lineært og sekventielt. Fordi hvert trin afhænger af outputtet fra det forrige, kan du ikke parallelisere dette. Det er en "langsom-tilberedningsmetode", ikke en mikrobølgeovn. Hvis du kører dette på en lang liste, vil du måske tilføje en print-kommando inde i blokken, så du kan se LLM'en "tænke" i realtid.