Skip to content

Harness 单独讲解:Agent 开发中的”运行外壳 / 工程化控制层”

⏱ 阅读约 15 分钟 ⭐ 进阶 📚 Agent 开发系列(3/5)

适用场景:Agent / AI 应用开发面试、项目讲解、简历追问准备 核心目标:理解 Harness 是什么、为什么最近会被频繁提到、如何实现、如何放到你的项目里讲清楚。


📚 Agent 开发系列1. 面试扫盲2. ReAct Agent3. Harness(本篇)4. MCP5. Skill

1. 一句话理解 Harness

Harness 可以理解为包在大模型外面的一整套工程化运行外壳。

大模型本身只负责生成文本、选择工具、给出推理结果,但一个真正可上线的 Agent 不能只靠模型。它还需要:

  • 知道当前任务执行到哪一步;
  • 知道可以调用哪些工具;
  • 知道哪些操作需要权限控制;
  • 知道什么时候该停止;
  • 失败后能重试或降级;
  • 多轮任务能跨上下文窗口继续执行;
  • 所有模型调用、工具调用和中间决策都能被记录、调试和评估。

这些围绕模型构建的 状态管理、工具执行、权限约束、执行编排、记忆、观测、评估、异常兜底,合起来就可以理解为 Agent Harness。

可以用一句面试话术概括:

我理解的 Harness 不是某一个单独框架,而是让大模型从“会回答问题”变成“能可靠执行任务”的工程化控制层。它负责把模型、工具、记忆、状态、权限、日志、评估和异常处理组织起来,保证 Agent 能在真实业务系统中稳定运行。


2. 为什么最近 Harness 变火?

以前大家关注的是:

text
Prompt 怎么写?
RAG 怎么召回?
Tool Calling 怎么调工具?
多 Agent 怎么协作?

但当 Agent 从 Demo 走向真实业务后,问题变成:

text
任务执行一半失败怎么办?
工具调用错了怎么办?
多轮任务跨上下文窗口怎么继续?
怎么知道 Agent 每一步做了什么?
怎么控制成本和延迟?
怎么保证敏感操作不会被模型乱执行?
怎么评估 Agent 到底有没有完成任务?

这时就不能只讨论“模型能力”,而要讨论模型外面的 执行环境和工程控制体系。这就是 Harness 变火的原因。

从趋势上看,Agent 开发正在经历三个阶段:

text
第一阶段:Chatbot
重点是让模型能对话。

第二阶段:Agent Framework
重点是让模型能调用工具、使用记忆、进行任务编排。

第三阶段:Agent Harness / AgentOps
重点是让 Agent 在真实业务中可控、可观测、可评估、可恢复、可扩展。

面试里如果被问“最近 Harness 为什么重要”,可以这样回答:

因为现在 Agent 的难点已经不只是让模型会调用工具,而是让它在真实业务中可靠执行。比如长任务需要跨上下文保持状态,工具调用需要权限和参数校验,执行过程需要 trace 方便排查,失败要能重试和降级,最后还要能评估 Agent 的效果。Harness 本质上就是把这些工程能力包在模型外面,让 Agent 从 Demo 变成可生产化的系统。


3. Harness 和相关概念的区别

3.1 Harness vs Agent

概念作用例子
Agent能理解目标、规划步骤、调用工具、完成任务的智能体课程推荐 Agent、ReportAgent
Harness让 Agent 稳定运行的一套工程外壳状态管理、工具注册、权限控制、日志追踪、失败恢复

简单理解:

text
Agent 是执行任务的“人”。
Harness 是这个人所在的“工作台、权限系统、任务看板、工具箱、日志系统和质检体系”。

3.2 Harness vs Agent Framework

对比项Agent FrameworkAgent Harness
关注点怎么快速搭 Agent怎么让 Agent 稳定执行
典型能力Prompt、Tool、Memory、Chain、Graph状态、权限、恢复、观测、评估、成本控制
代表LangChain、Spring AI、OpenAI Agents SDK、LangGraph基于框架之上的工程控制层
面试说法框架提供能力抽象Harness 负责生产化落地

