谷歌SEO

谷歌SEO

Products

当前位置:首页 > 谷歌SEO >

Agent Harness 工程核心架构如何拆解?

96SEO 2026-08-03 06:00 4


一个语言模型,每次 API 调用都是独立事件。不记得上一轮说了什么不知道三分钟前调过什么工具,更不会在进程崩溃后从断点恢复。它没有真正的主动性——本质上是被一个 while 循环推着走的。

Agent Harness 工程核心架构如何拆解?

这个 while 循环。加上它周围的一整套基础设施,就是 Harness。

OpenAI 在 年 月 正式把它命名为 "Harness Engineering",并定义为独立学科。在那之前,Codex 的团队已经了 万行生产代码——零手写——靠的不只是模型有多强。很大程度上是 Harness 足够可靠。

至于公式很简单,Agent = Model + Harness。但做起来不简单,

为什么 Demo 跑通了生产环境一塌糊涂

痛点一:成功率骤降

先看一个真实数字:一个 步的工作流。每步 % 成功率,整条链路跑通的概率只有 %。提到 %,也只有 %,

痛点二:错误累计导致灾难

Agent 不是那种"要么对要么错"的程序。其实,它在每一步都面临多个决策分支,每个分支都在累积不确定性。单步的错误率看似可控,乘起来就是灾难。其实,

痛点三:缺乏自动化自愈能力

Demo 看起来好。是因为你盯着它跑,出了问题你手动纠正、重启上下文、换个问法重来。没有人盯着的时候,它需要一个自动化的"你"——一个知道什么时候重试、什么时候放弃、什么时候换方案的运行时程序。

这就是 Harness 要解决的问题。

年的一条主要结论来自 LangChain 自己的实践:同一个模型。Harness 改进后Terminal Bench 排名从第 跳到第,分数从 % 提到 % . Harness 设计的差异可以拉开 分的任务完成率差距,模型没变。

架构拆解这方面。一个 Harness 由哪些层组成

年 月的 arXiv 论文《Architectural Design Decisions in Harnesses》对 个开源 Agent 程序做了实证分析,结论是 % 的程序采用 Agent Loop 作为主要执行模式。但 Loop 只是骨架,真正的差异在上面长出的五层结构。

从第一层来看,推理-行动循环

痛点四:推理与行动脱节导致“脑补”错误

ReAct 循环是 Harness 的心脏。它的结构简单到只有四步循环:

  • Thought → Action → Observation → Thought…怎么说呢,

This loop originates from Yao et al.'s ReAct paper and forces model to verify its thoughts with real-world data instead of hallucinating.

The loop solves two fatal issues of pure CoT:

  • The reasoning process is isolated from external world;wrong assumptions cannot be corrected.
  • The model tends to “hallucinate” facts instead of querying for verification.

说到第二层。工具调用协议

痛点五:工具爆炸式增长带来的决策噪声和成本膨胀

  • 工具数量: Vercel 在 的实验表明,将 Text-to-SQL Agent 从 - 个专用工具砍到 个,成功率从 % 跳到 %,速度快了 倍,token 消耗减少 %。
  • Scheam 设计: Anthropic 在 “Building Effective Agents” 中提出 ACI 原则。要像 UI 那样严谨地写工具描述,包括示例、边界条件和强制格式。
  • MCP 标准化: MCP 把 N×M 的集成问题降为 N+M,实现即插即用;怎么说呢,截至 年 月。MCP SDK 下载量超过,万次。
  • A2A 协议补足 Agent 间通信,使环境更加完整。老实说,

第三层的观点是。上下文管理

痛点六:长上下文导致噪声淹没关键信息 & Token 成本线性增长

  • 静态提示词前置: 程序身份、通用规则和工具 Schema 固定在上下文开头,以最大化 Prefix Caching 收益。
  • 会话历史压缩: 每 N 轮进行一次摘要压缩;压缩策略直接影响记忆质量,需要在“保留关键信息”和“降低噪声”之间平衡。
  • # 工具输出卸载: 大量搜索结果或文件内容存入向量库/SQLite。仅在需要时检索,从而保持对话窗口轻量化。

