一文搞懂 Harness Engineering 五大主流设计范式

0 阅读17分钟

设计Agent就像盖房子,你得先选对结构 —— 砖混、框架还是钢结构,再按图纸砌砖,而不是先乱堆一堆砖头,再想怎么让它不塌。Harness Engineering 的设计范式,就是经过 OpenAI、LangChain、Anthropic 这些大厂生产验证过的「Agent 架构图纸」,是让你的 Agent 从 Demo 走向生产的核心骨架。 image.png

今天这篇文章,我把5 大主流 Harness Engineering 设计范式全拆解透了,每个范式都讲透适用场景、核心架构、可直接复制的代码、避坑指南,看完你就能直接套用到自己的项目里,不管是个人提效还是团队生产,都能用。

前置认知:到底什么是 Harness 设计范式?

先给大家一个面试能直接说的标准答案,一句话拉开你和 90% 人的差距:Harness 设计范式,是经过生产验证的、可复用的 Harness 架构设计模式,它定义了模型如何与系统交互、任务如何流转、规则如何执行、反馈如何闭环,解决的是「Agent 输出不可控、长任务易失败、场景难扩展」的核心问题。

再直白点说:普通 ReAct 循环是 “给 AI 一把锤子,让它自己看着办”,而 Harness 范式是 “给 AI 搭了一条完整的生产线,每一步该干什么、不能干什么、干错了怎么办,全给它定死了,出来的结果稳定可控”。

范式一:单 Agent 全闭环范式 —— 新手入门必学,80% 的场景都能用

这是所有 Harness 范式的基础,也是个人开发者、小工具场景用得最多的范式,OpenAI 官方说的「人类掌舵,智能体执行」,最小闭环就是这个范式。

【适用场景】

个人提效工具、简单自动化任务、单一场景小 Agent、新手入门学习、面试 Demo 快速落地。比如:自动写周报、批量处理 Excel、简单接口测试、单功能代码生成。

【核心设计思想】

一个 Agent,一套 Harness,一个完整闭环。把「规则注入→任务执行→工具调用→结果校验→失败重试→结果输出」全链路封在一个 Harness 里,没有复杂的调度,极简、稳定、易维护,彻底解决普通 ReAct“输出不可控、干错了没人管” 的问题。

image.png

【可直接落地的代码示例】

Python 实现的完整单 Agent 闭环 Harness,复制就能改了用:

from openai import OpenAI

client = OpenAI()

class SingleAgentHarness:
    """单Agent全闭环Harness范式实现"""
    def __init__(self, system_rules: str, max_retry: int = 3):
        self.system_rules = system_rules  # Harness核心:定死行为边界
        self.max_retry = max_retry        # 重试兜底机制
        self.conversation_history = []     # 会话状态管理

    def _tool_call_control(self, tool_name: str, params: dict) -> str:
        """Harness工具管控:白名单机制,防止AI乱调用工具"""
        allowed_tools = ["read_file", "write_file", "run_bash", "excel_process"]
        if tool_name not in allowed_tools:
            return f"错误:禁止调用工具{tool_name},仅允许调用{allowed_tools}"
        # 此处可扩展具体工具实现
        return f"工具{tool_name}执行完成,参数:{params}"

    def _result_validate(self, result: str, task: str) -> tuple[bool, str]:
        """Harness闭环核心:后置结果校验,不合格直接打回"""
        validate_prompt = f"""
        核心任务:{task}
        交付结果:{result}
        校验规则:
        1. 是否完整完成核心任务
        2. 是否符合预设的系统规则
        3. 是否有错误、遗漏、不符合要求的内容
        只输出【PASS】或【FAIL】,并说明具体原因
        """
        response = client.chat.completions.create(
            model="gpt-4o",
            messages=[{"role": "user", "content": validate_prompt}],
            temperature=0
        )
        validate_result = response.choices[0].message.content
        return "PASS" in validate_result, validate_result

    def run(self, task: str) -> str:
        """Harness全链路闭环执行入口"""
        # 1. 前置规则注入,从源头管控行为
        self.conversation_history = [
            {"role": "system", "content": self.system_rules},
            {"role": "user", "content": f"核心任务:{task},严格遵守系统规则执行"}
        ]
        retry_count = 0

        while retry_count < self.max_retry:
            # 2. 模型推理执行
            response = client.chat.completions.create(
                model="gpt-4o",
                messages=self.conversation_history,
                temperature=0.3
            )
            result = response.choices[0].message.content
            self.conversation_history.append({"role": "assistant", "content": result})

            # 3. 工具调用管控
            if "调用工具" in result:
                tool_result = self._tool_call_control("demo_tool", {"param": "demo"})
                self.conversation_history.append({"role": "user", "content": f"工具执行结果:{tool_result}"})
                continue

            # 4. 后置结果校验,闭环核心
            is_pass, validate_msg = self._result_validate(result, task)
            if is_pass:
                return f"任务执行完成:\n{result}\n校验结果:{validate_msg}"
            
            # 5. 失败重试,注入错误信息
            retry_count += 1
            self.conversation_history.append({
                "role": "user",
                "content": f"结果不符合要求,失败原因:{validate_msg},请重新修改,重试次数:{retry_count}/{self.max_retry}"
            })

        return f"任务执行失败,达到最大重试次数,最终结果:{result}"

