Перейти до вмісту

Досліджувати дані в постійному ядрі

Цей посібник показує, як змусити агента один раз завантажити щось дороге, а потім поставити до нього кілька запитань, а не платити за завантаження за кожного запиту.

Інструмент eval запускає постійний інтерпретатор. Змінні, імпорти та завантажені дані зберігаються між викликами.

Одноразовий python -c платить за підготовку за кожного запиту. Завантаження датафрейму коштує секунди й сотню мегабайтів, а побудова графіка за ним — мілісекунди. Коли кожне запитання коштує стільки ж, скільки завантаження, агент ставить менше запитань, ніж мав би, — і кожна відповідь повертається текстом, який потім доводиться розбирати заново.

Завантажте data/runs.csv і скажіть мені p95 тривалості за агентами.

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

Останній вираз повертається так, як це робить блокнот, тож len(runs) повідомляє кількість рядків без print.

Потім, в окремому виклику:

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

runs усе ще завантажено. Фрейм pandas повертається відображеним як таблиця, а не як repr.

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

Графіки захоплюються після комірки й повертаються як зображення, які відображає транскрипт. Ви бачите графік; агент теж.

Після захоплення графіки закриваються. Незабраний графік був би перемальований і надісланий знову ще й наступною коміркою, тож сесія з п’яти комірок видала б перший графік п’ять разів.

Вони переписуються в звичайний код, а не спричиняють помилку:

Ви набираєте Що відбувається
%pip install x Запускає pip, потім очищає кеш модулів, щоб наступний import його побачив
%cd path os.chdir
!command Захоплений підпроцес
%%bash Решта комірки як сценарій оболонки
%%timeit 1000 запусків із заміром часу

Витіснення кешу в %pip — найважливіше: встановлення в працюючий інтерпретатор нічого не змінює для модуля, який уже імпортовано, тож без нього працює не та версія, яку ви щойно встановили.

Виклик власних інструментів зсередини комірки

Розділ із назвою «Виклик власних інструментів зсередини комірки»
paths = tool("find", {"pattern": "**/*.dart", "path": "lib"})
for path in paths.splitlines()[:100]:
contents = tool("read", {"path": path})
...

tool(name, args) знову входить у власний реєстр інструментів агента. Це означає, що комірка може розгалузитися на сотню файлів або делегувати через task, не витрачаючи хід моделі на кожен елемент.

Виклик через міст призупиняє тайм-аут комірки, поки він не завершено. Бюджет вимірює бездіяльність, а не час за годинником, — комірка, яка розгалужується на субагентів і чекає чотири хвилини, не зависла, а її вбивство посеред розгалуження втратило б стан усього ядра.

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

Відкидає інтерпретатор і запускає чистий. Усе завантажене зникає — у цьому й сенс.

У ізольованому середовищі розмови, якщо воно в неї є, інакше — на хості.

Постійний інтерпретатор, яким керує модель, що читає недовірений репозиторій, — це рівно той випадок, для якого й існує виконання лише в ізольованому середовищі: одноразовий виклик bash принаймні закінчується, а ядро — це оболонка, яка пам’ятає.

Він не завантажує ізольоване середовище, щоб туди дістатися, — те саме правило, яке не дає вкладці rig запускатися автоматично. Якщо ви хочете, щоб ядро було ізольованим, спершу відкрийте оболонку розмови. Див. Дати агенту машину для тестів.

  • Одна комірка за раз на ядро. Дві комірки, що змагаються в одному інтерпретаторі, — це дві половини двох програм, переплетені в одному просторі імен.
  • Вивід обмежено. Комірка в циклі друку обрізається, а не заповнює вікно контексту.
  • Чотири зображення на комірку. Цикл побудови графіків може видавати графік на кожній ітерації, а кожне зображення — це велика фіксована вартість у запиті, який його несе.
  • Ядро вмирає разом із запуском. Ядро, яке все ще тримає датафрейм після завершення розмови, — це витік.