Ir al contenido

Explorar datos en un kernel persistente

Esta guía te muestra cómo hacer que un agente cargue algo costoso una sola vez y luego le haga varias preguntas, en lugar de pagar esa carga en cada pregunta.

La herramienta eval ejecuta un intérprete persistente. Las variables, los imports y los datos cargados sobreviven entre llamadas.

Un python -c de un solo uso paga la configuración en cada pregunta. Cargar un dataframe cuesta segundos y cien megabytes; graficarlo cuesta milisegundos. Cuando cada pregunta cuesta la carga, un agente hace menos preguntas de las que debería, y cada respuesta vuelve como texto que luego tiene que volver a parsear.

Carga data/runs.csv y dime la duración p95 por agente.

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

La última expresión se muestra tal como lo hace un notebook, así que len(runs) informa el número de filas sin un print.

Luego, en una llamada aparte:

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

runs sigue cargado. Un dataframe de pandas vuelve representado como tabla en lugar de como un repr.

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

Las figuras se capturan después de la celda y se devuelven como imágenes, que la transcripción muestra. Tú ves la gráfica; el agente también.

Las figuras se cierran después de la captura. Una figura que no se recoge se volvería a dibujar y la siguiente celda también la reenviaría, así que una sesión de cinco celdas emitiría la primera gráfica cinco veces.

Las construcciones que escribirías de todos modos

Sección titulada «Las construcciones que escribirías de todos modos»

Estas se reescriben como código simple en lugar de dar error:

Escribes Qué ocurre
%pip install x Ejecuta pip y luego limpia la caché de módulos, de modo que el siguiente import lo vea
%cd path os.chdir
!command Un subproceso capturado
%%bash El resto de la celda como un script de shell
%%timeit 1000 ejecuciones cronometradas

La expulsión de la caché de %pip es la que importa: instalar en un intérprete en vivo no hace nada por un módulo que ya se importó, así que sin ella la versión que acabas de instalar no es la que se está ejecutando.

Llamar a tus propias herramientas desde dentro de una celda

Sección titulada «Llamar a tus propias herramientas desde dentro de una celda»
paths = tool("find", {"pattern": "**/*.dart", "path": "lib"})
for path in paths.splitlines()[:100]:
contents = tool("read", {"path": path})
...

tool(name, args) vuelve a entrar en el registro de herramientas del propio agente. Eso significa que una celda puede repartirse entre cien archivos, o delegar mediante task, sin que el modelo gaste un turno por cada elemento.

Una llamada puente suspende el tiempo de espera de la celda mientras está pendiente. El presupuesto mide inactividad, no tiempo de reloj: una celda que se reparte entre subagentes y espera cuatro minutos no está colgada, y matarla a mitad de la repartición perdería el estado de todo el kernel.

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

Descarta el intérprete y arranca uno limpio. Todo lo cargado desaparece, que es justamente el punto.

En el recinto de la conversación cuando lo tiene; en el host, de lo contrario.

Un intérprete persistente controlado por un modelo que lee un repo que no es de confianza es exactamente para lo que existe la ejecución solo dentro de un recinto: una llamada bash de un solo uso al menos termina, mientras que un kernel es un shell que recuerda.

No arranca un recinto para llegar hasta allí: la misma regla que impide que una pestaña de rig se inicie automáticamente. Si quieres el kernel dentro de un recinto, abre primero el shell de la conversación. Consulta Dar a un agente una computadora para probar.

  • Una celda a la vez por kernel. Dos celdas compitiendo en un mismo intérprete son dos mitades de dos programas entrelazadas en un mismo espacio de nombres.
  • La salida está limitada. Una celda en un bucle de impresión se trunca en lugar de permitírsele llenar la ventana de contexto.
  • Cuatro imágenes por celda. Un bucle de graficación puede emitir una figura por iteración, y cada imagen es un costo fijo alto en la solicitud que la transporta.
  • El kernel muere con la ejecución. Uno que aún retiene un dataframe después de que terminó la conversación es una fuga.