Explorar datos en un kernel persistente
Esta guía te muestra cómo conseguir que un agente cargue una vez algo costoso y luego le haga varias preguntas sobre ello, en lugar de pagar la carga en cada pregunta.
La herramienta eval ejecuta un intérprete persistente. Las variables, las importaciones y los datos cargados sobreviven entre llamadas.
Por qué no ejecutar simplemente un script
Sección titulada «Por qué no ejecutar simplemente un script»Un python -c de un solo uso paga la preparació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 después tiene que volver a parsear.
Cargar una vez y preguntar
Sección titulada «Cargar una vez y preguntar»Carga
data/runs.csvy dime la duración p95 por agente.
import pandas as pdruns = pd.read_csv("data/runs.csv")len(runs)La última expresión se devuelve igual que en un notebook, así que len(runs) informa del número de filas sin necesidad de un print.
Luego, en una llamada aparte:
runs.groupby("agent")["duration_ms"].quantile(0.95).sort_values()runs sigue cargado. Un frame de pandas vuelve representado como tabla en lugar de como una repr.
Los gráficos aterrizan en el chat
Sección titulada «Los gráficos aterrizan en el chat»import matplotlib.pyplot as pltruns.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 representa. Tú ves el gráfico, y el agente también.
Las figuras se cierran después de capturarlas. Una figura no recogida se volvería a dibujar y se reenviaría también desde la siguiente celda, así que una sesión de cinco celdas emitiría el primer gráfico cinco veces.
Los modismos que escribirías de todos modos
Sección titulada «Los modismos que escribirías de todos modos»Se reescriben a código normal en lugar de dar error:
| Escribes | Qué ocurre |
|---|---|
%pip install x |
Ejecuta pip y luego vacía la caché de módulos para que el siguiente import lo vea |
%cd path |
os.chdir |
!command |
Un subproceso con la salida capturada |
%%bash |
El resto de la celda como script de shell |
%%timeit |
1000 ejecuciones cronometradas |
El vaciado de la caché de %pip es el que importa: instalar en un intérprete en marcha no hace nada por un módulo que ya se había importado, así que sin él la versión que acabas de instalar no es la que se está ejecutando.
Llamar a tus propias herramientas desde una celda
Sección titulada «Llamar a tus propias herramientas desde 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 por cien archivos, o delegar mediante task, sin que el modelo gaste un turno por elemento.
Una llamada a través del puente suspende el tiempo de espera de la celda mientras está pendiente. El presupuesto mide la inactividad, no el reloj —una celda que se reparte entre subagentes y espera cuatro minutos no está colgada, y matarla a mitad del reparto perdería el estado de todo el kernel.
Empezar de cero
Sección titulada «Empezar de cero»eval(code: "…", reset: true, description: "Start a clean interpreter")Descarta el intérprete y arranca uno limpio. Todo lo cargado desaparece, que es justo lo que se busca.
Dónde se ejecuta el kernel
Sección titulada «Dónde se ejecuta el kernel»En el recinto de la conversación cuando la tiene, y en el host en caso contrario.
Un intérprete persistente dirigido por un modelo que lee un repo que no es de confianza es exactamente aquello para lo que existe la ejecución solo en el recinto: una llamada bash de un solo uso al menos termina, mientras que un kernel es una shell que recuerda.
No arranca un recinto para conseguirlo: la misma regla que impide que una pestaña de rig se arranque sola. Si quieres el kernel dentro de un recinto, abre antes la shell de la conversación. Consulta Dar a un agente una máquina para probar.
Límites
Sección titulada «Límites»- 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 print se trunca en vez de dejar que llene la ventana de contexto.
- Cuatro imágenes por celda. Un bucle de gráficos puede emitir una figura por iteración, y cada imagen es un coste fijo elevado en la petición que la transporta.
- El kernel muere con la ejecución. Uno que siga reteniendo un dataframe después de que termine la conversación es una fuga.
Relacionado
Sección titulada «Relacionado»- Entorno aislado y seguridad — qué significa aquí «dentro de un recinto»
- Dar a un agente una máquina para probar — abrir el recinto
- Herramientas de agente integradas — los argumentos