面试回答:

Framework 更像开发工具箱,帮我们快速定义 Agent、工具和流程;Harness 更像运行控制层,它会把工具权限、任务状态、日志追踪、失败恢复、人工确认、效果评估都纳入管理。真实项目里通常是用框架来实现 Harness 的一部分,但 Harness 不等于框架。


3.3 Harness vs Runtime

概念含义
RuntimeAgent 运行时环境,负责执行模型调用、工具调用、状态流转
Harness比 Runtime 更广,不仅包括执行,还包括权限、观测、评估、记忆、恢复、治理

可以说:

text
Runtime 是 Harness 的一部分。

3.4 Harness vs AgentOps

概念关注点
Harness单个或多个 Agent 执行任务时的控制外壳
AgentOpsAgent 全生命周期运维,包括监控、评估、成本、版本、质量治理

可以理解为:

text
Harness 偏开发与运行控制。
AgentOps 偏上线后的监控、评估和持续优化。

3.5 Harness vs MCP

MCP 是一种让模型应用连接外部工具和数据源的协议。Harness 可以把 MCP Server 暴露的工具纳入自己的 Tool Registry,再做权限控制、调用日志、参数校验和失败处理。

text
MCP 解决“工具怎么标准化接入”。
Harness 解决“工具接入后怎么安全、可靠、可控地执行”。

4. Harness 的核心组成

一个完整的 Agent Harness 通常可以拆成 10 个模块。


4.1 任务入口层:Input / Request Adapter

作用:把用户请求、系统任务、定时任务、消息队列任务统一转换成 Agent 可以处理的任务对象。

常见来源:

  • 用户聊天输入;
  • HTTP API 请求;
  • MQ 消息;
  • 定时任务;
  • 外部事件回调;
  • 文件上传任务。

在你的项目里:

text
云智汇:用户在智能客服输入课程咨询、推荐、购买请求。
MiroFish:APScheduler 周期触发外部信息采集任务。

4.2 任务状态层:State / Task Ledger

作用:记录任务执行到哪一步,防止 Agent 在长任务中“失忆”。

典型字段:

json
{
  "taskId": "task_001",
  "userId": 1001,
  "goal": "推荐适合学习 Java 后端的课程",
  "status": "RUNNING",
  "currentStep": "RETRIEVE_COURSE_KNOWLEDGE",
  "createdAt": "2026-05-13 20:00:00",
  "updatedAt": "2026-05-13 20:01:30"
}

为什么重要:

  • 长任务可能跨多个模型调用;
  • 工具调用可能失败;
  • 用户可能中断对话后重新回来;
  • 后台任务可能需要断点续跑。

面试回答:

Harness 里我会设计任务状态表或状态文档,记录 taskId、userId、目标、当前步骤、执行状态、工具调用结果和异常信息。这样 Agent 不只是依赖上下文窗口,而是有外部状态管理,任务失败后可以恢复,也方便排查。


4.3 记忆层:Memory

作用:保存 Agent 需要长期使用的信息。

常见记忆类型:

类型说明存储方式
短期记忆当前会话上下文ChatMemory、Redis、内存窗口
长期记忆用户偏好、历史任务、长期事实MongoDB、MySQL、向量库
语义记忆文档、知识库、资料片段Pinecone、Chroma
图谱记忆实体关系、事件关系、观点关系Zep GraphRAG
执行记忆Agent 每一步做了什么MongoDB、Trace 系统

在你的项目里:

text
云智汇:MongoDB 保存多轮对话、工具调用、执行轨迹;Pinecone 保存课程资料向量。
MiroFish:MySQL 保存原文和摘要,Chroma 保存向量,Zep GraphRAG 保存实体关系记忆。

4.4 工具注册层:Tool Registry

