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 执行):
- 提示词约束 - 在 SKILL.md 中明确允许和禁止的操作
- 命令白名单 - 执行前校验,只允许特定命令
- 沙盒隔离 - 在 Docker 或容器中执行,限制资源
- 执行后审计 - 日志记录、敏感信息脱敏、结果过滤
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. 实现步骤#
-
第一阶段 - 建立基础 harness
- 接入层 + Orchestrator 层
- 3-5 个核心工具
- 基础日志
-
第二阶段 - 增强可靠性
- 完整的 Memory 系统
- 安全防护层
- 详细的 Trace
-
第三阶段 - 企业级功能
- 多 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 应用生态
评论
还没有评论,来发第一个吧