至于第四层,状态持久化

Eureka 痛点七:崩溃后丢失全部进度 —— 没有持久化就等于没有生产价值。

  • # Event Sourcing: 每个事件以 JSONL 行追加写入磁盘。即使进程在第 X 行崩溃,第 X‑1 行之前的数据仍然安全可恢复。
  • # Ralph Loop: 当上下文接近极限时通过 Stop Hook 将当前状态写盘并注入干净上下文继续执行,实现跨越 Context Boundary 的无缝恢复。
  • 再看beyond,状态永远驻留磁盘。上下文仅作缓存使用,这也是许多大公司正式投入生产的关键原则之一。

至于第五层,错误恢复

Eureka 痛点八:传统二元错误模型无法覆盖 LLM 特有的“软错误”。

  • # 重试:  指数退避 + 随机抖动,降低 -% 的重试风暴;话说回来,适用于网络超时、API 限流等瞬时故障。
  • # 降级:  当主模型不可用或输出质量低于阈值时切换至备选模型 → 本地小模型 → 缓存结果,实现服务连续性。
  • # 熔断:  连续 N 次失败后打开熔断器。暂停调用 M 秒再半开探测,以防雪崩效应蔓延至上游程序。
  • # 重规划:  当工具返回结果与当前计划冲突时回到 Planner 重新生成计划,而不是盲目继续错误方法。
  • `
  • # 人工升级:  所有自动恢复耗尽后暂停 Agent 并通知人工干预。这是最终安全网,也是合规要求常见条款之一。`

从零建立的观点是,用 Python 搭建一个生产骨架

Coding Goal:不是建立通用框架。而是提供“一键跑通”的参考实现,让你可以直接 copy / modify / extend。全程仅依赖标准库 + OpenAI SDK。

  1. 主要循环 — Agent 主 while 循环
  2. 工具注册表 — 定义/验证/分发
  3. 上下文管理 — 提示词组装 & 压缩
  4. 状态持久化 — JSONL 日志 + 崩溃恢复
  5. 权限门控 — 工具调用前安全检查
  6. 错误恢复 — 指数退避 + 熔断器

至于模块一,工具注册表

import json
from typing import Any,Callable
from dataclasses import dataclass,field
@dataclass
class Tool:
""" 一个工具的完整定义:模型看到的描述 + 运行时函数 """
name这方面,str
description: str
parameters: dict # JSON Schema
从fn来看,Callable
requires_approval: bool = False
def to_openai_schema -> dict:
return {
"type"这方面,"function","function": {
至于"name",self.name,"description": self.description,"parameters": self.parameters,},}
def validate_args -> dict:
""" 简易 Schema 校验,仅演示版 """
required = self.parameters.get
properties = self.parameters.get
for key in required:
if key not in args:
raise ValueError
for key。value in args.items:
if key in properties:
expected = properties.get
if expected == "integer" and not isinstance:
raise TypeError.__name__}")
return args
class ToolRegistry:
""" 动态注册 / 查询 / 执行 """
def __init__:
self._tools: dict = {}
def register:
self._tools = tool
def get_schemas -> list:
return
def execute -> str:
tool = self._tools.get
if tool is None:
return f"错误:未找到工具 '{name}'"
再看try,validated = tool.validate_args
result = tool.fn
return str
except as e:
return f"参数错误:{e}"
except Exception as e:
return f"执行错误:{e}"

模块二的观点是,上下文管理器