作用:统一管理 Agent 可以调用哪些工具、每个工具的参数、权限、超时、重试策略和返回结构。

工具定义通常包括:

text
工具名
工具描述
输入参数 schema
输出结果 schema
权限要求
超时时间
是否需要人工确认
失败重试策略
是否允许模型直接调用

例子:

text
CourseTools.queryCourseById
OrderTools.preCreateOrder
CouponTools.matchCoupon
GraphTools.queryEntityRelation
SearchTools.activeSearch

面试回答:

Tool Calling 不能简单把接口暴露给大模型。我会通过 Tool Registry 统一注册工具,并配置工具描述、参数 schema、权限、超时、重试和结果格式。模型只负责提出工具调用请求,真正的工具执行由后端 Harness 控制,这样可以避免模型直接操作敏感接口。


4.5 权限与安全层:Permission / Guardrails

作用:限制 Agent 能做什么,防止误操作、越权、提示词注入和危险工具调用。

常见设计:

  • 只读工具和写操作工具分级;
  • 查询类工具可自动执行;
  • 下单、支付、删除、发券等敏感操作需要用户确认;
  • 工具参数必须经过后端校验;
  • RAG 召回内容要做权限过滤;
  • 对用户输入做 prompt injection 检测;
  • 对模型输出做格式和风险校验。

在云智汇里可以这样讲:

课程查询和课程推荐属于低风险工具,可以由 Agent 自动调用;但预下单、领取优惠券、支付这类写操作不能完全交给大模型,需要后端校验用户身份、课程状态、库存、价格和优惠规则,必要时还要用户二次确认。


4.6 编排层:Orchestrator

作用:决定 Agent 的执行流程。

常见编排模式:

模式说明适用场景
Chain固定步骤串行执行简单问答、固定流程
Router先判断意图,再分发云智汇路由工作流 Agent
Parallel多个 Agent 并行处理多角度分析、评审
ReAct边思考边调用工具ReportAgent、调查型任务
Evaluator-Optimizer生成后再评估优化报告润色、质量检查
Human-in-the-loop敏感节点人工确认下单、支付、删除

在你的两个项目里:

text
云智汇:Router Agent → 推荐 Agent / 咨询 Agent / 购买 Agent / 知识问答 Agent。
MiroFish:ReAct ReportAgent + 多 Agent 可信评审。

4.7 执行循环层:Execution Loop

作用:控制 Agent 每一步如何执行、何时继续、何时停止。

典型循环:

text
接收任务
→ 读取状态和记忆
→ 路由或规划下一步
→ 判断是否需要 RAG
→ 判断是否需要工具调用
→ 执行工具
→ 保存中间结果
→ 让模型生成下一步
→ 判断是否完成
→ 输出最终结果

伪代码:

python
while not task.done:
    state = load_state(task.id)
    memory = load_memory(task.user_id, task.session_id)

    decision = llm.plan(goal=task.goal, state=state, memory=memory, tools=tool_registry)

    if decision.need_retrieval:
        context = retriever.search(decision.query)
        state.add_context(context)

    if decision.need_tool:
        check_permission(decision.tool, user)
        result = tool_executor.call(decision.tool, decision.args)
        state.add_tool_result(result)

    if decision.need_human_confirm:
        pause_and_wait_user_confirm(task.id)
        break

    if decision.finished:
        task.done = True
        output = decision.final_answer

    save_state(task.id, state)

4.8 沙箱与环境层:Sandbox / Environment

作用:为 Agent 执行代码、文件操作、浏览器操作、命令行操作提供隔离环境。

适用场景:

  • 代码生成 Agent;
  • 自动化测试 Agent;
  • 数据分析 Agent;
  • 文件处理 Agent;
  • 长时间运行的开发任务。

核心控制:

text
文件访问范围
网络访问范围
命令执行权限
资源限制
超时控制
操作日志

你的项目目前不一定必须写 Sandbox,但如果面试官问 Harness 高级能力,可以提:

如果 Agent 需要执行代码、访问文件或进行自动化操作,我会引入沙箱环境限制它的文件、网络和命令权限,防止 Agent 对宿主系统造成不可控影响。


4.9 观测层:Tracing / Logging / Metrics

作用:记录 Agent 每一步做了什么,方便调试、复盘和优化。

应该记录:

text
用户输入
路由结果
Prompt 版本
RAG 查询词
召回文档
模型响应
工具调用名称
工具调用参数
工具调用结果
异常信息
耗时
Token 消耗
最终回答
用户反馈

面试回答:

Agent 系统必须可观测。否则模型回答错了,很难判断是路由错、召回错、工具错、Prompt 错还是模型生成错。我会为每次 Agent run 生成 traceId,把模型调用、工具调用、RAG 召回和最终输出串起来,方便定位问题。


4.10 评估层:Evaluation

作用:判断 Agent 是否真的完成任务。

常见评估维度:

维度说明
任务完成率是否完成用户目标
工具调用正确率是否调用了正确工具
RAG 命中率召回内容是否相关
幻觉率是否编造知识库外信息
安全性是否越权、误操作
成本Token 和工具调用成本
延迟响应耗时是否可接受
用户满意度用户是否采纳结果

云智汇可以这样落地:

text
课程问答:看回答是否引用正确课程资料。
课程推荐:看推荐课程是否符合用户目标、难度、价格等条件。
购买下单:看工具调用参数是否正确,是否经过用户确认。

MiroFish 可以这样落地:

text
预测报告:看证据覆盖率、反对证据是否充分、观点冲突是否标注、置信度是否合理。

5. Harness 的标准执行链路

一个完整的 Agent Harness 可以用下面这条链路描述:

text
用户输入 / 系统任务

任务创建:生成 taskId / sessionId / traceId

读取记忆:会话记忆、长期记忆、语义知识库、图谱记忆

路由 / 规划:判断意图,选择 Agent 或执行计划

权限检查:判断工具是否可调用,是否需要用户确认

RAG 召回:从向量库 / 图谱 / 数据库召回上下文

工具调用:执行业务接口、搜索、查询、下单等工具

状态更新:保存中间结果、执行步骤、异常信息

模型生成:基于上下文和工具结果生成回答或下一步动作

结果校验:格式校验、安全校验、事实校验

输出结果:返回用户或进入下一轮

Trace / Eval:记录日志、指标、用户反馈,用于后续优化

6. 如何在云智汇 AI 在线教育平台里应用 Harness

你的云智汇项目本身已经有 Harness 的雏形,只是简历里没有用这个词。

可以这样映射:

Harness 能力云智汇中的体现
输入适配智能客服聊天入口
路由编排Spring AI 路由工作流 Agent
工具注册CourseTools、OrderTools、CouponTools
知识召回RAG + Pinecone 课程知识库
记忆管理MongoDB 多轮对话和工具调用记录
权限控制下单、优惠券、订单等工具由后端服务校验
执行记录工具调用记录、Agent 执行轨迹
结果输出课程问答、课程推荐、预下单结果

面试可以这样说:

云智汇里的 AI 模块其实可以理解为一个轻量级 Agent Harness。Spring AI 负责模型调用和 Tool Calling,路由工作流负责意图识别和 Agent 分发,Pinecone 提供课程知识召回,CourseTools 和 OrderTools 负责连接真实微服务,MongoDB 记录多轮对话和工具调用轨迹。这样 Agent 不是简单聊天,而是可以在受控条件下完成课程咨询、推荐和预下单业务闭环。


云智汇 Harness 执行流程

text
用户:我想学 Java 后端,有没有适合我的课程?

生成 sessionId / traceId

读取 MongoDB 历史对话,判断用户过往学习偏好

Route Agent 判断意图:课程推荐

Recommend Agent 生成检索 query

Pinecone 召回课程介绍、适用人群、课程大纲

CourseTools 查询课程实时价格、状态、有效期