# 直接使用示例
if __name__ == "__main__":
    # 定义Harness核心规则,定死Agent的行为边界
    system_rules = """
    你是Java代码生成助手,必须严格遵守以下规则:
    1. 所有代码符合SpringBoot 3.2规范,严格遵循分层架构
    2. 所有入参必须做校验,禁止使用System.out.println,必须用SLF4J日志
    3. 所有SQL必须防止注入,必须使用参数化查询
    4. 生成的代码必须包含完整注释、单元测试
    """
    # 初始化Harness
    harness = SingleAgentHarness(system_rules=system_rules, max_retry=3)
    # 执行任务
    result = harness.run("生成用户管理CRUD接口,包含Controller、Service、Repository、Entity")
    print(result)

【避坑指南】

  1. 工具白名单越短越稳定,80% 的场景只需要 3-5 个核心工具就够了,别堆一堆没用的工具
  2. 规则只抓核心红线,别写几百条无效规则,比如你只需要定分层架构,不用管变量名怎么起
  3. 校验逻辑要可量化,别用 “写得好一点” 这种模糊要求,要明确 “必须包含单元测试” 这种可校验的规则
  4. 重试次数别超过 3 次,重试多了只会让 AI 在错误的方向上越走越远

范式二:多 Agent 分工协同范式 —— 复杂项目的终极解法

这是 LangChain 官方主推的范式,也是中大型团队、复杂项目的首选。OpenAI 3 人团队 5 个月写 100 万行代码,核心用的就是这个范式的变种。

【适用场景】

中大型复杂项目、多角色分工的任务、团队级生产应用、跨领域复杂任务。比如:完整的 Web 应用全栈开发、复杂的数据分析系统、多模块的业务自动化流程。

【核心设计思想】

分角色、定边界、专事专办。把一个复杂任务,拆成多个专业子角色,每个角色对应一个专属的 Agent,每个 Agent 有自己独立的 Harness(自己的规则、工具、校验逻辑),再通过一个总控 Harness做任务调度、进度同步、结果汇总。

就像一个成熟的开发团队,有产品经理、前端开发、后端开发、测试工程师,每个人只干自己专业的事,比一个人全干效果好 10 倍。普通单 Agent 干复杂活,就像让一个人既当产品又当开发还当测试,必然顾此失彼,干出来的东西全是漏洞。

image.png

【可直接落地的代码示例】

Java 实现的多 Agent 总控 Harness 核心调度逻辑,适配后端团队场景:

package com.harness.multiagent;

import java.util.*;

/**
 * 多Agent协同分工范式 总控Harness核心实现
 */
public class MultiAgentMasterHarness {

    // 角色Agent注册中心,每个Agent有独立的Harness
    private final Map<String, AgentHarness> agentRegistry = new HashMap<>();
    private final int maxRetry = 3;

    public MultiAgentMasterHarness() {
        // 注册各角色Agent,每个Agent有独立的规则和Harness
        agentRegistry.put("PRODUCT", new AgentHarness(
                "产品经理Agent",
                """
                你是专业产品经理,输出PRD必须包含:
                1. 需求背景、核心目标、用户场景
                2. 功能详情、业务规则、异常流程
                3. 验收标准、非功能需求
                输出必须清晰可落地,开发能直接照着做
                """
        ));
        agentRegistry.put("BACKEND", new AgentHarness(
                "后端开发Agent",
                """
                你是专业Java后端开发,基于PRD开发必须遵守:
                1. SpringBoot 3.2规范,分层架构Controller→Service→Repository→Entity
                2. 入参校验、异常处理、日志规范、防SQL注入
                3. 代码必须包含完整注释、单元测试
                """
        ));
        agentRegistry.put("TEST", new AgentHarness(
                "测试工程师Agent",
                """
                你是专业测试工程师,输出测试用例必须包含:
                1. 功能测试、边界测试、异常测试用例
                2. 接口测试、性能测试要求
                3. 验收标准对应的测试点
                """
        ));
    }

