Přeskočit na obsah

Prozkoumejte data v persistentním kernelu

Tenhle návod ukazuje, jak nechat agenta načíst něco drahého jednou a pak se toho ptát několikrát, místo aby načtení platil u každé otázky.

Nástroj eval spouští persistentní interpret. Proměnné, importy a načtená data mezi voláními přežijí.

Proč nespustit jen skript

Sekce “Proč nespustit jen skript”

Jednorázové python -c platí přípravu u každé otázky. Načtení dataframe stojí sekundy a stovku megabajtů; graf z něj milisekundy. Když každá otázka stojí načtení, agent se ptá míň, než by měl — a každá odpověď se vrátí jako text, který pak musí znovu rozebrat.

Načti jednou, pak se ptej

Sekce “Načti jednou, pak se ptej”

Načti data/runs.csv a řekni mi p95 trvání podle agenta.

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

Poslední výraz se vypíše jako v notebooku, takže len(runs) ohlásí počet řádků i bez print.

Potom, v samostatném volání:

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

runs je pořád načtený. Frame z pandas se vrátí vykreslený jako tabulka, ne jako repr.

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

Figury se po buňce zachytí a vrátí jako obrázky, které vykreslí přepis. Graf vidíš ty i agent.

Po zachycení se figury zavřou. Figura, kterou kód nesebral, by se překreslila a znovu odeslala i v další buňce, takže relace o pěti buňkách by první graf vyslala pětkrát.

Idiomy, které bys napsal i tak

Sekce “Idiomy, které bys napsal i tak”

Přepíšou se na obyčejný kód, místo aby skončily chybou:

Napíšeš Co se stane
%pip install x Spustí pip a pak vyčistí cache modulů, aby ho viděl další import
%cd path os.chdir
!command Zachycený podproces
%%bash Zbytek buňky jako shellový skript
%%timeit 1000 měřených opakování

Vyklizení cache u %pip je to jediné, na čem záleží: instalace do živého interpretu s už importovaným modulem nic nezmění, takže bez něj neběží verze, kterou jsi právě nainstaloval.

Volání vlastních nástrojů z buňky

Sekce “Volání vlastních nástrojů z buňky”
paths = tool("find", {"pattern": "**/*.dart", "path": "lib"})
for path in paths.splitlines()[:100]:
contents = tool("read", {"path": path})
...

tool(name, args) znovu vstoupí do vlastního registru nástrojů agenta. Buňka tak může rozvětvit práci přes stovku souborů, nebo ji přes task delegovat, aniž by model za každou položku utrácel tah.

Volání přes most pozastaví časový limit buňky, dokud není vyřízené. Rozpočet měří nečinnost, ne reálný čas — buňka, která se rozvětví na podagenty a čtyři minuty čeká, není zaseknutá, a její zabití uprostřed rozvětvení by přišlo o stav celého kernelu.

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

Zahodí interpret a spustí čistý. Všechno načtené je pryč, a o to jde.

V izolovaném prostředí konverzace, pokud nějaké má, jinak na hostiteli.

Persistentní interpret poháněný modelem, který čte nedůvěryhodný repozitář, je přesně případ, pro který existuje provádění jen v izolovaném prostředí: jednorázové volání bash aspoň skončí, kernel je shell, který si pamatuje.

Aby tam kernel běžel, izolované prostředí nenabootuje — stejné pravidlo, které brání kartě stanice naběhnout sama. Když chceš kernel v izolovaném prostředí, nejdřív otevři shell konverzace. Viz Dejte agentovi stroj na testování.

  • Jedna buňka najednou na kernel. Dvě buňky, které se v jednom interpretu předhánějí, jsou dvě půlky dvou programů proložené v jednom jmenném prostoru.
  • Výstup je omezený. Buňka ve smyčce s printy se ořízne, místo aby směla zaplnit kontextové okno.
  • Čtyři obrázky na buňku. Smyčka s grafy umí v každé iteraci vydat figuru a každý obrázek je v požadavku, který ho veze, velký pevný náklad.
  • Kernel umírá s během. Ten, který po skončení konverzace pořád drží dataframe, je únik.