模型综合课程资料和工具结果生成推荐理由

保存对话、召回内容、工具调用记录到 MongoDB

返回课程推荐结果和课程卡片

7. 如何在 MiroFish 增强版里应用 Harness

MiroFish 更适合讲 长任务 Harness,因为它涉及主动采集、世界记忆、多 Agent 推演、评审和报告生成。

Harness 能力MiroFish 中的体现
任务调度APScheduler 周期触发采集任务
异步执行Celery + RabbitMQ 执行清洗、摘要、入库任务
状态管理MySQL 记录任务状态、来源、时间、摘要
语义记忆Chroma 存储文本向量和 metadata
图谱记忆Zep GraphRAG 存储实体关系
多 Agent 编排camel-ai / camel-oasis 社交推演
可信评审事实核查、支持方、反对方、风险审查等评审 Agent
ReAct 执行ReportAgent 调用检索、搜索、采访、记忆召回工具
可追溯输出输出证据链、风险点、置信度、引用来源

面试可以这样说:

MiroFish 增强版里 Harness 的重点是长任务和可信报告生成。系统不是一次性把资料丢给模型,而是通过 APScheduler、Celery 和 RabbitMQ 维护主动采集链路,通过 MySQL、Chroma、Zep GraphRAG 维护长期世界记忆,再通过多 Agent 评审和 ReAct ReportAgent 控制报告生成过程。这个 Harness 保证了 Agent 推演不是黑盒输出,而是有任务状态、有记忆、有证据、有评审、有追溯。


8. 一个最小可实现 Harness 设计

如果面试官问“让你从 0 到 1 实现一个 Harness,你怎么做”,可以按下面回答。

8.1 最小版本要有 6 个模块

text
1. AgentRun 表 / 文档:记录一次 Agent 执行
2. ToolRegistry:注册工具名称、描述、参数、权限
3. MemoryStore:保存历史对话和工具结果
4. Orchestrator:控制路由、RAG、工具调用和结果生成
5. Guardrail:参数校验、权限校验、敏感操作确认
6. TraceLog:记录模型调用、工具调用、异常和耗时

8.2 MongoDB 文档结构示例

json
{
  "runId": "run_20260513_001",
  "sessionId": "s_10001",
  "userId": 1001,
  "intent": "COURSE_RECOMMEND",
  "status": "SUCCESS",
  "steps": [
    {
      "type": "ROUTE",
      "input": "我想学 Java 后端",
      "output": "COURSE_RECOMMEND",
      "costMs": 320
    },
    {
      "type": "RAG_RETRIEVE",
      "query": "Java 后端 项目实战 初学者",
      "topK": 5,
      "docIds": ["course_101_chunk_3", "course_102_chunk_1"],
      "costMs": 180
    },
    {
      "type": "TOOL_CALL",
      "tool": "CourseTools.queryCourseById",
      "args": {"courseId": 101},
      "result": {"name": "Java 后端实战课", "price": 199},
      "costMs": 95
    }
  ],
  "finalAnswer": "推荐你先学习 Java 后端实战课……",
  "createdAt": "2026-05-13T20:00:00",
  "updatedAt": "2026-05-13T20:00:02"
}

8.3 Java / Spring AI 伪代码

java
public AgentResponse run(AgentRequest request) {
    String runId = idGenerator.nextRunId();

    AgentRun run = agentRunRepository.create(runId, request);

    try {
        // 1. 读取历史记忆
        List<Message> history = memoryService.load(request.getSessionId());

        // 2. 路由意图
        Intent intent = routerAgent.route(request.getQuestion(), history);
        run.addStep("ROUTE", intent);

        // 3. 根据意图选择智能体
        BusinessAgent agent = agentFactory.getAgent(intent);

        // 4. 执行 RAG / Tool Calling
        AgentContext context = AgentContext.builder()
                .runId(runId)
                .sessionId(request.getSessionId())
                .userId(request.getUserId())
                .history(history)
                .build();

        AgentResponse response = agent.execute(request.getQuestion(), context);

        // 5. 保存执行轨迹
        run.success(response);
        agentRunRepository.save(run);
        memoryService.append(request.getSessionId(), request.getQuestion(), response);

        return response;
    } catch (Exception e) {
        run.fail(e);
        agentRunRepository.save(run);
        return fallbackService.handle(e, request);
    }
}