    /**
     * 总控Harness核心执行入口
     */
    public Map<String, String> run(String task) {
        Map<String, String> resultMap = new HashMap<>();
        int retryCount = 0;

        while (retryCount < maxRetry) {
            try {
                // 1. 产品Agent输出PRD
                AgentHarness productAgent = agentRegistry.get("PRODUCT");
                String prd = productAgent.run("基于以下需求,输出完整PRD:" + task);
                resultMap.put("PRD", prd);

                // 2. 后端Agent基于PRD开发代码
                AgentHarness backendAgent = agentRegistry.get("BACKEND");
                String code = backendAgent.run("基于以下PRD,输出完整Java后端代码:" + prd);
                resultMap.put("BACKEND_CODE", code);

                // 3. 测试Agent输出测试用例
                AgentHarness testAgent = agentRegistry.get("TEST");
                String testCase = testAgent.run("基于以下PRD,输出完整测试用例:" + prd);
                resultMap.put("TEST_CASE", testCase);

                // 4. 总控Harness最终校验
                boolean isPass = finalValidate(resultMap);
                if (isPass) {
                    resultMap.put("STATUS", "SUCCESS");
                    return resultMap;
                }
                retryCount++;
            } catch (Exception e) {
                retryCount++;
                resultMap.put("ERROR", e.getMessage());
            }
        }

        resultMap.put("STATUS", "FAIL");
        return resultMap;
    }

    /**
     * 总控Harness最终校验逻辑
     */
    private boolean finalValidate(Map<String, String> resultMap) {
        return resultMap.containsKey("PRD") 
                && resultMap.containsKey("BACKEND_CODE") 
                && resultMap.containsKey("TEST_CASE");
    }

    /**
     * 子Agent独立Harness实现
     */
    static class AgentHarness {
        private final String roleName;
        private final String systemRules;

        public AgentHarness(String roleName, String systemRules) {
            this.roleName = roleName;
            this.systemRules = systemRules;
        }

        public String run(String task) {
            // 实际实现调用大模型+独立校验闭环,参考范式一
            return "【" + roleName + "】执行结果:\n" + task;
        }
    }
}

【避坑指南】

  1. 角色边界必须清晰,绝对不能让一个 Agent 干多个角色的活,比如让后端 Agent 改 PRD,必然逻辑混乱
  2. 总控 Harness 只做调度和最终校验,绝对不插手具体角色的执行,否则会破坏分工逻辑
  3. 角色数量别超过 6 个,太多会导致调度混乱、沟通成本过高,反而不如单 Agent
  4. 必须有统一的信息同步标准,比如 PRD 格式、代码目录结构,所有 Agent 必须遵守,否则各干各的合不起来

范式三:渐进式技能解锁范式 —— 长周期大项目的防崩神器

这是 OpenAI Codex 百万行代码项目的核心范式,专门解决长周期大项目里的「上下文腐烂」「AI 失忆」问题。

【适用场景】

超大型长周期项目、持续迭代的产品开发、多阶段复杂任务、需要避免上下文腐烂的场景。比如:百万行代码级的产品开发、持续数月的自动化项目、多阶段的业务系统搭建。

【核心设计思想】

地图式导航,渐进式披露,用多少给多少。不是一上来把所有规则、工具、技能、文档全塞给 Agent,而是通过 Harness 做一个「导航地图」(也就是 OpenAI 用的 AGENTS.md),把项目拆成多个阶段,Agent 当前阶段需要什么技能、什么规则、什么文档,Harness 就只注入什么内容,用不到的绝对不塞到上下文里。

同时用文件系统做持久化,每一步的进度、决策、成果全存在代码仓库里,Agent 跨会话、跨阶段也不会失忆,彻底解决上下文溢出、干着干着就忘了目标的问题。

image.png

【可直接落地的代码示例】

Python 实现的渐进式技能管理 Harness 核心:

import os
from typing import Dict, List

