Harness Engineering实战:多Agent协同、沙箱隔离与Skill自进化 单 Agent 的 Demo 已经跑不通企业落地这条线了。2026 年做 AI 工程化更多团队卡在同一个位置Agent 能力很强但进不了生产流程。它能写代码、能调工具、能自己规划任务可一旦涉及多 Agent 协同、执行环境隔离、技能沉淀、人工审批原本的 prompt 工具调用很快就不够用了。这次我们来看 Harness Engineering。这个词直译是“控制架工程”放在 AI Agent 领域指的是给 Agent 装配一整套“运行框架”模型调用、工具注册、沙箱执行、技能扩展、人工介入、日志审计。企业级多 Agent 协同项目里的沙箱、自进化 Skill、人工介入本质上都是 Harness 层面的设计。这篇文章会把 Harness Engineering 拆成可落地的工程模块讲清楚多 Agent 协同怎么设计、沙箱怎么隔离、Skill 怎么做到自进化、人工介入节点放在哪里然后给出部署验证思路、API 与批量任务接入方式以及一份能直接对照的排错清单。面向后端工程师、AI 平台团队和企业 AI 基建决策者目的是让你看完能判断这套体系值不值得引入引入后第一步该验证什么。1. 核心能力速览能力项说明工程方向Harness EngineeringAgent 运行框架工程化核心模块多 Agent 编排、沙箱隔离、Skill 扩展机制、人工介入审批解决的问题单 Agent 失控风险、多 Agent 协作无序、技能无法复用、执行过程不可审计配置方式Prompt / Workflow / YAML 配置 / API 服务运行形态本地进程、容器化沙箱、常驻 API 服务、消息队列驱动硬件要求取决于模型来源云端 API 或本地模型需按实际环境测试API 能力任务提交、状态查询、结果回传、取消任务、审批操作批量任务支持可通过任务队列 Worker 实现适合场景企业知识库自动化、代码生成与审查辅助、文档处理流水线、专业工具 Agent 化技术栈参考Python / Node.js、Docker、Redis 或 RabbitMQ、LLM 服务要注意Harness Engineering 不像某个一键包项目那样有固定的仓库地址。不同团队落地的形态差异很大。这篇文章给的是工程化思路和通用实现路径代码示例需要用你自己的项目结构替换路径和类名。2. Harness Engineering 是什么多 Agent 为什么需要“工程护栏”先划清一个边界Harness 不是 Agent 本身而是 Agent 赖以运行的那套“壳”。单 Agent 开发时大多数人写的是一段 prompt 几个工具函数。Agent 调模型模型返回 JSON代码执行任务完成。这样做 Demo 没有问题但进入企业环境后几个现实问题会立刻暴露第一Agent 可能执行危险操作。让它分析数据它可能直接写文件、删目录、调系统命令。没有隔离一次事故就足以让项目失去信任。第二Agent 可能陷入死循环。规划任务时反复重试同一个失败步骤消耗 Token 和时间却没有任何进展。第三多 Agent 协作时职责边界模糊。三个 Agent 同时改一个文件结果互相覆盖。没有编排和仲裁协作反而是灾难。第四技能无法沉淀。这周调通的一套操作流程下周另一个 Agent 遇到同类任务又要重新摸索一遍。经验留在对话里不进资产库。Harness Engineering 针对的就是这四个问题。它把“Agent 能做什么、不能做什么、失败怎么处理、过程怎么审计”变成工程设计的一部分而不是靠运气和人工盯梢。从 2026 年的行业实践看AI Coding 领域的 Codex、Claude Code 等工具都在做类似的事把 Agent 装进一个有约束的框架里工具调用要走注册流程文件修改要有权限边界技能包要能被动态加载。Skill 的概念就是从这类工具中演化出来的。企业搭建自己的多 Agent 协同系统时完全可以借鉴这套设计只不过要把约束做得更严、把审计做得更完整。一句话总结Harness Engineering 是 AI Agent 从“能用”走到“可控、可复用、可审计”的必经阶段。3. 多 Agent 协同架构设计3.1 为什么拆成多个 Agent而不是一个全能 Agent全能 Agent 听起来美好实际工程中会遇到三个问题上下文过长。一个 Agent 承载所有任务类型消息列表会迅速膨胀模型容易丢失早期信息。权限控制粗糙。所有能力集中在同一个执行体里意味着要么给全部权限要么什么都不能做。并发效率低。任务串行执行一个环节卡住整体停摆。多 Agent 的核心收益是职责隔离和上下文隔离。代码生成 Agent 只挂代码工具文档解析 Agent 只挂解析工具每个 Agent 的 prompt 保持精简权限按角色分配任务可以并行调度。3.2 协同模式与仲裁机制从材料看多智能体系统MAS的常见做法是“用 prompt 和 workflow 把多个角色、多种工具的 agent 组合起来”。这个描述很准确。实际落地时协同模式主要有三种流水线模式。任务按阶段划分Agent A 的输出是 Agent B 的输入。适合流程固定的场景比如“需求解析 → 代码生成 → 代码审查”。编排者模式。一个 Orchestrator Agent 负责拆解任务、分发给执行 Agent、汇总结果。适合任务类型多、结构不固定的场景。编排者不直接干活只做调度和仲裁。黑板模式。多个 Agent 共享一个任务日志或结果存储区各自读取、补充、更新。适合需要多角度讨论和叠加修改的任务比如方案评审、多轮改写。仲裁是设计重点。当两个 Agent 产生冲突比如对同一段代码给出不同的修改意见系统必须有优先级规则或者把冲突提交给人工作裁决。没有仲裁机制多 Agent 协作就会变成随机覆盖。3.3 简化示例代码下面给一个最小化的多 Agent 调度示例。它不依赖特定框架用 Python 表达核心思想任务队列、Agent 注册表、结果汇总。import asyncio from dataclasses import dataclass from typing import Any dataclass class Agent: name: str role: str tools: list[str] prompt: str async def run(self, task: dict[str, Any]) - dict[str, Any]: # 实际实现中这里会调用 LLM、加载工具、执行沙箱任务 print(f[{self.name}] processing task: {task[title]}) await asyncio.sleep(1) return {agent: self.name, result: fdone: {task[title]}} class Orchestrator: def __init__(self, agents: list[Agent]): self.agents {a.name: a for a in agents} self.results [] async def dispatch(self, task: dict[str, Any]): # 简化路由规则按 task[agent] 指定执行者 agent self.agents.get(task.get(agent)) if not agent: raise ValueError(funknown agent: {task.get(agent)}) result await agent.run(task) self.results.append(result) return result async def main(): agents [ Agent(coder, code_generation, [read_file, write_file], ...), Agent(reviewer, code_review, [read_file, run_lint], ...), ] orchestrator Orchestrator(agents) tasks [ {title: 实现用户登录接口, agent: coder}, {title: 审查登录接口代码, agent: reviewer}, ] for t in tasks: await orchestrator.dispatch(t) print(orchestrator.results) if __name__ __main__: asyncio.run(main())这个示例省略了实际的 LLM 调用和沙箱交互。真实项目里Agent.run()内部会经过模型请求 → 工具调用解析 → 沙箱执行 → 结果回传 → 上下文更新。每一步都要有超时和重试。4. 沙箱、Skill 与人工介入三大工程机制4.1 沙箱Agent 安全执行的隔离边界沙箱是 Harness 中最不能妥协的模块。只要 Agent 有写文件、执行命令、运行代码的能力就必须有沙箱。从行业实践看常见的沙箱实现有四种实现方式隔离强度启动成本适用场景Docker 容器高中大多数生产场景推荐优先考虑Linux 命名空间/Namespace高低进程级隔离适合批量 WorkerWASM 沙箱中低纯代码执行不适合完整系统调用子进程 权限降级低低轻量任务不能防止恶意逃逸Docker 是最稳妥的起点。每个 Agent 任务启动一个临时容器挂载只读的输入目录输出写入独立的输出卷网络按需关闭。容器内部没有宿主目录挂载理论上即使 Agent 乱执行命令也不影响宿主环境。核心配置镜像只装任务需要的依赖尽量精简。挂载目录设为只读除非任务明确需要写文件。设置 CPU、内存上限和最大执行时间。禁止 privileged 模式不挂载 docker.sock。任务结束立即销毁容器。启动沙箱的 Docker 命令模板如下# 输入目录只读挂载输出目录可写限制内存和 CPU超时 60 秒自动杀掉 docker run --rm \ -v /host/input:/app/input:ro \ -v /host/output:/app/output \ --memory2g \ --cpus2 \ --networknone \ --stop-timeout 60 \ sandbox-image:latest \ python /app/run_task.py在 Python 侧可以用subprocess包裹执行过程并配合超时控制import subprocess def run_in_sandbox(image: str, task_id: str): cmd [ docker, run, --rm, -v, f/data/{task_id}/input:/app/input:ro, -v, f/data/{task_id}/output:/app/output, --memory2g, --cpus2, --networknone, image, python, /app/run_task.py ] try: # 120 秒硬超时防止 Agent 任务卡死 result subprocess.run(cmd, capture_outputTrue, textTrue, timeout120) return {stdout: result.stdout, stderr: result.stderr, code: result.returncode} except subprocess.TimeoutExpired: return {error: sandbox task timeout}注意Dify 这类平台也内置了类似的沙箱机制。如果你的 Agent 平台支持沙箱功能优先用平台能力不要重复造轮子。4.2 Skill从一次性提示词到可复用技能资产Skill 是 Harness 中实现“经验复用”的关键模块。普通 prompt 是一次性的写在哪里就只在哪里生效。Skill 则是有结构的、可版本化的、能被多个 Agent 动态加载的能力包。一个 Skill 通常包含四类内容触发条件什么样的任务会命中这个 Skill。系统提示词Agent 执行该任务时的角色和行为规则。工具调用模板完成任务需要调用哪些工具参数是什么。示例与校验规则输入输出示例以及如何判断执行结果是否合格。目录结构示例skills/ code_review/ # Skill 名称 SKILL.yml # 元信息名称、描述、触发条件、版本 prompt.md # 系统提示词 tools/ run_lint.yaml # 工具调用模板 read_diff.yaml examples/ success.md # 输入输出示例 validators.py # 结果校验逻辑SKILL.yml的简化示例name: code_review version: 1.2.0 description: 对代码 diff 进行同行评审输出缺陷列表和修改建议。 triggers: - type: task_tag value: code_review - type: llm_match instruction: 判断任务是否需要代码审查 prompt_file: prompt.md tools: - run_lint - read_diff validators: - require_output_fields: [issues, suggestions] - max_output_length: 3000所谓 Skill 自进化是指 Agent 完成一个任务后如果效果很好系统可以把这个任务的操作序列、关键提示词、工具调用参数提炼成一个新的 Skill或者更新已有 Skill 的示例和校验规则。但这里必须加一个约束自进化不能完全自动化。没有人工审核的自我进化大概率会沉淀出错误模式。合理的流程是Agent 提交“Skill 候选” → 人工审查 → 自动化回归测试 → 合并到 Skill 库 → 发布新版本。每一次 Skill 变更都要有版本记录方便回滚。业内像 Codex Skill、Claude Code Skill 这类工作区也在走同样的路线验证了 Skill 的通用价值。企业搭建自己的 Skill 体系时可以借鉴它们的目录结构和触发机制但内部工具和提示词要结合业务定制。4.3 人工介入企业流程中不可省略的审批节点人工介入不是系统设计失败后的补救而是 Harness 的必要组成部分。有些操作无论 Agent 多可靠都不应该让它独立完成。需要人工介入的典型场景生产环境代码发布、配置变更。删除数据、批量修改数据库。对外发送消息、邮件、工单。涉及支付、合同、个人隐私信息。模型生成结果需要进入正式交付物之前。人工介入的工程化设计核心是状态机。一个任务不只有 running 和 finished 两个状态而是在关键节点插入awaiting_reviewpending → running → awaiting_review → approved → finished │ └── rejected → returned_to_agent / canceled图里表达的是一个任务从提交到完成的流转路径。任务进入待审批状态后Agent 暂停等待人工确认。审批通过继续执行审批拒绝则返回给 Agent 重新处理或直接终止。伪代码示例TASK_STATES [ pending, running, awaiting_review, approved, rejected, canceled, finished, ] def transition(task, from_state, to_state): if to_state not in TASK_STATES: raise ValueError(finvalid state: {to_state}) if task[state] ! from_state: raise RuntimeError(fstate conflict: {task[state]}) task[state] to_state return task审批结果要回传 Agent 上下文。如果任务被拒绝Agent 需要知道拒绝原因然后重新规划。接收到一个“rejected”状态同时携带一条人工反馈比单纯终止任务要有用得多。这也是人工评价反哺 Skill 的入口大量 rejected 案例沉淀下来可以用来改进 Agent 的行为。5. 环境准备与部署启动Harness Engineering 没有统一的一键包但核心依赖是确定的。部署前先核对环境。5.1 环境检查清单依赖项说明操作系统Linux 优先沙箱依赖 Docker 或 Linux 命名空间Python3.10 或更新版本用于 Agent 调度和任务 WorkerNode.js如果需要 Web 控制台或部分 Agent 框架Docker沙箱隔离的核心运行时消息队列Redis 或 RabbitMQ用于批量任务和事件总线LLM 服务云端 API 或本地模型服务如 vLLM、Ollama 部署的模型存储输入素材、输出结果、审计日志目录建议独立分区网络与安全方面生产环境的沙箱容器默认关闭外网。只有 Agent 明确需要访问内部工具、知识库或外部 API 时才单独开放白名单地址。5.2 基于 Docker Compose 的启动骨架下面给一个最小化的 docker-compose 骨架说明 Harness 服务如何组织。实际项目需要按你的 Agent 代码替换镜像和启动命令。version: 3.9 services: orchestrator: build: ./orchestrator environment: - LLM_API_KEY${LLM_API_KEY} - LLM_API_BASE${LLM_API_BASE} - MODEL_NAME${MODEL_NAME} - SOCKET_SERVER0.0.0.0:8321 ports: - 8321:8321 volumes: - ./skills:/app/skills:ro - ./logs:/app/logs depends_on: - redis worker: build: ./worker environment: - SOCKET_SERVERorchestrator:8321 - REDIS_URLredis://redis:6379/0 - MAX_CONCURRENT_AGENTS4 volumes: - ./data:/data depends_on: - orchestrator - redis sandbox: image: python:3.11-slim profiles: [manual] command: [sleep, infinity]启动时分为两步。第一步启动基础服务# 复制环境变量模板填入 LLM API 地址和密钥 cp .env.example .env # 启动编排器和 Worker docker compose up -d orchestrator worker第二步是沙箱镜像构建。沙箱镜像需要预装 Agent 任务所需的依赖比如 Python 包、命令行工具等# 沙箱镜像必须精简依赖越少攻击面越小 docker build -t agent-sandbox:latest -f docker/sandbox.Dockerfile .沙箱镜像的 Dockerfile 示例FROM python:3.11-slim # 只安装任务需要的依赖不加高权限工具 RUN pip install --no-cache-dir requests pyyaml # 默认以非 root 用户运行 RUN useradd --create-home agent USER agent WORKDIR /app COPY run_task.py /app/run_task.py启动完成后通过健康检查接口确认服务状态curl http://127.0.0.1:8321/health如果返回正常 JSON 响应说明编排服务已经启动。如果发现端口冲突修改docker-compose.yml中映射的宿主机端口例如将8321:8321改成18321:8321。6. 功能测试与效果验证Harness 系统启动后不要急着接真实业务。先用一组人工构造的用例验证核心机制。下面的测试矩阵可以作为验收清单。6.1 多 Agent 协同测试测试目的验证任务是否被正确分配给指定 Agent结果能否正确汇总。操作步骤提交一个需要两个 Agent 协作完成的任务比如“生成接口代码并审查”。观察任务状态流转pending → running → finished。检查结果中是否包含两个 Agent 的输出。预期结果任务被拆分为子任务分配给不同 Agent最终汇总返回。判断标准任何 Agent 执行失败都会被单独记录不会影响另一个 Agent 的成功状态。常见失败原因路由规则配置错误任务被分发到不存在的 AgentAgent 返回值格式不统一导致汇总失败。6.2 沙箱隔离测试测试目的确认 Agent 在沙箱中的越界行为不会影响宿主。操作步骤构造一个恶意任务让 Agent 在沙箱中执行echo test /app/output/pwned.txt。执行完成后检查宿主/app/output目录是否有新文件。再测试沙箱内访问外网是否被拒绝。预期结果容器内写操作被隔离在挂载卷范围内宿主目录不受影响无网络权限时外部请求超时。判断标准宿主目录零变化沙箱内文件随容器销毁删除。常见失败原因挂载目录配置为相对路径导致容器内路径和宿主路径重叠容器未设置--networknone仍然有网。6.3 Skill 调用与自进化流程测试测试目的确认 Skill 能被 Agent 动态加载自进化流程具备人工审核节点。操作步骤提交一个命中code_reviewSkill 的任务。查看 Agent 是否加载了prompt.md和run_lint工具。人为触发一次 Skill 更新观察更新请求是否进入待审核状态。预期结果Skill 触发条件正确匹配Agent 输出符合 Skill 定义的结果格式Skill 更新在人工审批前不会被实际写入。判断标准Skill 命中率 100%不相关任务不会误触发。常见失败原因Skill 描述写得过于泛化触发条件过宽版本号未递增发布后被旧版本覆盖。6.4 人工介入流程测试测试目的确认审批节点能正确阻塞任务流。操作步骤提交一个配置了人工审批节点的任务。观察任务状态是否停留在awaiting_review。调用审批接口批准任务观察状态变为approved并继续执行。再构造一个被拒绝的任务确认 Agent 收到拒绝原因。预期结果任务在没有人工操作前不会继续审批后状态正确流转。判断标准状态变更事件完整记录在审计日志中拒绝原因能回传 Agent。常见失败原因状态机缺少异常分支审批接口超时后任务卡死。7. 接口 API 与批量任务调度Harness 平台要接入企业现有系统不能只靠人工在控制台点按钮。必须提供 API 接口。7.1 任务提交 API用 FastAPI 风格描述接口结构。实际接口路径以你的项目为准。from fastapi import FastAPI, HTTPException from pydantic import BaseModel app FastAPI() class TaskRequest(BaseModel): title: str agent: str input: dict skill_tags: list[str] [] need_review: bool False app.post(/tasks) async def submit_task(task: TaskRequest): # 实际实现写入队列返回任务 ID return {task_id: task_20260801_001, status: pending} app.get(/tasks/{task_id}) async def get_task(task_id: str): # 实际实现从存储中查询任务状态 return {task_id: task_id, status: running, result: None}调用方式curl -X POST http://127.0.0.1:8321/tasks \ -H Content-Type: application/json \ -d { title: 审查用户登录接口 diff, agent: reviewer, input: {diff_path: /data/code_diff.txt}, skill_tags: [code_review], need_review: false }返回示例{ task_id: task_20260801_001, status: pending }轮询状态curl http://127.0.0.1:8321/tasks/task_20260801_001返回示例{ task_id: task_20260801_001, status: finished, result: { issues: [ {severity: medium, location: auth.py:42, message: 缺少参数校验} ] } }7.2 Python 调用 API 示例import requests API_BASE http://127.0.0.1:8321 payload { title: 解析合同 PDF 并提取关键条款, agent: document_parser, input: {file: /data/contract.pdf}, skill_tags: [pdf_extract], need_review: True, } resp requests.post(f{API_BASE}/tasks, jsonpayload, timeout30) data resp.json() task_id data[task_id] # 轮询任务结果最多等 30 分钟 import time for _ in range(180): task requests.get(f{API_BASE}/tasks/{task_id}, timeout30).json() if task[status] in (finished, rejected, canceled): print(task) break time.sleep(10) else: print(timeout waiting for task result)7.3 批量任务调度批量任务不建议直接并发跑上百个 Agent优先用队列控制并发度。Redis 列表可以作为轻量队列。import redis import json r redis.Redis(host127.0.0.1, port6379, db0) QUEUE_KEY harness:tasks def enqueue_batch(task_list): for task in task_list: r.rpush(QUEUE_KEY, json.dumps(task)) def worker_loop(queue_key): while True: raw r.blpop(queue_key, timeout5) if raw is None: continue task json.loads(raw[1]) # 交给 Harness 执行注意捕获异常 try: submit_to_harness(task) except Exception: # 失败进入重试队列重试超过 3 次则进入死信队列 retry_task(queue_key, task)批量任务的关键配置有三点并发上限、失败重试次数、死信队列。并发太高会打爆模型 API 限额重试太多次会堆积无效任务。建议并发从 3 到 5 开始根据模型响应延迟逐步调整。8. 资源占用与性能观察Harness 系统的资源消耗主要集中在三个环节LLM 推理、沙箱进程、上下文存储。8.1 LLM 推理消耗如果 Agent 接的是云端 API资源压力主要不在本机而在 Token 消耗和接口延迟。观察指标是单任务 Token 用量和平均每次调用的响应时间。如果接的是本地模型那么显存和内存占用就是核心指标。不同模型、不同量化精度的显存占用差距很大实际数字需要以你部署的模型为准。降低 Token 消耗的方法限制 Agent 最大迭代步数比如max_steps15防止死循环。定时对上下文做摘要压缩把早期的工具调用记录摘要化。Skill 命中后只加载必要工具不把全部工具定义塞进上下文。8.2 沙箱进程消耗每个沙箱容器会占用额外内存和 CPU。镜像越大、依赖越多启动越慢、资源占用越高。批量任务并发过高时沙箱容器数量和内存水位会快速上升。调优方向沙箱镜像保持精简任务结束立即销毁容器。统一限制为 2GB 内存和 2 核 CPU避免单任务拖垮整机。单机并发沙箱数量控制在物理内存允许的范围内建议先测 3 到 5 个并行沙箱再逐步加压。8.3 上下文存储与磁盘占用多 Agent 任务的中间状态、运行日志、输入输出文件都会占用磁盘。任务量大的时候审计日志积累速度会比较快。建议输入素材和输出结果按任务 ID 分目录。日志设置轮转例如按天切割保留最近 30 天。定期清理沙箱残留临时文件。# 清理超过 7 天未访问的沙箱临时目录 find /data/sandbox_tmp -type f -mtime 7 -delete find /data/sandbox_tmp -type d -empty -mtime 7 -delete9. 常见问题与排查方法问题现象可能原因排查方式解决方案Agent 卡在循环中不结束缺少最大迭代步数限制检查任务日志中是否出现高频重复工具调用为 Agent 设置max_steps超出后强制终止沙箱内代码执行报依赖缺失沙箱镜像未安装所需依赖在沙箱中执行pip list对比依赖将依赖写入 Dockerfile 并重新构建镜像Agent 写入宿主目录容器挂载了宿主任意目录检查启动参数中的-v挂载列表输入目录设只读输出目录限定独立目录沙箱任务超时被中断任务本身耗时长或死循环查看超时前后的日志和 CPU 占用区分长任务和死循环长任务用异步执行Skill 始终不被触发触发条件不匹配检查任务标签和 Skill 描述调整 Skill 触发规则增加关键词匹配多 Agent 结果互相覆盖缺少仲裁或锁机制查看两个 Agent 是否写同一文件增加写锁或引入编排者统一合并API 调用长时间无响应任务排队或模型接口超时查看队列长度和模型服务日志异步轮询代替同步等待调大客户端超时批量任务中断后续任务未执行Worker 崩溃或队列消费异常检查 Worker 进程和 RabbitMQ/Redis 状态增加死信队列Worker 自动重启任务 state 变更为 rejected 后 Agent 不知道原因未将人工反馈写入 Agent 上下文检查审批接口返回结构在状态变更事件中携带人工反馈文本自进化 Skill 质量差未经人工审核直接合并检查 Skill 版本记录和测试报告增加人工审核 自动化回归测试流程10. 最佳实践与合规提醒10.1 工程实践建议先小后大。第一个版本只做两个 Agent、一个沙箱、一个 Skill跑通闭环后再扩展。不要一开始就上 20 个 Agent、10 个 Skill 的复杂矩阵。Skill 要有版本管理。Skill 本质上是代码资产应该进 Git 仓库走代码评审。自进化生成的 Skill 候选也必须走评审流程。人工介入节点宁可多不可少。在项目初期把审批节点多放几个观察哪些环节的人工操作是冗余的数据支撑下来再减少。审计日志要完整。谁提交了任务、模型返回了什么、Agent 执行了什么工具、沙箱内发生了什么、人工审批结果是什么都要有记录。这是排查问题的基础也是合规审计的依据。10.2 合规与安全提醒AI Agent 可能涉及数据隐私、版权内容和肖像信息。在处理真实业务数据之前确认以下几点用户数据、商业数据进入模型前是否完成脱敏。涉及人脸、声音、肖像的生成和处理必须获得明确授权。生成内容用于正式交付或商用之前必须经过人工复核。沙箱权限遵循最小化原则不开放不必要的系统权限。所有涉及模型和 Agent 的操作记录必须保留审计痕迹。Harness 的隔离和审批机制本质上就是给 AI 应用套上合规和安全边界。忽略这些边界任何效率提升都可能变成风险敞口。11. 总结这套体系值不值得落地Harness Engineering 不是某个具体工具而是一组工程决策的集合。多 Agent 协同解决的是任务组织和权限隔离沙箱解决的是执行安全Skill 解决的是经验复用人工介入解决的是风险兜底。四者组合在一起Agent 才具备进入企业生产流程的资格。如果你所在团队正在从单 Agent 实验转向多 Agent 协同落地最先验证的不是模型能力而是三件事沙箱能否隔离 Agent 的越界操作。多 Agent 协作的任务分派和结果仲裁是否稳定。人工审批节点能否按预设流程阻塞和放行任务。这三条通了再谈 Skill 沉淀和自进化。最容易踩的坑有两个一是沙箱权限配置过宽容器能访问宿主目录二是 Skill 自进化完全自动化没有人工审核沉淀出一堆错误模式。避开这两个坑Harness 体系才站得住。后续的扩展方向可以往专业工具集成走。比如让 Agent 在沙箱中运行领域专用工具用 Skill 封装专业操作流程配合人工审批机制逐步形成企业自己的 AI 生产能力平台。对 Harness Engineering 有兴趣的建议先用本文的环境清单搭一个最小验证环境把小闭环跑通再决定要不要全面引入。