9. Harness 面试高频问题与参考答案

Q1:什么是 Agent Harness?

答:
Agent Harness 是围绕大模型构建的一套工程化运行外壳,它负责把模型、工具、记忆、状态、权限、执行编排、日志追踪、评估和异常兜底组织起来,让 Agent 能在真实业务中可靠执行任务。大模型提供推理和生成能力,Harness 提供可控、可观测、可恢复的执行环境。


Q2:为什么不能只用大模型 API,还需要 Harness?

答:
大模型 API 本身是无状态的,它不知道任务执行到哪一步,也不能直接保证工具调用安全、失败恢复、权限控制和执行可追踪。真实业务里的 Agent 需要跨多轮上下文执行任务,还要调用后端服务、处理异常、记录执行轨迹,所以需要 Harness 在外层管理状态、工具、记忆、权限和日志。


Q3:Harness 和 LangChain、Spring AI、LangGraph 这种框架是什么关系?

答:
这些框架提供了构建 Agent 的基础能力,比如模型调用、工具调用、记忆、工作流编排等。Harness 是利用这些能力搭建出来的生产化执行层。也就是说,框架是工具箱,Harness 是围绕业务目标搭建出的完整运行体系,包括状态管理、权限控制、工具治理、trace、eval 和异常兜底。


Q4:一个 Harness 至少应该包含哪些模块?

答:
至少包括任务状态管理、工具注册与执行、记忆管理、工作流编排、权限与安全控制、日志追踪和异常处理。更完整的 Harness 还会包括评估体系、成本监控、人工确认、沙箱环境和版本管理。


Q5:Harness 如何解决长任务中的上下文丢失问题?

答:
不能只依赖模型上下文窗口,而要把任务状态外置化。比如为每次 Agent 任务生成 taskId,把目标、当前步骤、已完成动作、工具调用结果、异常信息和中间产物存到数据库或 MongoDB。下一次模型调用时,只注入必要摘要和当前状态,这样即使跨多个上下文窗口也能继续执行。


Q6:Harness 如何管理工具调用?

答:
我会通过 Tool Registry 统一注册工具,包含工具名称、描述、参数 schema、权限要求、超时、重试和返回结构。模型只负责选择工具和生成参数,后端 Harness 负责参数校验、权限判断、工具执行和结果记录。这样可以避免模型直接控制业务接口。


Q7:哪些工具可以自动调用,哪些必须人工确认?

答:
查询类、推荐类、只读类工具可以自动调用,比如查询课程、召回知识库、查询学习进度。涉及写操作、资金、库存、订单、删除、发券等敏感操作,必须经过后端规则校验,必要时还要用户二次确认,比如预下单、支付、删除数据、批量发送优惠券。


Q8:Harness 如何做权限控制?

答:
权限控制不能交给模型判断,必须由后端做。可以在工具执行前校验用户身份、角色、资源归属和操作权限;在 RAG 召回时使用 metadata 做数据权限过滤;在敏感工具调用前要求用户确认;在工具层对参数做白名单和业务规则校验。


Q9:Harness 如何做可观测性?

答:
每次 Agent 执行都生成 traceId,记录用户输入、路由结果、Prompt 版本、RAG 查询、召回文档、工具名称、工具参数、工具结果、模型输出、耗时、Token 消耗和异常信息。这样当回答出错时,可以定位是路由问题、召回问题、工具问题还是模型生成问题。


Q10:Harness 如何做评估?

