Lesson 11 · 협업

스스로 일을 찾는 agent

「The agent finds work itself.」사람이 일을 배분하지 않아도 agent가 태스크 보드에서 직접 일을 가져옵니다.

⏱ 약 12 분 · 📝 3 개 인터랙티브 컴포넌트 · 🧑‍💻 기반 shareAI-lab · s11_autonomous_agents.py

"호출 대기"에서 "스스로 일 찾기"로

s09 / s10의 teammate는 수동적입니다: 누군가 메일함을 통해 메시지를 보내야 비로소 움직이고, 끝나면 idle 상태로 돌아가 다시 호출될 때까지 기다립니다.

s11의 autonomous teammate는 능동적입니다: 할 일이 없을 때도 완전히 멈추지 않고, 5초마다 .tasks/ 디렉토리를 스캔합니다—주인 없는 task를 발견하면 claim_task로 인수하고 바로 작업을 시작합니다.

Teammate lifecycle:
  +-------+
  | spawn |
  +---+---+
      |
      v
  +-------+
  | WORK  | <-- LLM tool_use 루프
  +---+---+
      |
      | stop_reason != tool_use OR tool_use("idle")
      v
  +-------+
  | IDLE  | poll 매 5s, 총 12회 = 60s 타임아웃
  +---+---+
      |
      +--> inbox에 새 메시지?  → WORK 재개
      |
      +--> .tasks/ 스캔 중 미인수 발견 → claim → WORK 재개
      |
      +--> 60s 동안 아무것도 없으면 → status = shutdown, 스레드 종료

Auto-claim · 태스크 보드에서 일 "가져오기"

핵심 함수:

def scan_unclaimed_tasks() -> list:
    unclaimed = []
    for f in sorted(TASKS_DIR.glob("task_*.json")):
        task = json.loads(f.read_text())
        if (task.get("status") == "pending"
                and not task.get("owner")
                and not task.get("blockedBy")):
            unclaimed.append(task)
    return unclaimed

세 가지 필터 = pending + owner 없음 + blockedBy 없음. 하나라도 빠지면 안 됩니다.

claim 동작 자체에는 락(_claim_lock)이 걸려 있어, 두 agent가 동시에 같은 unclaimed task를 보고 경쟁하는 것을 방지합니다—락 안에서 한 번 더 읽고, owner가 여전히 비어 있는지 확인한 뒤, "in_progress" 상태와 owner 정보를 디스크에 씁니다.

여러 agent가 동시에 태스크 보드를 스캔하는 시뮬레이션

3명의 teammate가 idle 상태이고 3개의 task가 인수를 기다리고 있습니다. 「다음 스캔」을 클릭해 누가 먼저 가져가는지 확인해보세요.

Identity 재주입 · 압축 후에도 자신이 누구인지 알기

s06에서 배운 것처럼 auto_compact는 messages를 요약으로 교체합니다. autonomous agent가 한두 시간 실행되면 쉽게 트리거될 수 있습니다—압축 후에는 모델이 자신의 이름도, 역할도 모르게 됩니다.

s11의 해법: 새 task를 claim할 때 len(messages) ≤ 3이면(방금 압축된 것), 자동으로 messages 맨 앞에 identity 블록을 삽입합니다:

if len(messages) <= 3:
    messages.insert(0, {
        "role": "user",
        "content": f"<identity>You are 'alice', role: coder, team: my-team. Continue your work.</identity>",
    })
    messages.insert(1, {"role":"assistant", "content": f"I am alice. Continuing."})

이 패턴을 identity reinjection이라고 합니다—인위적으로 구성한 한 라운드의 대화로 "모델에게 자신이 누구인지 알려주어" 역할 감각을 되찾게 합니다.

Interactive

Widget 1 · Task Scanner · agent 3명이 task 3개를 두고 경쟁

alice / bob / charlie 세 명이 모두 idle 상태입니다. 스캔을 클릭해 알파벳 순서로 누가 먼저 첫 번째 미인수 task를 claim하는지 확인해보세요.

.tasks/ 디렉토리
Teammates 상태
모두 idle, 스캔 대기 중
Interactive

Widget 2 · Identity Drift · 압축 후 agent는 자신을 기억하는가

context 압축 전후에 agent가 "당신은 누구입니까?"라는 질문에 어떻게 답하는지 비교합니다. identity 재주입이 없으면 어떻게 될까요?

identity 재주입 없음
identity 재주입 있음
Interactive

Widget 3 · Autonomous vs Assisted · 어떤 역할이 자율 실행에 적합한가

이 역할을 자율 루프로 실행할지, 아니면 수동 대기 상태로 둘지 결정해보세요. "실수의 대가"와 "사람의 개입 빈도"를 고려하세요.

정답 0 / 5