class ProgressiveSkillHarness:
    """渐进式技能解锁范式Harness实现"""
    def __init__(self, project_root: str = "./agent_project"):
        self.project_root = project_root
        self.nav_map_path = os.path.join(project_root, "AGENTS.md")
        self.skill_library = {}  # 按阶段分类的技能库
        self.phase_progress = {}  # 阶段进度持久化
        self._init_project()

    def _init_project(self):
        """初始化项目目录和导航地图"""
        os.makedirs(self.project_root, exist_ok=True)
        # 初始化导航地图,核心是阶段拆分和技能索引
        if not os.path.exists(self.nav_map_path):
            default_nav_map = """
            # AGENT 项目导航地图
            ## 项目阶段拆分
            1. 阶段1:项目初始化 - 技能:环境搭建、仓库初始化、规范定义
            2. 阶段2:架构设计 - 技能:分层架构设计、数据库设计、接口设计
            3. 阶段3:核心功能开发 - 技能:业务代码开发、单元测试
            4. 阶段4:测试与优化 - 技能:集成测试、性能优化、bug修复
            5. 阶段5:上线交付 - 技能:部署配置、上线文档、验收交付
            
            ## 技能索引
            所有技能文档在 ./docs/skills/ 目录下,仅当前阶段的技能会被注入
            """
            with open(self.nav_map_path, "w", encoding="utf-8") as f:
                f.write(default_nav_map)
        # 加载技能库
        self._load_skill_library()

    def _load_skill_library(self):
        """加载技能库,按阶段分类"""
        skill_dir = os.path.join(self.project_root, "docs", "skills")
        os.makedirs(skill_dir, exist_ok=True)
        # 遍历技能文件,按阶段分类
        for phase in ["phase1", "phase2", "phase3", "phase4", "phase5"]:
            phase_skill_path = os.path.join(skill_dir, phase)
            os.makedirs(phase_skill_path, exist_ok=True)
            self.skill_library[phase] = []
            for file in os.listdir(phase_skill_path):
                if file.endswith(".md"):
                    with open(os.path.join(phase_skill_path, file), "r", encoding="utf-8") as f:
                        self.skill_library[phase].append(f.read())

    def get_current_phase_skills(self, current_phase: str) -> str:
        """Harness核心:仅获取当前阶段的技能,渐进式披露"""
        return "\n\n".join(self.skill_library.get(current_phase, []))

    def update_phase_progress(self, phase: str, progress: str, result: str):
        """持久化阶段进度到文件系统,跨会话不会丢失"""
        self.phase_progress[phase] = progress
        progress_path = os.path.join(self.project_root, "docs", "progress", f"{phase}_progress.md")
        os.makedirs(os.path.dirname(progress_path), exist_ok=True)
        with open(progress_path, "w", encoding="utf-8") as f:
            f.write(f"# {phase} 进度记录\n\n进度:{progress}\n\n成果:{result}")

    def run_phase(self, phase: str, phase_task: str) -> str:
        """执行指定阶段的任务,仅注入当前阶段的技能和规则"""
        # 1. 仅注入导航地图和当前阶段的技能,避免上下文溢出
        system_prompt = f"""
        项目导航地图:{open(self.nav_map_path, "r", encoding="utf-8").read()}
        当前阶段:{phase}
        当前阶段专属技能和规则:{self.get_current_phase_skills(phase)}
        历史阶段进度:{self.phase_progress}
        你只需要完成当前阶段的任务,不要涉及后续阶段的内容
        """
        # 2. 执行任务(实际调用大模型)
        print(f"===== 执行{phase}任务 =====")
        print(f"注入上下文长度:{len(system_prompt)} 字符")
        result = f"{phase}任务执行完成,成果:{phase_task}"
        # 3. 持久化进度
        self.update_phase_progress(phase, "已完成", result)
        return result

# 使用示例
if __name__ == "__main__":
    harness = ProgressiveSkillHarness(project_root="./user_management_project")
    # 分阶段执行,每个阶段仅注入对应的技能,上下文不会爆炸
    print(harness.run_phase("phase1", "初始化SpringBoot项目,搭建仓库结构,定义编码规范"))
    print(harness.run_phase("phase2", "设计用户管理系统的分层架构、数据库表结构、接口规范"))

【避坑指南】

  1. 导航地图必须清晰,阶段拆分要合理,每个阶段的目标必须可量化、可验收,不能模糊
  2. 技能必须和阶段强绑定,绝对不能提前注入后续阶段的内容,否则就失去了渐进式披露的意义
  3. 所有进度、决策、成果必须持久化到文件系统,绝对不能只存在会话历史里,否则重启就全没了
  4. 必须完成上一个阶段的验收,才能解锁下一个阶段,避免跳步导致的逻辑混乱

范式四:事件驱动流式范式 —— 高并发实时场景的首选

这是企业级高并发 Agent 服务的主流范式,专门解决实时交互、高并发、7*24 小时在线的场景需求。

【适用场景】

高并发实时交互场景、流式对话应用、实时数据处理、7*24 小时在线的 Agent 服务。比如:AI 客服系统、实时监控告警 Agent、流式对话机器人、高并发的 API 服务。

【核心设计思想】

