All notes

Agent chẳng qua là một vòng while có gu

Bóc hết framework ra, một agent production chỉ còn tầm tám chục dòng. Agent của chúng tôi sống dai qua bốn thế hệ model mà không đổi một nét cấu trúc.

4 phút đọcViết từ Seoul và Nha Trang

Một phần đáng kể công việc hằng ngày của chúng tôi do các AI agent làm: nghiên cứu, sửa code, chạy QA, viết báo cáo. Người ta cứ tưởng chuyện này cần đến một framework điều phối. Thật ra nó chỉ cần một vòng lặp:

let messages = [system, task];
for (let step = 0; step < MAX_STEPS; step++) {
  const res = await llm(messages, TOOLS);
  if (res.type === 'text') return res.text;        // the model decided it is done
  const tool = TOOLS[res.name];                     // no dynamic anything
  const result = await tool.run(res.args);          // sandboxed, permission-gated
  messages.push(res, clip(result, TOOL_BUDGET));    // clip. always.
}
return escalate(messages);                          // never loop forever

Model quyết định bước tiếp theo làm gì. Code nắm quyền có được làm hay không và làm trong bao lâu. Toàn bộ thiết kế nằm gọn ở sự phân vai đó.

Những gì vòng lặp dạy chúng tôi

  • Cắt bớt mọi kết quả trả về từ tool. Chỗ chúng tôi giới hạn quanh 2.000 token; output đầy đủ ghi xuống disk, còn model chỉ nhận phần đầu, phần đuôi và đường dẫn. Trước khi có ngưỡng cắt này, chỉ một build log dài lê thê cũng đủ ngốn sạch cả context window và làm đần luôn phần còn lại của phiên.
  • Vài tool trực giao ăn đứt cả đống tool khôn ngoan. Agent của chúng tôi mang theo sáu đến chín tool với schema chặt chẽ. Cứ mỗi lần thêm một tool tiện tay mà chồng lấn với tool sẵn có, độ chính xác lúc chọn tool lại tụt. Model đắn đo đúng ngay chỗ mà con người cũng sẽ đắn đo.
  • MAX_STEPS là một thuộc tính an toàn, không phải cái núm để tinh chỉnh. Khi cạn ngân sách bước, toàn bộ transcript được đẩy lên cho con người với nguyên vẹn trạng thái. Một agent có thể lặp vô tận thì sớm muộn cũng sẽ lặp vô tận, vào lúc 4 giờ sáng, nhằm vào một API đang bị rate limit.
  • Transcript là JSONL, mà JSONL thì tua lại được. Mỗi bước được ghi nối vào một log mà chúng tôi có thể chạy lại với một model mới hoặc một tool đã sửa. Một nửa việc debug của chúng tôi là tua lại transcript của hôm qua trên code của hôm nay.
  • Đọc thì thoải mái, ghi thì phải qua cổng. Vòng lặp muốn đọc gì trong sandbox của nó cũng được. Nhưng deploy, xóa, thanh toán và tin nhắn gửi ra ngoài đều rời khỏi vòng lặp để đi qua đúng những cái cổng máy móc mà các job cron của chúng tôi vẫn dùng. Chúng tôi không trông cậy vào việc model tự nhớ phải cẩn thận.

Sau bốn lần thay model, vòng lặp vẫn giống hệt đến từng byte. Mọi thứ xung quanh nó đều tốt lên. Một ranh giới trừu tượng tốt cho cảm giác đúng như vậy: thứ thay đổi nhanh được cách ly khỏi thứ tuyệt đối không được đổi.