from dataclasses import dataclass,field
from typing import Any
@dataclass
class Message:
说到role,str # system / user / assistant / tool
content: str
tool_call_id: str | None = None
tool_calls: list | None = None
@dataclass
class ContextManager:
""" 管理对话历史 & 自动压缩 """
system_prompt: str
messages: list = field
compact_at: int = 30 # 超过此轮数触发压缩
keep_recent: int = 10 # 压缩后保留最近 N 条
def build_prompt -> list:
payload =
for msg in self.messages:
entry = {"role": msg.role,"content": msg.content}
if msg.tool_call_id:
entry = msg.tool_call_id
if msg.tool_calls:
entry = msg.tool_calls
payload.append
return payload
def add:
self.messages.append)
def maybe_compact -> int:
""" 若历史过长,用 LLM 摘要压缩 """
if len <= self.compact_at:
            return 0
        old = self.messages
        recent = self.messages
        summary_text = "
".join
        compact_prompt = (
            "

⚠️ 痛点九:“压缩太激进会删掉关键步骤”,务必在触发前检测是否出现卡顿或重复操作!​​​​​​​​​​​​​

模块三的观点是,状态持久化

import json
import os
from datetime import datetime
class Journal:
""" JSONL 日志,每行立即落盘,可用于崩溃恢复 """
def __init__:
self.filepath = filepath
# 初始 line 为已有行数或0,以免重复覆盖
self._line_count = sum) if os.path.exists else 0
def append:
safe_payload = {k:v for k,v in payload.items if k not in }
with open as f:
line_obj = {
再看"line",self._line_count,"timestamp": datetime.now.isoformat,"type": event_type,**safe_payload,}
f.write+"
")
f.flush
os.fsync)
self._line_count += 1
# ---------- 恢复相关 ----------
def replay -> list:
if not os.path.exists:
return
events=
with open as f:
for line in f:
line=line.strip
if line:return events.append)
return events
def restore_messages -> list:
msgs=
for ev in self.replay:
if ev=="user_message":
msgs.append
elif ev=="assistant_message":
m={"role":"assistant"。"content":ev.get}
if "tool_calls" in ev:m=ev
msgs.append
elif ev=="tool_result":
msgs.append({
说到"role","tool","tool_call_id":ev,"content":ev
})
return msgs

再看模块四,权限门控

import json
from enum import Enum
class Decision:
ALLOW ="allow"
DENY ="deny"
ASK ="ask"
class PermissionGate:
""" 工具执行前审查 """
DENY_LIST={
: Decision.ASK,: Decision.ASK,: Decision.ASK,: Decision.ALLOW,: Decision.ALLOW,}
@classmethod
def check->Decision:
for,dec in cls.DENY_LIST.items:
if pattern==name:
if pattern=="write_file":
path=args.get
if any for d in ):
return Decision.DENY
return dec
return Decision.ALLOW
@staticmethod
def request_approval->bool:
summary=json.dumps
print?")
resp=input.strip.lower
return resp=="y"

至于模块五,错误恢复

import time,re random
from functools import wraps
from typing import Any
def retry_with_backoff(max_retries:int=5,base_delay:float=1.0,max_delay:float=30.0,retryable:= ):
""" 指数退避 + 随机抖动 """
def decorator:
@wraps
def wrapper:
last_error=None
for attempt in range:
try这方面。return fn
except retryable as e :
last_error=e
if attemptAny :
if self.state=='open':
if time.time-self.last_failure_time>self.recovery_timeout :
self.state='half_open'
else : raise RuntimeError
try :
result=f
if self.state=='closed':self.failure_count=0
elif self.state=='half_open':self.state='closed';self.failure_count=0
return result
except Exception :
self.failure_count+=1;说起来,self.last_failure_time=time.time
if self.failure_count>=self.failure_threshold:self.state='open'
raise

完整组装 —— 把所有模块串起来

import json
import openai
from openai import OpenAI
class AgentHarness:
""" 可直接部署到生产环境的最小可运行引擎 """
MAX_ITERATIONS=50
def __init__(self,system_prompt:str,tools:ToolRegistry,journal:Journal。model:str='gpt-4o'):
self.ctx=ContextManager
self.tools=tools
self.journal=journal
self.model=model
self.client=OpenAI
self.breaker=CircuitBreaker
# ---------- 主入口 ----------
def run->str :
# 恢复历史
restored=self.journal.restore_messages
if restored :
for m in restored:self.ctx.add
self.journal.append
 # 写入使用者任务并记录日志
