Harness 单独讲解:Agent 开发中的”运行外壳 / 工程化控制层”
适用场景:Agent / AI 应用开发面试、项目讲解、简历追问准备 核心目标:理解 Harness 是什么、为什么最近会被频繁提到、如何实现、如何放到你的项目里讲清楚。
📚 Agent 开发系列:1. 面试扫盲 → 2. ReAct Agent → 3. Harness(本篇) → 4. MCP → 5. Skill
1. 一句话理解 Harness
Harness 可以理解为包在大模型外面的一整套工程化运行外壳。
大模型本身只负责生成文本、选择工具、给出推理结果,但一个真正可上线的 Agent 不能只靠模型。它还需要:
- 知道当前任务执行到哪一步;
- 知道可以调用哪些工具;
- 知道哪些操作需要权限控制;
- 知道什么时候该停止;
- 失败后能重试或降级;
- 多轮任务能跨上下文窗口继续执行;
- 所有模型调用、工具调用和中间决策都能被记录、调试和评估。
这些围绕模型构建的 状态管理、工具执行、权限约束、执行编排、记忆、观测、评估、异常兜底,合起来就可以理解为 Agent Harness。
可以用一句面试话术概括:
我理解的 Harness 不是某一个单独框架,而是让大模型从“会回答问题”变成“能可靠执行任务”的工程化控制层。它负责把模型、工具、记忆、状态、权限、日志、评估和异常处理组织起来,保证 Agent 能在真实业务系统中稳定运行。
2. 为什么最近 Harness 变火?
以前大家关注的是:
Prompt 怎么写?
RAG 怎么召回?
Tool Calling 怎么调工具?
多 Agent 怎么协作?但当 Agent 从 Demo 走向真实业务后,问题变成:
任务执行一半失败怎么办?
工具调用错了怎么办?
多轮任务跨上下文窗口怎么继续?
怎么知道 Agent 每一步做了什么?
怎么控制成本和延迟?
怎么保证敏感操作不会被模型乱执行?
怎么评估 Agent 到底有没有完成任务?这时就不能只讨论“模型能力”,而要讨论模型外面的 执行环境和工程控制体系。这就是 Harness 变火的原因。
从趋势上看,Agent 开发正在经历三个阶段:
第一阶段: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 稳定运行的一套工程外壳 | 状态管理、工具注册、权限控制、日志追踪、失败恢复 |
简单理解:
Agent 是执行任务的“人”。
Harness 是这个人所在的“工作台、权限系统、任务看板、工具箱、日志系统和质检体系”。3.2 Harness vs Agent Framework
| 对比项 | Agent Framework | Agent 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
| 概念 | 含义 |
|---|---|
| Runtime | Agent 运行时环境,负责执行模型调用、工具调用、状态流转 |
| Harness | 比 Runtime 更广,不仅包括执行,还包括权限、观测、评估、记忆、恢复、治理 |
可以说:
Runtime 是 Harness 的一部分。3.4 Harness vs AgentOps
| 概念 | 关注点 |
|---|---|
| Harness | 单个或多个 Agent 执行任务时的控制外壳 |
| AgentOps | Agent 全生命周期运维,包括监控、评估、成本、版本、质量治理 |
可以理解为:
Harness 偏开发与运行控制。
AgentOps 偏上线后的监控、评估和持续优化。3.5 Harness vs MCP
MCP 是一种让模型应用连接外部工具和数据源的协议。Harness 可以把 MCP Server 暴露的工具纳入自己的 Tool Registry,再做权限控制、调用日志、参数校验和失败处理。
MCP 解决“工具怎么标准化接入”。
Harness 解决“工具接入后怎么安全、可靠、可控地执行”。4. Harness 的核心组成
一个完整的 Agent Harness 通常可以拆成 10 个模块。
4.1 任务入口层:Input / Request Adapter
作用:把用户请求、系统任务、定时任务、消息队列任务统一转换成 Agent 可以处理的任务对象。
常见来源:
- 用户聊天输入;
- HTTP API 请求;
- MQ 消息;
- 定时任务;
- 外部事件回调;
- 文件上传任务。
在你的项目里:
云智汇:用户在智能客服输入课程咨询、推荐、购买请求。
MiroFish:APScheduler 周期触发外部信息采集任务。4.2 任务状态层:State / Task Ledger
作用:记录任务执行到哪一步,防止 Agent 在长任务中“失忆”。
典型字段:
{
"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 系统 |
在你的项目里:
云智汇:MongoDB 保存多轮对话、工具调用、执行轨迹;Pinecone 保存课程资料向量。
MiroFish:MySQL 保存原文和摘要,Chroma 保存向量,Zep GraphRAG 保存实体关系记忆。4.4 工具注册层:Tool Registry
作用:统一管理 Agent 可以调用哪些工具、每个工具的参数、权限、超时、重试策略和返回结构。
工具定义通常包括:
工具名
工具描述
输入参数 schema
输出结果 schema
权限要求
超时时间
是否需要人工确认
失败重试策略
是否允许模型直接调用例子:
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 | 敏感节点人工确认 | 下单、支付、删除 |
在你的两个项目里:
云智汇:Router Agent → 推荐 Agent / 咨询 Agent / 购买 Agent / 知识问答 Agent。
MiroFish:ReAct ReportAgent + 多 Agent 可信评审。4.7 执行循环层:Execution Loop
作用:控制 Agent 每一步如何执行、何时继续、何时停止。
典型循环:
接收任务
→ 读取状态和记忆
→ 路由或规划下一步
→ 判断是否需要 RAG
→ 判断是否需要工具调用
→ 执行工具
→ 保存中间结果
→ 让模型生成下一步
→ 判断是否完成
→ 输出最终结果伪代码:
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;
- 长时间运行的开发任务。
核心控制:
文件访问范围
网络访问范围
命令执行权限
资源限制
超时控制
操作日志你的项目目前不一定必须写 Sandbox,但如果面试官问 Harness 高级能力,可以提:
如果 Agent 需要执行代码、访问文件或进行自动化操作,我会引入沙箱环境限制它的文件、网络和命令权限,防止 Agent 对宿主系统造成不可控影响。
4.9 观测层:Tracing / Logging / Metrics
作用:记录 Agent 每一步做了什么,方便调试、复盘和优化。
应该记录:
用户输入
路由结果
Prompt 版本
RAG 查询词
召回文档
模型响应
工具调用名称
工具调用参数
工具调用结果
异常信息
耗时
Token 消耗
最终回答
用户反馈面试回答:
Agent 系统必须可观测。否则模型回答错了,很难判断是路由错、召回错、工具错、Prompt 错还是模型生成错。我会为每次 Agent run 生成 traceId,把模型调用、工具调用、RAG 召回和最终输出串起来,方便定位问题。
4.10 评估层:Evaluation
作用:判断 Agent 是否真的完成任务。
常见评估维度:
| 维度 | 说明 |
|---|---|
| 任务完成率 | 是否完成用户目标 |
| 工具调用正确率 | 是否调用了正确工具 |
| RAG 命中率 | 召回内容是否相关 |
| 幻觉率 | 是否编造知识库外信息 |
| 安全性 | 是否越权、误操作 |
| 成本 | Token 和工具调用成本 |
| 延迟 | 响应耗时是否可接受 |
| 用户满意度 | 用户是否采纳结果 |
云智汇可以这样落地:
课程问答:看回答是否引用正确课程资料。
课程推荐:看推荐课程是否符合用户目标、难度、价格等条件。
购买下单:看工具调用参数是否正确,是否经过用户确认。MiroFish 可以这样落地:
预测报告:看证据覆盖率、反对证据是否充分、观点冲突是否标注、置信度是否合理。5. Harness 的标准执行链路
一个完整的 Agent Harness 可以用下面这条链路描述:
用户输入 / 系统任务
↓
任务创建:生成 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 执行流程
用户:我想学 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 个模块
1. AgentRun 表 / 文档:记录一次 Agent 执行
2. ToolRegistry:注册工具名称、描述、参数、权限
3. MemoryStore:保存历史对话和工具结果
4. Orchestrator:控制路由、RAG、工具调用和结果生成
5. Guardrail:参数校验、权限校验、敏感操作确认
6. TraceLog:记录模型调用、工具调用、异常和耗时8.2 MongoDB 文档结构示例
{
"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 伪代码
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 讲得不虚
不要这样说:
我用了 Harness,所以我的 Agent 很高级。应该这样说:
我理解 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
第一层:概念理解
必须能讲清:
Harness 是什么
为什么 Agent 需要 Harness
Harness 和框架、Runtime、AgentOps 的区别掌握标准:能用 1 分钟说清楚,不堆术语。
第二层:模块拆解
必须能讲清:
状态管理
工具注册
记忆管理
权限控制
执行编排
日志追踪
失败恢复
效果评估掌握标准:每个模块能结合你的项目说出一个例子。
第三层:项目落地
必须能把 Harness 映射到:
云智汇 AI 在线教育平台
MiroFish 多智能体世界推演系统增强掌握标准:面试官问“你项目里哪里体现 Harness”,你能直接讲链路。
第四层:压力追问
必须准备:
工具失败怎么办
路由错了怎么办
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 多智能体世界推演系统增强」两个项目进行面试化改写。