答:
评估可以从任务完成率、工具调用正确率、RAG 召回相关性、回答事实一致性、用户满意度、延迟和成本几个维度做。比如课程问答可以看回答是否基于召回文档,课程推荐可以看是否符合用户目标和课程 metadata,报告生成可以看证据覆盖率和冲突点标注是否充分。


Q11:Harness 和 ReAct Agent 有什么关系?

答:
ReAct 是一种 Agent 执行模式,强调推理和行动交替进行;Harness 是承载这种执行模式的工程外壳。ReAct 决定 Agent 如何“思考—行动—观察”,Harness 决定这个过程如何被状态化、工具化、权限化、日志化和可恢复。


Q12:Harness 和多 Agent 架构有什么关系?

答:
多 Agent 架构解决不同角色如何协作,Harness 负责管理这些 Agent 的执行过程,包括任务分发、消息传递、共享记忆、结果汇总、冲突处理和 trace 记录。没有 Harness,多 Agent 很容易变成不可控的黑盒协作。


Q13:云智汇项目里哪里体现了 Harness?

答:
云智汇里的 Harness 主要体现在 Spring AI 路由工作流、Tool Calling、Pinecone 知识库和 MongoDB 执行轨迹。Route Agent 负责意图识别和任务分发,CourseTools、OrderTools 负责连接真实微服务,Pinecone 提供课程知识召回,MongoDB 保存多轮对话和工具调用记录。整体上就是一个面向在线教育业务的轻量级 Agent Harness。


Q14:MiroFish 项目里哪里体现了 Harness?

答:
MiroFish 的 Harness 更偏长任务和可信推演。APScheduler、Celery、RabbitMQ 负责主动采集和异步任务执行,MySQL、Chroma、Zep GraphRAG 负责世界记忆,camel-ai / camel-oasis 负责多 Agent 推演,多 Agent 可信评审和 ReAct ReportAgent 负责报告生成与证据追溯。这些共同保证了 Agent 推演过程可持续、可追踪、可评审。


Q15:如果 Agent 调用工具失败,Harness 应该怎么处理?

答:
首先根据异常类型分类,比如参数错误、权限不足、服务超时、业务失败、第三方服务不可用。参数错误可以让模型补充或修正参数;权限不足直接返回标准提示;超时可以重试或降级;业务失败要返回明确原因;所有失败都要记录到 trace 中,方便后续排查。


Q16:如果路由 Agent 判断错意图怎么办?

答:
可以从三层兜底:第一,路由结果带置信度,低置信度时让用户补充信息;第二,业务 Agent 执行前再次校验输入是否符合场景;第三,支持用户纠正,比如“我不是要买课,我只是想了解课程”,系统重新路由。同时把错误样本加入评估集优化路由 Prompt。


Q17:如果 RAG 召回不到内容,Harness 怎么处理?

答:
不能让模型硬编。可以返回“知识库暂未找到相关内容”,或者降级到课程数据库结构化查询,也可以引导用户换个问题。如果是 MiroFish 这种推演项目,可以触发主动搜索工具补充信息,并在报告里标注证据不足和低置信度。


Q18:如何避免 Harness 设计过重?

答:
Harness 不是越复杂越好,应该从最小可用版本开始。先实现状态记录、工具注册、权限校验、基础 trace 和失败处理;只有当任务变长、工具变多、协作变复杂时,再加入多 Agent、评估优化、沙箱和更复杂的恢复机制。核心原则是先满足业务可靠性,不为了概念堆架构。


Q19:Harness 的核心价值是什么?

答:
核心价值是把 Agent 从“能演示”提升到“可上线”。它解决的是可靠性、可控性、可观测性和可恢复性问题,让 Agent 在调用真实工具、处理长任务、执行敏感操作时,不至于完全依赖模型自由发挥。


Q20:如果面试官问你有没有真正实现 Harness,怎么回答?