self.ctx.add
self.journal.append
for iteration in range:
try : response=self._call_model
except RuntimeError :return '错误:模型调用失败,任务中止。'
choice=response.choices
msg=choice.message
# ----- 完整回答 -----
if msg.content and not msg.tool_calls :
# 保存 assistant 最终回复
self.ctx.add
self.journal.append
return msg.content
# ----- 模型请求调用工具 -----
# 保存含 tool_calls 的 assistant 消息
tc_list=
# 添加至上下文 & 日志
self.ctx.add
self.journal.append('assistant_message',{
'content':msg.content or ''。'tool_calls':tc_list})
# 按顺序执行每个 tool_call
for tc in :
decision=PermissionGate.check)
if decision==Decision.DENY :
result=f'权限拒绝:工具 {tc.function.name} 被阻止'
elif decision==Decision.ASK :
approved=PermissionGate.request_approval)
result=self.tools.execute) \
if approved else f'人工拒绝:{tc.function.name}'
else :
result=self.tools.execute)
# 写入 Tool 返回 & 日志
self.ctx.add
self.journal.append('tool_result',{
'tool_name':tc.function.name,'tool_call_id':tc.id,'content':result}))
# 如有必要进行上下文压缩
self.ctx.maybe_compact
return '达到最大迭代次数,任务未完成。'

@retrywithbackoff) def callmodel: return self.breaker.call( self.client.chat.completions.create,model=self.model,messages=self.ctx.buildprompt),tools=self.tools.getschemas,tool_choice='auto')

@retrywithbackoff) def quicksummarize->str : resp=self.breaker.call( self.client.chat.completions.create。model='gpt-4o-mini',messages= ) return resp.choices.message.content or ''

‬‮‮‪‪‭‭‭       ⁠⁠⁠⁠⁠⁠⁠⁠&&&&&

    . 工具是 Harness 主要对象之一  Datadog “State of AI Engineering ” 报告显示,在生产环境中% 的 LLM 输入 token 是程序提示词——也就是工具定义、行为规则和输出格式。如果 Schema 写得糟糕,即便换更强大的模型也难以提高成功率。把时间花在高质量  上往往能带来比 Prompt 调优更显著 ROI。

 . Planner 与 Generator 分离 
Anthropic 在 年 月发布《Effective Harnesses》里把同级实例拆成 Planner 与 Generator 两个角色,不让同一实例既做计划又执行。从实验来看,两者协作比单体模型提高约%。原因是自我评估不可靠,需要外部审判。. 状态持久化必须从 Day‑Zero 开始 
Demo 阶段常跳过日志落盘,用 `print` 或内存变量凑合。怎么说呢,一旦进入生产,“一次意外 Crash 就把所有进度抹掉”。第一天就实现 Event Sourcing 能省去后期迁移成本。. 分层降级防止单点失效 
推荐至少实现 “Retry → Fallback”。如果仍然频繁出错,再加熔断器与 Re‑plan;最极端情况下才引入 Human‑in‑‑loop。


标签: 架构

SEO优化服务概述

作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。

百度官方合作伙伴 白帽SEO技术 数据驱动优化 效果长期稳定

SEO优化核心服务

网站技术SEO

  • 网站结构优化 - 提升网站爬虫可访问性
  • 页面速度优化 - 缩短加载时间,提高用户体验
  • 移动端适配 - 确保移动设备友好性
  • HTTPS安全协议 - 提升网站安全性与信任度
  • 结构化数据标记 - 增强搜索结果显示效果

内容优化服务

  • 关键词研究与布局 - 精准定位目标关键词
  • 高质量内容创作 - 原创、专业、有价值的内容
  • Meta标签优化 - 提升点击率和相关性
  • 内容更新策略 - 保持网站内容新鲜度
  • 多媒体内容优化 - 图片、视频SEO优化

