Sari la conținut

Explorează datele într-un kernel persistent

Acest ghid arată cum să faci un agent să încarce o dată ceva costisitor și apoi să pună mai multe întrebări despre acel lucru, în loc să plătească încărcarea la fiecare întrebare.

Instrumentul eval rulează un interpretor persistent. Variabilele, importurile și datele încărcate supraviețuiesc între apeluri.

Un python -c de o singură folosire plătește pregătirea la fiecare întrebare. Încărcarea unui dataframe costă secunde și o sută de megabaiți; desenarea lui costă milisecunde. Când fiecare întrebare costă încărcarea, un agent pune mai puține întrebări decât ar trebui — iar fiecare răspuns se întoarce ca text pe care apoi trebuie să îl reanalizeze.

Încarcă data/runs.csv și spune-mi durata p95 pe agent.

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

Ultima expresie este afișată așa cum face un notebook, așa că len(runs) raportează numărul de rânduri fără un print.

Apoi, într-un apel separat:

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

runs este încă încărcat. Un dataframe pandas se întoarce redat ca tabel, nu ca un repr.

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

Figurile sunt capturate după celulă și returnate ca imagini, pe care transcrierea le redă. Tu vezi graficul; la fel îl vede și agentul.

Figurile sunt închise după capturare. O figură necolectată ar fi redesenată și retrimisă și de următoarea celulă, așa că o sesiune de cinci celule ar emite primul grafic de cinci ori.

Acestea sunt rescrise în cod simplu, în loc să dea eroare:

Tastezi Ce se întâmplă
%pip install x Rulează pip, apoi golește cache-ul de module, așa că următorul import îl vede
%cd path os.chdir
!command Un subproces capturat
%%bash Restul celulei ca script de shell
%%timeit 1000 de rulări cronometrate

Evacuarea cache-ului de la %pip este cea care contează: instalarea într-un interpretor activ nu face nimic pentru un modul care a fost deja importat, așa că fără ea versiunea pe care tocmai ai instalat-o nu este cea care rulează.

Apelarea propriilor instrumente din interiorul unei celule

Secțiune intitulată „Apelarea propriilor instrumente din interiorul unei celule”
paths = tool("find", {"pattern": "**/*.dart", "path": "lib"})
for path in paths.splitlines()[:100]:
contents = tool("read", {"path": path})
...

tool(name, args) reintră în registrul de instrumente propriu al agentului. Asta înseamnă că o celulă se poate ramifica peste o sută de fișiere sau poate delega prin task, fără ca modelul să consume un tur pentru fiecare element.

Un apel prin punte suspendă timeout-ul celulei cât timp este în curs. Bugetul măsoară inactivitatea, nu timpul de ceas — o celulă care se ramifică spre subagenți și așteaptă patru minute nu este blocată, iar oprirea ei la mijlocul ramificării ar pierde întreaga stare a kernelului.

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

Aruncă interpretorul și pornește unul curat. Tot ce era încărcat s-a pierdut, iar acesta este scopul.

În mediul izolat al conversației, atunci când conversația are unul, altfel pe gazdă.

Un interpretor persistent condus de un model care citește un repo nesigur este exact pentru ce există execuția doar în mediu izolat: un apel bash de o singură folosire cel puțin se termină, în timp ce un kernel este un shell care ține minte.

Nu pornește un mediu izolat pentru a ajunge acolo — aceeași regulă care împiedică pornirea automată a unui tab de stație. Dacă vrei ca kernelul să fie izolat, deschide mai întâi shell-ul conversației. Vezi Oferă unui agent o mașină pe care să testeze.

  • O singură celulă odată pentru fiecare kernel. Două celule care concurează într-un interpretor înseamnă două jumătăți din două programe intercalate într-un singur namespace.
  • Ieșirea este plafonată. O celulă aflată într-o buclă de afișare este trunchiată, în loc să i se permită să umple fereastra de context.
  • Patru imagini per celulă. O buclă de desenare poate emite o figură la fiecare iterație, iar fiecare imagine este un cost fix mare în cererea care o transportă.
  • Kernelul moare odată cu rularea. Unul care mai ține un dataframe după ce conversația s-a încheiat este o scurgere.