Bỏ qua để đến nội dung

Khám phá dữ liệu trong kernel bền vững

Hướng dẫn này chỉ cách để một agent nạp một thứ tốn kém đúng một lần rồi hỏi nó vài câu hỏi, thay vì phải trả giá cho việc nạp ở mỗi câu hỏi.

Công cụ eval chạy một trình thông dịch bền vững. Biến, import và dữ liệu đã nạp vẫn còn nguyên giữa các lần gọi.

Một lệnh python -c chạy một lần sẽ phải trả giá cho phần thiết lập ở mỗi câu hỏi. Nạp một dataframe tốn vài giây và cả trăm megabyte; còn vẽ biểu đồ từ nó chỉ tốn vài mili giây. Khi mỗi câu hỏi đều phải trả giá cho việc nạp, agent sẽ hỏi ít hơn mức nó nên hỏi — và mỗi câu trả lời quay về dưới dạng văn bản mà nó lại phải phân tích lại.

Nạp data/runs.csv và cho tôi biết thời lượng p95 theo từng agent.

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

Biểu thức cuối cùng được hiển thị theo cách một notebook vẫn làm, nên len(runs) cho biết số dòng mà không cần print.

Rồi, trong một lần gọi riêng:

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

runs vẫn đang được nạp. Một frame của pandas quay về dưới dạng bảng được kết xuất thay vì một repr.

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

Các hình được chụp lại sau khi ô chạy xong và trả về dưới dạng ảnh, rồi bản ghi hội thoại kết xuất chúng. Bạn thấy biểu đồ; agent cũng thấy.

Hình được đóng lại sau khi chụp. Một hình không được thu gom sẽ còn bị ô kế tiếp vẽ lại và gửi lại, nên một phiên năm ô sẽ phát ra biểu đồ đầu tiên năm lần.

Những cú pháp này được viết lại thành mã thuần thay vì báo lỗi:

Bạn gõ Điều xảy ra
%pip install x Chạy pip, rồi xóa bộ nhớ đệm module để lần import kế tiếp nhìn thấy gói đó
%cd path os.chdir
!command Một tiến trình con có thu thập đầu ra
%%bash Phần còn lại của ô như một script shell
%%timeit 1000 lần chạy có đo thời gian

Việc xóa bộ nhớ đệm của %pip mới là điều quan trọng: cài đặt vào một trình thông dịch đang chạy không có tác dụng gì với một module đã được import từ trước, nên nếu thiếu bước này thì phiên bản bạn vừa cài không phải là phiên bản đang chạy.

Gọi công cụ của chính bạn từ bên trong một ô

Phần tiêu đề “Gọi công cụ của chính bạn từ bên trong một ô”
paths = tool("find", {"pattern": "**/*.dart", "path": "lib"})
for path in paths.splitlines()[:100]:
contents = tool("read", {"path": path})
...

tool(name, args) đi vào lại sổ đăng ký công cụ của chính agent. Nghĩa là một ô có thể tỏa ra trên hàng trăm tệp, hoặc ủy thác qua task, mà mô hình không phải tiêu tốn một lượt cho mỗi mục.

Một lệnh gọi qua cầu sẽ tạm ngưng thời gian chờ của ô trong khi lệnh đó còn đang chờ xử lý. Ngân sách này đo sự không hoạt động, chứ không đo đồng hồ thực — một ô tỏa ra tới các subagent rồi chờ bốn phút không phải là bị treo, và giết nó giữa lúc tỏa ra sẽ làm mất toàn bộ trạng thái của kernel.

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

Vứt bỏ trình thông dịch hiện tại và khởi động một cái sạch. Mọi thứ đã nạp đều mất, và đó chính là mục đích.

Trong enclosure của cuộc hội thoại nếu cuộc hội thoại có một cái, còn không thì trên host.

Một trình thông dịch bền vững do một mô hình đang đọc một kho mã không đáng tin điều khiển chính là thứ mà việc thực thi chỉ-trong-enclosure sinh ra để phục vụ: một lệnh bash chạy một lần thì ít nhất cũng kết thúc, còn một kernel là một shell biết ghi nhớ.

Nó không khởi động một enclosure để làm được điều đó — cùng quy tắc khiến một tab rig không tự khởi động. Nếu bạn muốn kernel nằm trong enclosure, hãy mở shell của cuộc hội thoại trước. Xem Cho agent một máy để kiểm thử.

  • Mỗi kernel chạy một ô tại một thời điểm. Hai ô đua nhau trong một trình thông dịch là hai nửa của hai chương trình đan xen vào nhau trong cùng một namespace.
  • Đầu ra bị giới hạn. Một ô nằm trong vòng lặp in sẽ bị cắt ngắn thay vì được phép lấp đầy cửa sổ ngữ cảnh.
  • Bốn ảnh mỗi ô. Một vòng lặp vẽ biểu đồ có thể phát ra một hình ở mỗi lần lặp, và mỗi ảnh là một khoản chi phí cố định lớn trong yêu cầu chứa nó.
  • Kernel chết cùng lượt chạy. Một kernel còn giữ dataframe sau khi cuộc hội thoại đã kết thúc là một chỗ rò rỉ.