Урок 11 · сотрудничество

Агент, который находит работу сам

«Агент сам находит работу». Для отправки заказов не нужны люди, всю работу возьмет на себя с доски задач.

⏱ ~12 мин · 📝 3 интерактивных компонента · 🧑‍💻 На основе shareAI-lab · s11_autonomous_agents.py

От «пробуждения» до «поиска собственной работы»

Командник s09/s10 пассив: кому-то нужно отправить сообщение через почтовый ящик, прежде чем оно начнет работать; когда это будет сделано, он бездействует и снова просыпается.

Автономный товарищ по команде S11 Активен: он не останавливается, когда нет работы. Он будет сканировать каталог .tasks/ каждые 5 секунд — когда он увидит задачу, которой никто не владеет, claim_task затребует ее и начнет работать.

Жизненный цикл товарища по команде:
  +-------+
  | спавн |
  +---+---+
      |
      в
  +-------+
  | РАБОТА | <-- Цикл LLMtool_use
  +---+---+
      |
      | stop_reason !=инструмент_использование ИЛИ инструмент_использование("бездействующий")
      в
  +-------+
  | холостой ход | опрос каждые 5 секунд, всего 12 раз = таймаут 60 секунд
  +---+---+
      |
      +--> Новые новости в почтовом ящике?  → возобновить РАБОТУ
      |
      +--> просканировать .tasks/, найдено невостребованное → заявить → возобновить РАБОТУ
      |
      +--> 60 секунд, ничего не ждет → статус = завершение работы, поток завершается

Автоматическая заявка · «Принимать заказы» с доски задач

Основные функции:

def scan_unclaimed_tasks() -> список:
    невостребованный = []
    for f in отсортировано(TASKS_DIR.glob("task_*.json")):
        задача = json.loads(f.read_text())
        if (task.get("status") == "pending"
                и не Task.get("owner")
                и not Task.get("blockedBy")):
            невостребованный.append(задача)
    возврат невостребованных

Три фильтра = ожидание + отсутствие владельца + отсутствие блокировки. Оба незаменимы.

Само действие утверждения имеет блокировку (_claim_lock), чтобы предотвратить одновременный захват двумя агентами одной и той же невостребованной задачи — прочитайте блокировку еще раз, проверьте, пуст ли еще владелец, а затем запишите на диск метку «in_progress» + владельца.

Имитируйте несколько агентов для одновременного сканирования доски задач.

3 товарища по команде находятся в состоянии ожидания, и 3 задания ждут, чтобы их забрали. Нажмите «Сканировать следующий раунд», чтобы узнать, кто получит его первым.

Повторное внедрение личности. Вы все равно знаете, кем вы являетесь после сжатия.

s06 упомянул, что auto_compact заменит сообщения сводкой. Автономный агент легко запускается после нескольких часов работы — после сжатия модель не знает ни его имени, ни роли.

Хитрость S11: при запросе новой задачи, если len(messages) ≤ 3 (что указывает на то, что она только что была сжата), автоматически вставляется идентификационный блок в заголовок:

if len(сообщения) <= 3:
    messages.insert(0, {
        "роль": "пользователь",
        "content": f"<identity>Вы 'алиса', роль: программист, команда: my-team. Продолжайте работу.</identity>",
    })
    messages.insert(1, {"role":"ассистент", "content": f"Я Алиса. Продолжаю."})

Этот режим называется переинъекция идентичности — он использует искусственно созданный раунд диалога, чтобы «сообщить модели, кто она такая», чтобы она могла восстановить свой характер.

Интерактив

Виджет 1 · Сканер задач · 3 агента выполняют 3 задачи

Алиса/Боб/Чарли все бездельничают. Нажмите «Сканировать», чтобы увидеть, кто претендует на первую невостребованную задачу в алфавитном порядке.

.tasks/ 目录
Teammates 状态
所有人都 idle,等着扫
Интерактив

Виджет 2 · Дрейф идентичности · Помнит ли агент себя после сжатия?

Сравнение ответа агента на вопрос «Кто вы?» до и после сжатия контекста моделирования. Что происходит без повторного внедрения идентичности?

没有 identity 重注入
有 identity 重注入
Интерактив

Виджет 3 · Автономный и ассистируемый · Какие роли подходят для автономии

Решите, позволить ли этой роли работать в автономном цикле или находиться в пассивном режиме ожидания. Подумайте о «цене потери контроля» и «частоте человеческого вмешательства».

答对 0 / 5