Gå til innholdet

Utforsk data i en vedvarende kernel

Denne veiledningen viser hvordan du lar en agent laste inn noe dyrt én gang og deretter stille flere spørsmål til det, i stedet for å betale for innlastingen ved hvert spørsmål.

eval-verktøyet kjører en vedvarende tolk. Variabler, importer og innlastet data overlever mellom kall.

Et engangs python -c betaler oppsettet ved hvert spørsmål. Å laste inn et dataframe tar sekunder og hundre megabyte; å lage et diagram av det tar millisekunder. Når hvert spørsmål koster innlastingen, stiller agenten færre spørsmål enn den burde — og hvert svar kommer tilbake som tekst den deretter må tolke på nytt.

Last inn data/runs.csv og fortell meg p95-varigheten per agent.

import pandas as pd
runs = pd.read_csv("data/runs.csv")
len(runs)

Det siste uttrykket ekkoes slik en notatbok gjør, så len(runs) rapporterer antall rader uten en print.

Deretter, i et eget kall:

runs.groupby("agent")["duration_ms"].quantile(0.95).sort_values()

runs er fortsatt lastet inn. Et pandas-dataframe kommer tilbake som en tabell i stedet for som en repr.

import matplotlib.pyplot as plt
runs.groupby("agent")["duration_ms"].mean().plot.bar()

Figurer fanges opp etter cellen og returneres som bilder, som transkriptet viser. Du ser diagrammet; det gjør agenten også.

Figurer lukkes etter at de er fanget opp. En figur som ikke blir samlet opp, ville blitt tegnet og sendt på nytt av den neste cellen også, så en økt på fem celler ville sendt det første diagrammet fem ganger.

Disse skrives om til ren kode i stedet for å gi feil:

Du skriver Hva som skjer
%pip install x Kjører pip og tømmer deretter modulcachen, slik at neste import ser den
%cd path os.chdir
!command En delprosess der utdataene fanges opp
%%bash Resten av cellen som et skallskript
%%timeit 1000 tidsmålte kjøringer

Det er tømmingen av modulcachen for %pip som betyr noe: å installere i en levende tolk gjør ingenting for en modul som allerede er importert, så uten den er ikke versjonen du nettopp installerte, den som kjører.

paths = tool("find", {"pattern": "**/*.dart", "path": "lib"})
for path in paths.splitlines()[:100]:
contents = tool("read", {"path": path})
...

tool(name, args) går inn i agentens eget verktøyregister på nytt. Det betyr at en celle kan spre seg over hundre filer, eller delegere via task, uten at modellen bruker en tur per element.

Et brokall setter cellens tidsavbrudd på pause så lenge det pågår. Budsjettet måler inaktivitet, ikke reell tid — en celle som sprer seg ut til underagenter og venter i fire minutter, henger ikke, og å drepe den midt i utsendelsen ville miste hele tilstanden i kernelen.

eval(code: "…", reset: true, description: "Start a clean interpreter")

Forkaster tolken og starter en ren en. Alt som er lastet inn, er borte, og det er poenget.

I samtalens isolerte miljø når den har ett, ellers på vertsmaskinen.

En vedvarende tolk drevet av en modell som leser et repo du ikke stoler på, er nettopp det kjøring kun i isolert miljø er til for: et engangs bash-kall tar i det minste slutt, mens en kernel er et skall som husker.

Den starter ikke et isolert miljø for å komme dit — den samme regelen som hindrer at en stasjonsfane starter av seg selv. Hvis du vil at kernelen skal kjøre isolert, åpner du skallet i samtalen først. Se Gi en agent en maskin å teste på.

  • Én celle om gangen per kernel. To celler som kappes i én tolk, er to halvdeler av to programmer flettet sammen i ett navnerom.
  • Utdataene er begrenset. En celle i en utskriftsløkke avkortes i stedet for å få fylle kontekstvinduet.
  • Fire bilder per celle. En plotteløkke kan sende ut en figur per iterasjon, og hvert bilde er en stor fast kostnad i forespørselen som bærer det.
  • Kernelen dør med kjøringen. En som fortsatt holder på et dataframe etter at samtalen er avsluttet, er en lekkasje.