事件触发,流式响应,无状态闭环。Harness 基于事件驱动架构设计,把用户输入、工具返回、系统回调、超时告警都定义为标准事件,Harness 通过事件总线监听事件,触发对应的处理逻辑,流式输出结果。同时每个会话的状态完全隔离,高并发下也能稳定运行,不会出现会话串扰、状态混乱的问题。

普通的循环式 Agent,在高并发场景下会出现阻塞、内存溢出、会话串扰的问题,而事件驱动范式,天生适配高并发、异步化的场景,是企业级生产服务的首选。

image.png

【避坑指南】

  1. 事件必须有标准格式,唯一 ID、类型、时间戳、会话 ID、payload 缺一不可,必须保证幂等性
  2. 会话状态必须完全隔离,每个会话的状态只能由自己的事件修改,绝对不能出现跨会话的状态共享
  3. 事件处理必须异步非阻塞,绝对不能在事件处理器里加阻塞逻辑,否则高并发下会直接崩
  4. 必须有超时、重试、死信队列机制,避免某个事件处理失败导致整个链路阻塞

范式五:反馈自进化范式 —— 长期运营系统的终极形态

这是 Harness Engineering 的高阶范式,专门解决「Agent 越用越难用,需要不停手动改规则」的问题,让你的 Agent 越用越好用。

【适用场景】

长期迭代的产品、持续优化的自动化系统、需要自主学习优化的 Agent、团队级长期使用的工具。比如:团队内部长期使用的研发效能 Agent、持续运营的 AI 产品、长期维护的自动化系统。

【核心设计思想】

反馈闭环,自动迭代,规则自进化。Harness 不仅执行任务,还会自动收集每一次的执行结果、人工反馈、错误信息、成功案例,自动分析优化规则、更新记忆、调整执行策略,把优化后的内容更新到 Harness 里,下一次执行直接生效,越用越好用,不用你每次手动改 prompt、改规则。

普通的 Agent,用的时间越长,需求变化越多,规则越乱,效果越差;而自进化范式的 Harness,用的时间越长,数据越多,优化得越好,效果越稳定。

image.png

【避坑指南】

  1. 必须有人工审核节点,核心规则的修改必须经过人工确认,绝对不能让 Agent 无限制修改核心规则
  2. 进化逻辑必须可控,只能优化规则、更新记忆、调整策略,绝对不能修改 Harness 的核心执行逻辑
  3. 反馈数据必须结构化,成功案例、失败原因、优化点必须清晰,不能用模糊的反馈做优化
  4. 必须有版本回滚机制,优化后的规则如果效果变差,必须能一键回滚到上一个稳定版本

核心选型指南:你的场景该选哪个范式?

很多人看完会问,这么多范式,我该选哪个?给大家做了一个清晰的选型表,一眼就能找到适合自己的范式:

表格

范式适用人群核心场景落地难度稳定性扩展性
单 Agent 全闭环范式个人开发者、新手简单工具、小任务、提效脚本★☆☆☆☆★★★★★★☆☆☆☆
多 Agent 协同范式团队、中大型项目复杂项目、全栈开发、跨领域任务★★★☆☆★★★★☆★★★★☆
渐进式技能解锁范式长周期项目开发者大项目、持续迭代产品、防上下文腐烂★★★☆☆★★★★☆★★★☆☆
事件驱动流式范式企业级服务开发者高并发实时服务、7*24 在线 Agent★★★★☆★★★☆☆★★★★★
反馈自进化范式长期运营产品团队持续优化的系统、长期使用的工具★★★★☆★★★☆☆★★★★★

核心选型铁则

  1. 场景优先,不炫技:80% 的场景,单 Agent 闭环范式就足够用了,别为了装 X 搞复杂的多 Agent,反而不稳定
  2. 先闭环,再扩展:先把最小闭环跑通,能稳定落地,再扩展更复杂的范式,别一上来就搞大而全的系统
  3. 范式可组合,不固定:大项目里可以组合多个范式,比如总控用多 Agent 协同,每个子 Agent 用单 Agent 闭环,长周期任务用渐进式技能解锁,灵活适配自己的场景

结尾总结

最后,跟大家说句掏心窝子的话:AI 时代,程序员的核心竞争力,早就不是手写代码的速度了,而是设计系统、定义规则、驾驭 AI 的能力。Harness Engineering 的本质,就是把你的工程能力、业务理解、团队规则,编码成一套 AI 能稳定执行的系统。

你不用再卷模型、卷 prompt,选对了适合自己场景的 Harness 范式,你的 Agent 就能从 Demo 走向生产,真正实现 10 倍、100 倍的提效。