Agent Harness 是什么?
AI 大模型开发

Agent Harness 是什么?

JACIN36 分钟阅读

Agent Harness 工程完全指南#

什么是 Harness Engineering?#

Harness Engineering(驾驭工程 / 缰绳工程) 是现代 AI Agent 开发的核心方法论。其本质是:给强大但不可控的大模型套上"缰绳、马鞍和刹车",让 Agent 能在真实世界的长时、复杂任务中稳定、可靠、可控地运行。

核心理念#

text
Agent = Model + Harness

其中:
- Model:大语言模型(LLM)
- Harness:除了模型之外的一切运行环境、编排、工具、记忆、权限和反馈闭环

这个概念由多位业界领袖推动:

  • Martin Fowler - 将 harness 定义为"agent 里除了模型之外的一切"
  • OpenAI - 强调 harness engineering 是让 agent 持续迭代、审查、修复并推进到完成的运行机制
  • Anthropic - 通过 Managed Agents 和 MCP 协议实现企业级 harness
  • Salesforce - 在 agent harness 中强调 validator 和安全防护

Harness 的六层架构#

1. 接入层(Ingestion Layer)#

负责统一承接各种输入并标准化请求。

职责:

  • Chat/API 请求处理
  • WebSocket / SSE 流式返回
  • 用户身份、租户、会话上下文管理
  • 长对话、流式和多轮状态管理

实现要点:

python
class IngestLayer:
    def __init__(self):
        self.session_manager = SessionManager()
        self.request_normalizer = RequestNormalizer()

    async def handle_request(self, raw_request):
        """标准化请求"""
        # 提取用户身份和租户信息
        user_context = self.extract_user_context(raw_request)

        # 获取或创建会话
        session = self.session_manager.get_or_create(user_context)

        # 标准化请求格式
        normalized = self.request_normalizer.normalize(raw_request)

        return {
            "user_context": user_context,
            "session": session,
            "request": normalized
        }

关键设计:

  • 复杂 agent 不是单次调用,而是 long-running、stateful 的过程
  • 必须有稳定的 request/session 容器
  • 支持流式返回和实时更新

2. Orchestrator 层(编排层)#

这是 harness 的核心,实现受控的 agent loop。

职责:

  • Prompt 组装
  • Tool 选择
  • 执行循环
  • 状态推进
  • 中断 / Fallback / Retry 机制

TAO/ReAct Loop 实现:

python
class Orchestrator:
    def __init__(self, model, tools, memory):
        self.model = model
        self.tools = tools
        self.memory = memory
        self.max_iterations = 10

    async def run(self, user_query, session):
        """执行受控的 agent loop"""
        context = self.memory.get_context(session)
        iteration = 0

        while iteration < self.max_iterations:
            # 1. 组装上下文
            prompt = self.assemble_prompt(user_query, context)

            # 2. 调用模型
            response = await self.model.generate(prompt)

            # 3. 解析动作
            action = self.parse_action(response)

            if action.type == "tool_call":
                # 4. 执行工具
                result = await self.execute_tool(action)

                # 5. 把结果回填
                context.append({
                    "action": action,
                    "result": result
                })

            elif action.type == "final_answer":
                return action.content

            iteration += 1

        return "Max iterations reached"

    def assemble_prompt(self, query, context):
        """组装 prompt"""
        return f"""
Current Task: {query}

Context:
{self._format_context(context)}

Available Tools:
{self._format_tools()}

Please think step by step and decide your next action.
"""

    async def execute_tool(self, action):
        """执行工具并处理错误"""
        try:
            tool = self.tools.get(action.tool_name)
            result = await tool.execute(action.params, timeout=30)
            return {"status": "success", "result": result}
        except Exception as e:
            return {"status": "error", "error": str(e)}

关键特性:

  • 受控的循环,不是让模型无限自由发挥
  • 支持中断和 fallback 机制
  • 可配置的最大迭代次数
  • 完整的错误处理

3. Tool 层(工具层)#

统一的工具注册、管理和执行。

职责:

  • 工具名、描述、参数 schema 管理
  • 白名单和权限边界
  • 只读 / 写操作分级
  • Timeout、Retry、熔断机制
  • 标准化结果返回