外链建设策略

  • 高质量外链获取 - 权威网站链接建设
  • 品牌提及监控 - 追踪品牌在线曝光
  • 行业目录提交 - 提升网站基础权威
  • 社交媒体整合 - 增强内容传播力
  • 链接质量分析 - 避免低质量链接风险

SEO服务方案对比

服务项目 基础套餐 标准套餐 高级定制
关键词优化数量 10-20个核心词 30-50个核心词+长尾词 80-150个全方位覆盖
内容优化 基础页面优化 全站内容优化+每月5篇原创 个性化内容策略+每月15篇原创
技术SEO 基本技术检查 全面技术优化+移动适配 深度技术重构+性能优化
外链建设 每月5-10条 每月20-30条高质量外链 每月50+条多渠道外链
数据报告 月度基础报告 双周详细报告+分析 每周深度报告+策略调整
效果保障 3-6个月见效 2-4个月见效 1-3个月快速见效

SEO优化实施流程

我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:

1

网站诊断分析

全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。

2

关键词策略制定

基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。

3

技术优化实施

解决网站技术问题,优化网站结构,提升页面速度和移动端体验。

4

内容优化建设

创作高质量原创内容,优化现有页面,建立内容更新机制。

5

外链建设推广

获取高质量外部链接,建立品牌在线影响力,提升网站权威度。

6

数据监控调整

持续监控排名、流量和转化数据,根据效果调整优化策略。

SEO优化常见问题

SEO优化一般需要多长时间才能看到效果?
SEO是一个渐进的过程,通常需要3-6个月才能看到明显效果。具体时间取决于网站现状、竞争程度和优化强度。我们的标准套餐一般在2-4个月内开始显现效果,高级定制方案可能在1-3个月内就能看到初步成果。
你们使用白帽SEO技术还是黑帽技术?
我们始终坚持使用白帽SEO技术,遵循搜索引擎的官方指南。我们的优化策略注重长期效果和可持续性,绝不使用任何可能导致网站被惩罚的违规手段。作为百度官方合作伙伴,我们承诺提供安全、合规的SEO服务。
SEO优化后效果能持续多久?
通过我们的白帽SEO策略获得的排名和流量具有长期稳定性。一旦网站达到理想排名,只需适当的维护和更新,效果可以持续数年。我们提供优化后维护服务,确保您的网站长期保持竞争优势。
你们提供SEO优化效果保障吗?
我们提供基于数据的SEO效果承诺。根据服务套餐不同,我们承诺在约定时间内将核心关键词优化到指定排名位置,或实现约定的自然流量增长目标。所有承诺都会在服务合同中明确约定,并提供详细的KPI衡量标准。

SEO优化效果数据

基于我们服务的客户数据统计,平均优化效果如下:

+85%
自然搜索流量提升
+120%
关键词排名数量
+60%
网站转化率提升
3-6月
平均见效周期

行业案例 - 制造业

  • 优化前:日均自然流量120,核心词无排名
  • 优化6个月后:日均自然流量950,15个核心词首页排名
  • 效果提升:流量增长692%,询盘量增加320%

行业案例 - 电商

  • 优化前:月均自然订单50单,转化率1.2%
  • 优化4个月后:月均自然订单210单,转化率2.8%
  • 效果提升:订单增长320%,转化率提升133%

行业案例 - 教育

  • 优化前:月均咨询量35个,主要依赖付费广告
  • 优化5个月后:月均咨询量180个,自然流量占比65%
  • 效果提升:咨询量增长414%,营销成本降低57%

为什么选择我们的SEO服务

专业团队

  • 10年以上SEO经验专家带队
  • 百度、Google认证工程师
  • 内容创作、技术开发、数据分析多领域团队
  • 持续培训保持技术领先

数据驱动

  • 自主研发SEO分析工具
  • 实时排名监控系统
  • 竞争对手深度分析
  • 效果可视化报告

透明合作

  • 清晰的服务内容和价格
  • 定期进展汇报和沟通
  • 效果数据实时可查
  • 灵活的合同条款

我们的SEO服务理念

我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。

提交需求或反馈

Demand feedback