答:
我不会说自己完整实现了一个通用 Harness 平台,而是说在项目里实现了 Harness 的关键能力。比如云智汇里有路由工作流、Tool Registry、RAG 召回、MongoDB 执行轨迹和业务工具权限控制;MiroFish 里有任务调度、异步执行、长期记忆、多 Agent 评审和可追溯报告生成。这些都是面向具体业务场景的轻量级 Harness 设计。


10. 面试中如何把 Harness 讲得不虚

不要这样说:

text
我用了 Harness,所以我的 Agent 很高级。

应该这样说:

text
我理解 Harness 更像 Agent 的工程化运行外壳。在我的项目里,它不是一个单独组件,而是由路由工作流、工具注册、记忆存储、权限校验、执行轨迹和异常兜底共同组成。它的作用是让 Agent 在真实业务里能稳定调用工具、保持上下文、记录过程,并且在失败时可以定位和恢复。

11. 结合你的简历,推荐背诵版回答

30 秒版本

Harness 可以理解为 Agent 的工程化运行外壳。大模型本身只负责推理和生成,但真实业务里的 Agent 还需要状态管理、工具调用、权限控制、记忆、日志追踪和异常兜底。比如我在云智汇项目里,路由工作流负责意图识别,Pinecone 负责知识召回,CourseTools 和 OrderTools 负责调用真实微服务,MongoDB 记录多轮对话和工具调用轨迹,这整体就是一个面向在线教育业务的轻量级 Agent Harness。


1 分钟版本

我理解的 Harness 不是某个固定框架,而是围绕 Agent 的一套生产化控制层。因为大模型本身是无状态的,也无法保证工具调用安全和任务可恢复,所以需要 Harness 来管理任务状态、工具注册、记忆、权限、执行流程、日志追踪和评估。在云智汇项目里,我用 Spring AI 实现路由工作流 Agent,用 Pinecone 做课程知识库召回,用 Tool Calling 封装课程和订单工具,用 MongoDB 持久化多轮对话和工具调用记录。这样 Agent 不只是聊天,而是可以在受控条件下完成课程咨询、推荐和预下单闭环。在 MiroFish 项目里,Harness 则体现在主动采集、异步任务、长期记忆、多 Agent 评审和可追溯报告生成上。


12. 学习路线:如何掌握 Harness

第一层:概念理解

必须能讲清:

text
Harness 是什么
为什么 Agent 需要 Harness
Harness 和框架、Runtime、AgentOps 的区别

掌握标准:能用 1 分钟说清楚,不堆术语。


第二层:模块拆解

必须能讲清:

text
状态管理
工具注册
记忆管理
权限控制
执行编排
日志追踪
失败恢复
效果评估

掌握标准:每个模块能结合你的项目说出一个例子。


第三层:项目落地

必须能把 Harness 映射到:

text
云智汇 AI 在线教育平台
MiroFish 多智能体世界推演系统增强

掌握标准:面试官问“你项目里哪里体现 Harness”,你能直接讲链路。


第四层:压力追问

必须准备:

text
工具失败怎么办
路由错了怎么办
RAG 无召回怎么办
敏感操作怎么控制
长任务上下文丢失怎么办
如何做 trace 和 eval
如何避免过度设计

掌握标准:能回答异常场景,而不是只讲正常流程。


13. 最终总结

Harness 的本质不是“又一个新名词”,而是 Agent 生产化落地必然需要的工程层。

可以用下面这句话收尾:

Agent 的核心不只是让大模型会思考和调用工具,而是让它在真实业务系统里可控、可观测、可恢复、可评估地完成任务。Harness 就是为了解决这个问题而存在的工程化运行外壳。


14. 参考来源说明

本文档整理时参考了 Anthropic 关于长任务 Agent Harness、有效 Agent 构建模式、OpenAI Agents SDK tracing、Spring AI Tool Calling / Chat Memory、Pinecone metadata filtering 等资料,并结合「云智汇 AI 在线教育平台」和「MiroFish 多智能体世界推演系统增强」两个项目进行面试化改写。

AI 应用开发 / Agent 开发实习生