Урок 3. Harness и ограждения

Модель без обвязки опасна. Harness — вся инфраструктура вокруг модели: контекст, инструменты и три защитных слоя — ограничения (что нельзя), проверка (правильно ли сделано), исправление (как восстановиться). Расширенная формула: Агент = Модель + Harness.

    вызов инструмента
        │
        ▼
┌───────────────┐
│1. БЕЛЫЙ СПИСОК│──▶ «отказ»
└───────┬───────┘
        │ есть
        ▼
┌───────────────┐
│ 2. ВЫПОЛНЕНИЕ │──────▶ «ошибка перехвачена»
└───────┬───────┘
        │ результат
        ▼
┌───────────────┐
│  3. ПРОВЕРКА  │──────▶ «переспросить»
└───────┬───────┘
        │ ок
        ▼
    наблюдение в контекст

Что прочитать

В коде

Три слоя умещаются в одну обёртку над вызовом инструмента:

def run_tool(call):
    fn = TOOLS.get(call["tool"])
    if not fn:                          # слой 1: белый список
        return "Инструмент не найден"
    try:
        result = fn(**call["args"])     # слой 2: перехват падения
    except Exception as e:
        return f"Инструмент упал: {e}"
    if result is None:                  # слой 3: проверка результата
        return "Инструмент вернул пустоту"
    return result
function runTool(call) {
  const fn = TOOLS[call.tool];
  if (!fn) return "Инструмент не найден";        // слой 1
  try {
    const result = fn(call.args || {});           // слой 2
    if (result === undefined || result === null)  // слой 3
      return "Инструмент вернул пустоту";
    return String(result);
  } catch (e) {
    return "Инструмент упал: " + e;
  }
}

Обрати внимание: ошибки инструмента не роняют агента — они возвращаются в контекст как наблюдение, и LLM может поправиться на следующем шаге.

Практика

Для агента из урока 1 придумай три ограждения: одно «нельзя», одну проверку результата и один способ восстановиться после ошибки. Затем оберни любую свою функцию в run_tool из примера.

Связано: Урок 2. Цикл ReAct, Урок 4. Инструменты