最佳实践:

  • 先从 3-5 个最核心的工具开始
  • 避免 tool sprawl(工具过多导致模型困惑)
  • 把 schema 和错误语义做稳
  • 逐步扩展工具集

实现示例:

python
class ToolRegistry:
    def __init__(self):
        self.tools = {}
        self.permissions = {}

    def register_tool(self, name, func, schema, permission_level="read"):
        """注册工具"""
        self.tools[name] = {
            "func": func,
            "schema": schema,
            "permission_level": permission_level,
            "retry_count": 3,
            "timeout": 30
        }

    async def execute(self, tool_name, params, user_context):
        """执行工具"""
        # 1. 权限检查
        if not self.check_permission(tool_name, user_context):
            raise PermissionError(f"User cannot access {tool_name}")

        # 2. 参数验证
        if not self.validate_params(tool_name, params):
            raise ValueError(f"Invalid params for {tool_name}")

        # 3. 执行工具(带重试)
        tool_config = self.tools[tool_name]
        for attempt in range(tool_config["retry_count"]):
            try:
                result = await asyncio.wait_for(
                    tool_config["func"](**params),
                    timeout=tool_config["timeout"]
                )
                return result
            except asyncio.TimeoutError:
                if attempt == tool_config["retry_count"] - 1:
                    raise
            except Exception as e:
                if attempt == tool_config["retry_count"] - 1:
                    raise

        return None

    def get_tool_definitions(self, user_context):
        """获取用户可用的工具定义"""
        available_tools = []
        for name, config in self.tools.items():
            if self.check_permission(name, user_context):
                available_tools.append({
                    "name": name,
                    "description": config["schema"].get("description"),
                    "parameters": config["schema"].get("parameters")
                })
        return available_tools

4. Memory / Context 层(记忆层)#

企业级 agent 的记忆管理系统。

职责:

  • 短期记忆:当前任务状态、最近窗口、滚动摘要
  • 长期记忆:偏好、历史事实、跨会话信息
  • 上下文预算管理
  • 按需召回
  • 压缩策略

实现示例:

python
class MemorySystem:
    def __init__(self, max_context_tokens=4000):
        self.short_term = []  # 当前会话
        self.long_term = {}   # 跨会话
        self.max_tokens = max_context_tokens

    def add_short_term(self, item):
        """添加短期记忆"""
        self.short_term.append(item)
        self._manage_context_budget()

    def _manage_context_budget(self):
        """管理上下文预算"""
        total_tokens = sum(self._count_tokens(item) for item in self.short_term)

        if total_tokens > self.max_tokens:
            # 使用滚动摘要压缩
            self.short_term = self._compress_with_summary()

    def _compress_with_summary(self):
        """使用摘要压缩历史"""
        # 保留最近的 N 条
        recent = self.short_term[-5:]

        # 对早期的进行摘要
        if len(self.short_term) > 5:
            early = self.short_term[:-5]
            summary = self._generate_summary(early)
            return [{"type": "summary", "content": summary}] + recent

        return recent

    def recall(self, query):
        """按需召回相关记忆"""
        # 从短期和长期记忆中检索相关信息
        relevant = []

        # 短期记忆(完整)
        relevant.extend(self.short_term)

        # 长期记忆(相关的)
        for key, value in self.long_term.items():
            if self._is_relevant(query, key):
                relevant.append(value)

        return relevant

关键原则:

  • 上下文预算管理(不是存得多)
  • 按需召回(不是全部加载)
  • 压缩策略(滚动摘要)
  • 不让记忆污染当前任务

5. Guardrails / Runtime Safety 层(安全防护层)#

企业场景必须有的安全防护。

职责:

  • Prompt injection 防护
  • 敏感工具拦截
  • 输出校验
  • 高风险操作二次确认
  • Shell / 文件 / 网络沙盒
  • 审计日志

实现示例:

python
class SafetyGuardrails:
    def __init__(self):
        self.injection_patterns = [
            r"ignore previous instructions",
            r"[REDACTED]",
            r"disregard",
        ]
        self.sensitive_tools = ["delete_database", "execute_shell"]

    def validate_input(self, user_input):
        """检测 prompt injection"""
        for pattern in self.injection_patterns:
            if re.search(pattern, user_input, re.IGNORECASE):
                raise SecurityError("Potential prompt injection detected")
        return True

    def validate_tool_call(self, tool_name, params):
        """验证工具调用"""
        # 检查敏感工具
        if tool_name in self.sensitive_tools:
            return {
                "allowed": False,
                "reason": "Sensitive tool requires approval",
                "requires_confirmation": True
            }

        # 检查参数
        if self._contains_dangerous_params(params):
            return {
                "allowed": False,
                "reason": "Dangerous parameters detected"
            }

        return {"allowed": True}

    def validate_output(self, output):
        """校验输出"""
        # 检查敏感信息泄露
        if self._contains_sensitive_info(output):
            return self._redact_sensitive_info(output)

        return output

    def log_audit(self, event):
        """审计日志"""
        logger.info(f"AUDIT: {event}")

四层安全控制(来自 Skills 执行):

  1. 提示词约束 - 在 SKILL.md 中明确允许和禁止的操作
  2. 命令白名单 - 执行前校验,只允许特定命令
  3. 沙盒隔离 - 在 Docker 或容器中执行,限制资源
  4. 执行后审计 - 日志记录、敏感信息脱敏、结果过滤

6. 观测与评测层(Observability Layer)#

企业级 agent 必须有的可观测性。

职责:

  • Trace 和日志
  • Tool call 日志
  • Latency / Token / Cost 监控
  • Bad case 归因
  • Prompt / Harness 版本管理
  • A/B 和回归评测

实现示例:

python
class ObservabilitySystem:
    def __init__(self):
        self.traces = []
        self.metrics = {}

    def start_trace(self, session_id, query):
        """开始追踪"""
        trace = {
            "session_id": session_id,
            "query": query,
            "start_time": time.time(),
            "steps": []
        }
        self.traces.append(trace)
        return trace

    def log_step(self, trace, step_type, data):
        """记录步骤"""
        step = {
            "type": step_type,  # "model_call", "tool_call", "decision"
            "timestamp": time.time(),
            "data": data
        }
        trace["steps"].append(step)

    def record_metrics(self, trace):
        """记录指标"""
        duration = time.time() - trace["start_time"]

        self.metrics[trace["session_id"]] = {
            "duration": duration,
            "steps": len(trace["steps"]),
            "tool_calls": sum(1 for s in trace["steps"] if s["type"] == "tool_call"),
            "model_calls": sum(1 for s in trace["steps"] if s["type"] == "model_call"),
            "tokens_used": self._estimate_tokens(trace),
            "cost": self._estimate_cost(trace)
        }

    def analyze_failure(self, trace):
        """分析���败原因"""
        # 是模型错了?
        # 是工具错了?
        # 是路由错了?
        # 还是上下文污染了?

        for step in trace["steps"]:
            if step["type"] == "tool_call" and step.get("error"):
                return {
                    "reason": "tool_error",
                    "tool": step["data"]["tool_name"],
                    "error": step["data"]["error"]
                }

        return {"reason": "unknown"}

    def get_dashboard(self):
        """获取仪表板数据"""
        return {
            "total_traces": len(self.traces),
            "avg_duration": np.mean([m["duration"] for m in self.metrics.values()]),
            "success_rate": self._calculate_success_rate(),
            "cost_per_query": self._calculate_avg_cost()
        }

Hermes Agents:最新的 Agent 框架#

虽然搜索中未找到官方的 "Hermes Agents" 定义,但基于业界趋势,我们可以推断其特点:

推测的 Hermes Agents 特性#

Hermes 在希腊神话中是信使之神,暗示:

  • 快速、高效的消息传递
  • 多方通信和协调
  • 智能的路由和转发

可能的特性:

python
class HermesAgent:
    """推测的 Hermes Agent 实现"""

    def __init__(self):
        self.harness = AgentHarness()
        self.message_router = MessageRouter()
        self.multi_agent_coordinator = MultiAgentCoordinator()

    async def handle_message(self, message):
        """处理消息"""
        # 1. 智能路由 - 决定由哪个 agent 处理
        target_agent = self.message_router.route(message)

        # 2. 执行 - 通过 harness 执行
        result = await self.harness.execute(message, target_agent)

        # 3. 协调 - 如果需要多个 agent 协作
        if result.requires_coordination:
            result = await self.multi_agent_coordinator.coordinate(result)

        return result

    async def coordinate_multi_agent(self, task):
        """多 agent 协调"""
        # 分解任务
        subtasks = self.decompose_task(task)

        # 分配给不同 agent
        results = await asyncio.gather(*[
            self.harness.execute(subtask, agent)
            for subtask, agent in zip(subtasks, self.agents)
        ])

        # 合并结果
        return self.merge_results(results)

Harness 与 MCP、Skills 的关系#

三层架构对比#

text
┌────────────��────────────────────────────┐
│         Harness Engineering             │
│  (Agent 运行时系统 - 完整的编排框架)      │
├─────────────────────────────────────────┤
│                                         │
│  ┌──────────────────────────────────┐  │
│  │  Skills (本地工作流)              │  │
│  │  - SKILL.md 定义                 │  │
│  │  - 本地脚本执行                   │  │
│  │  - 适合单机、简单工作流           │  │
│  └──────────────────────────────────┘  │
│                                         │
│  ┌──────────────────────────────────┐  │
│  │  MCP (远程能力接入)               │  │
│  │  - 标准化协议                     │  │
│  │  - 远程服务器                     │  │
│  │  - 适合分布式、大规模系统         │  │
│  └──────────────────────────────────┘  │
│                                         │
└─────────────────────────────────────────┘

集成方式#

python
class IntegratedHarness:
    """集成 Skills 和 MCP 的 Harness"""

    def __init__(self):
        self.skills_executor = SkillsExecutor()
        self.mcp_client = MCPClient()
        self.orchestrator = Orchestrator()

    async def execute_task(self, task):
        """执行任务"""
        # 1. 分析任务类型
        task_type = self.analyze_task(task)

        # 2. 选择执行方式
        if task_type == "local_workflow":
            # 使用 Skills
            return await self.skills_executor.execute(task)

        elif task_type == "distributed_service":
            # 使用 MCP
            return await self.mcp_client.call_tool(task)

        elif task_type == "complex_orchestration":
            # 使用 Harness 编排
            return await self.orchestrator.run(task)

最佳实践总结#

1. 设计原则#

  • 最小化工具集 - 从 3-5 个核心工具开始
  • 清晰的边界 - 每个工具职责单一
  • 可观测性优先 - 能追踪每一步
  • 安全第一 - 多层防护机制
  • 渐进式扩展 - 逐步增加复杂度

2. 实现步骤#

  1. 第一阶段 - 建立基础 harness

    • 接入层 + Orchestrator 层
    • 3-5 个核心工具
    • 基础日志
  2. 第二阶段 - 增强可靠性

    • 完整的 Memory 系统
    • 安全防护层
    • 详细的 Trace
  3. 第三阶段 - 企业级功能

    • 多 agent 协调
    • A/B 测试框架
    • 成本优化

3. 常见陷阱#

  • ❌ 工具过多导致模型困惑
  • ❌ 缺少上下文预算管理
  • ❌ 没有安全防护
  • ❌ 无法追踪失败原因
  • ❌ 过度依赖模型能力

关键资源#

  • Martin Fowler - Agent 架构思想领袖
  • OpenAI - Agents 工程最佳实践
  • Anthropic - Managed Agents 和 MCP 协议
  • Salesforce - Agent Harness 安全防护
  • LangGraph - 开源 Agent 编排框架

总结#

Harness Engineering 是从"堆模型参数"转向"可控、可观测、可上线的运行时系统"的范式转变。

核心要点:

  • Agent = Model + Harness
  • Harness 是除了模型之外的一切
  • 六层架构提供完整的企业级支持
  • 可观测性和安全防护是关键
  • 与 MCP、Skills 形成完整的 AI 应用生态

评论

还没有评论,来发第一个吧