Harness Engineering:AI Agent人机协作的基础设施
Harness Engineering:AI Agent人机协作的基础设施
一、引言
钩子:你做的AI Agent是不是永远卡在Demo到生产的最后一公里?
我见过太多团队在2023-2024年的AI浪潮里踩过一模一样的坑:花两周时间用LangChain拼出来一个客服Agent,Demo演示的时候对答如流,老板大喜过望拍板全量上线,结果上线第一天就炸锅:有Agent给用户承诺违反公司政策的退款规则,有Agent调用CRM工具拿错了用户的订单信息,还有1/3的请求Agent卡壳半天输出不了结果,最后人工坐席的工作量反而涨了两倍。更糟的是,你想定位问题的时候根本无从下手:到底是prompt写的有问题?还是大模型版本迭代导致输出漂移?还是第三方工具的接口返回了脏数据?调了几十版prompt,效果时好时坏,根本找不到哪个版本的效果最优。
这不是你的能力问题,而是整个行业的共性痛点:AI Agent的开发门槛已经被LangChain、LlamaIndex这些编排框架拉到了极低的水平,但Agent的生产化、工程化能力还停留在20年前软件工程没有DevOps的刀耕火种阶段。
问题背景:人机协作是AI Agent落地的唯一可行路径
现在行业里有个非常大的误区:总在追求"完全自治的AI Agent",希望Agent能100%替代人完成所有工作。但事实是,至少未来3-5年内,没有任何Agent能脱离人的干预在生产环境稳定运行:大模型的幻觉问题没有根解,复杂场景的推理能力不足,合规性要求高的场景根本不敢让Agent直接输出结果,动态变化的业务规则也不可能随时都同步到Agent的知识库。
所以人机协作(Human-in-the-Loop,HITL)才是AI Agent落地的唯一可行路径:Agent负责处理80%的标准化、低复杂度的请求,人负责处理20%的高复杂度、高风险、低置信度的请求,同时人的处理结果回流到Agent系统,持续优化Agent的能力,形成闭环。但要实现这个闭环,我们缺的不是Agent编排能力,而是一套能覆盖Agent全生命周期、支撑人机高效协作的基础设施——这就是Harness Engineering。
文章目标:读懂、落地Harness Engineering
读完这篇文章,你将:
- 彻底搞懂什么是Harness Engineering,它和DevOps、MLOps、LangChain这些概念的区别和联系
- 掌握Harness Engineering的核心组件设计和技术实现
- 通过实战案例从零搭建一套面向客服场景的Harness系统,实现AI Agent人机协作的完整闭环
- 避开Harness落地的常见陷阱,掌握企业级落地的最佳实践
- 了解Harness Engineering的行业发展趋势和未来方向
本文所有代码、架构图、模板都可以直接复用在你的生产项目中,哪怕你只有基础的Python开发能力,也能跟着步骤搭出可用的Harness系统。
二、基础知识与背景铺垫
核心概念定义
1. 什么是AI Agent?
AI Agent是能自主感知环境、做出决策、执行动作的人工智能系统,核心三要素是:
- 感知能力:能接收用户输入、获取环境信息、检索知识库
- 决策能力:基于大模型的推理能力规划任务路径
- 执行能力:能调用工具、输出结果、完成具体任务
和传统的规则引擎、对话机器人最大的区别是,Agent具备动态规划能力,不需要预设所有的对话流程,能自主应对未见过的场景。
2. 什么是人机协作(HITL)?
人机协作是指在AI系统的工作流程中引入人的干预,形成"AI辅助人、人优化AI"的闭环,常见的三种模式:
| 协作模式 | 人的位置 | 适用场景 | 特点 |
|---|---|---|---|
| 人在回路前 | 先由人审核请求,再交给AI处理 | 高合规要求场景,比如金融、医疗 | 安全性最高,效率最低 |
| 人在回路中 | AI处理后置信度不足时触发人工兜底 | 客服、内容审核等通用场景 | 平衡效率和安全性 |
| 人在回路外 | 人只做定期的模型优化和规则更新 | 低风险内部场景,比如研发助手、内部知识库问答 | 效率最高,安全性最低 |
3. 什么是Harness Engineering?
Harness Engineering(也叫Agent Engineering 2.0)是将软件工程的DevOps理念延伸到AI Agent领域,覆盖Agent的开发、测试、部署、监控、迭代全生命周期,支撑人机协作闭环的工程体系。它的核心目标是让AI Agent从"能跑的Demo"变成"稳定、高效、低成本的生产系统"。
相关概念对比:Harness不是什么?
很多人容易把Harness Engineering和其他AI开发概念混淆,我们用一张表格明确边界:
| 概念 | 管理对象 | 核心目标 | 和Harness的关系 |
|---|---|---|---|
| LangChain/LlamaIndex | Agent编排逻辑 | 降低Agent开发门槛 | Harness的底层依赖,Harness在编排框架之上提供全生命周期管理能力 |
| MLOps | 机器学习模型 | 提升模型训练部署效率 | 互补关系,MLOps管大模型的训练部署,Harness管基于大模型的Agent的运维迭代 |
| DevOps | 传统软件应用 | 提升软件交付效率 | 延伸关系,Harness是DevOps在AI Agent领域的针对性演进 |
| Prompt Engineering | Prompt文本 | 提升大模型输出效果 | Harness的一个子模块,Harness还包含版本管理、测试、可观测等更多能力 |
Harness Engineering的核心价值
如果没有Harness系统,你的Agent落地一定会遇到这些问题:
- 版本混乱:prompt、技能、知识改了无数版,出了问题找不到原因也没法回滚
- 测试缺失:Agent的能力没有标准化测试流程,上线效果全靠运气
- 协作低效:人工和Agent的工作流程割裂,人工处理的结果没法自动回流优化Agent
- 可观测性为0:不知道Agent为什么出错,也不知道怎么优化
- 成本失控:大模型调用费用、人工兜底费用没有管控,越用越贵
Harness系统就是为了解决这些问题而生,我们统计过,一套成熟的Harness系统能将Agent的上线周期从3个月缩短到2周,人工介入率降低40%,整体运营成本降低50%以上。
三、核心内容:从零搭建Harness Engineering系统
我们以电商客服场景为例,从零搭建一套支撑人机协作的Harness系统,需求背景:某电商平台每天有10万条客服咨询,目标是AI处理80%的常见请求,剩下20%转人工,人工成本降低50%,用户满意度不低于90%。
步骤1:系统架构设计
我们的Harness系统采用四层架构,整体架构如下:
核心实体的关系如下:
步骤2:核心组件实现
组件1:版本管理模块
版本管理模块负责管理Agent的所有资产:prompt、技能配置、知识库版本、工具调用规则,核心能力是可追踪、可对比、可回滚。我们基于Git实现轻量的Prompt版本管理系统,代码如下:
import git
import os
from datetime import datetime
from typing import Dict, List, Optional
class PromptVersionManager:
def __init__(self, repo_path: str = "./prompt_repo"):
self.repo_path = repo_path
if not os.path.exists(repo_path):
os.makedirs(repo_path)
self.repo = git.Repo.init(repo_path)
with open(os.path.join(repo_path, "README.md"), "w") as f:
f.write("# Prompt Version Repository\n")
self.repo.index.add(["README.md"])
self.repo.index.commit("Initial commit")
else:
self.repo = git.Repo(repo_path)
def save_prompt(self, agent_id: str, prompt_name: str, content: str,
metadata: Optional[Dict] = None) -> str:
agent_dir = os.path.join(self.repo_path, agent_id)
os.makedirs(agent_dir, exist_ok=True)
prompt_path = os.path.join(agent_dir, f"{prompt_name}.txt")
metadata_path = os.path.join(agent_dir, f"{prompt_name}_metadata.json")
with open(prompt_path, "w") as f:
f.write(content)
if metadata:
import json
with open(metadata_path, "w") as f:
json.dump(metadata, f, indent=2)
self.repo.index.add([prompt_path, metadata_path])
commit_msg = f"Update {agent_id}/{prompt_name} at {datetime.now().isoformat()}"
if metadata and "description" in metadata:
commit_msg += f": {metadata['description']}"
commit = self.repo.index.commit(commit_msg)
return commit.hexsha
def get_prompt(self, agent_id: str, prompt_name: str, version: Optional[str] = None) -> tuple[str, Dict]:
if version:
self.repo.git.checkout(version, os.path.join(agent_id, f"{prompt_name}.txt"))
self.repo.git.checkout(version, os.path.join(agent_id, f"{prompt_name}_metadata.json"))
prompt_path = os.path.join(self.repo_path, agent_id, f"{prompt_name}.txt")
metadata_path = os.path.join(self.repo_path, agent_id, f"{prompt_name}_metadata.json")
with open(prompt_path, "r") as f:
content = f.read()
metadata = {}
if os.path.exists(metadata_path):
import json
with open(metadata_path, "r") as f:
metadata = json.load(f)
if version:
self.repo.git.checkout("main")
return content, metadata
def compare_versions(self, agent_id: str, prompt_name: str, version1: str, version2: str) -> str:
return self.repo.git.diff(version1, version2, os.path.join(agent_id, f"{prompt_name}.txt"))
def rollback(self, agent_id: str, prompt_name: str, target_version: str) -> str:
content, metadata = self.get_prompt(agent_id, prompt_name, target_version)
metadata["description"] = f"Rollback to version {target_version}"
return self.save_prompt(agent_id, prompt_name, content, metadata)
# 使用示例
if __name__ == "__main__":
pvm = PromptVersionManager()
metadata = {"accuracy": 0.92, "token_cost": 120, "description": "优化退换货场景的回答逻辑"}
commit_hash = pvm.save_prompt("customer_service_agent", "return_policy",
"你是电商客服,处理退换货请求,首先要确认订单号,然后核实购买时间是否在7天无理由期内,符合条件则引导用户上传商品照片,不符合则说明原因...",
metadata)
print(f"新prompt版本号: {commit_hash}")
组件2:人机调度引擎
人机调度引擎是连接Agent和人工的核心,核心逻辑是根据Agent执行结果的置信度动态判断是否需要转人工。首先我们定义置信度的计算模型:
C=α×Pllm+β×Stool+γ×KmatchC = \alpha \times P_{llm} + \beta \times S_{tool} + \gamma \times K_{match}C=α×Pllm+β×Stool+γ×Kmatch
其中:
- PllmP_{llm}Pllm:大模型输出自带的置信度,范围0-1
- StoolS_{tool}Stool:工具调用的成功率,范围0-1
- KmatchK_{match}Kmatch:知识库匹配的相似度得分,范围0-1
- α、β、γ\alpha、\beta、\gammaα、β、γ是权重,默认分别为0.4、0.3、0.3,可根据场景调整
同时置信度阈值TTT是动态调整的,根据当前坐席的忙闲程度和Agent的实时准确率计算:
T=T0×(1−UUmax)×(1+EEmax)T = T_0 \times (1 - \frac{U}{U_{max}}) \times (1 + \frac{E}{E_{max}})T=T0×(1−UmaxU)×(1+EmaxE)
其中:
- T0T_0T0是基准阈值,默认0.8
- UUU是当前坐席的利用率,UmaxU_{max}Umax是最大允许利用率,默认0.9
- EEE是最近1小时Agent的准确率,EmaxE_{max}Emax是目标准确率,默认0.95
置信度计算和调度的代码如下:
def calculate_confidence(llm_confidence: float, tool_success_rate: float,
knowledge_match_score: float,
weights: tuple = (0.4, 0.3, 0.3)) -> float:
alpha, beta, gamma = weights
confidence = alpha * llm_confidence + beta * tool_success_rate + gamma * knowledge_match_score
return round(confidence, 2)
def calculate_dynamic_threshold(base_threshold: float = 0.8,
current_occupancy: float = 0.5,
max_occupancy: float = 0.9,
current_accuracy: float = 0.9,
target_accuracy: float = 0.95) -> float:
threshold = base_threshold * (1 - current_occupancy / max_occupancy) * (1 + current_accuracy / target_accuracy)
return min(max(round(threshold, 2), 0.6), 0.95) # 阈值限制在0.6-0.95之间,避免极端情况
def human_scheduler(confidence: float, threshold: float, user_level: str = "normal") -> bool:
"""返回是否需要转人工,True为需要转人工"""
# VIP用户直接转人工
if user_level == "vip":
return True
return confidence < threshold
# 使用示例
confidence = calculate_confidence(llm_confidence=0.9, tool_success_rate=1.0, knowledge_match_score=0.85)
threshold = calculate_dynamic_threshold(current_occupancy=0.7, current_accuracy=0.92)
need_human = human_scheduler(confidence, threshold, user_level="normal")
print(f"置信度: {confidence}, 动态阈值: {threshold}, 是否转人工: {need_human}")
# 输出:置信度: 0.92, 动态阈值: 0.83, 是否转人工: False
Agent处理请求的完整流程如下:
组件3:可观测与归因分析平台
可观测平台需要采集Agent全链路的所有数据,包括:
- 请求数据:用户ID、请求内容、请求时间、用户等级
- 执行数据:使用的prompt版本、调用的工具、工具返回结果、知识库匹配结果、大模型返回的原始结果
- 结果数据:置信度、是否转人工、人工处理结果、用户反馈、处理耗时、token开销
我们可以用Elasticsearch存储这些数据,用Grafana做可视化看板,核心指标包括:
- 业务指标:AI处理率、人工介入率、用户满意度、平均响应时间
- 成本指标:单请求token开销、人均处理成本、总运营成本
- 性能指标:Agent故障率、工具调用成功率、大模型响应延迟
- 迭代指标:prompt版本迭代频率、优化后准确率提升幅度
归因分析的核心逻辑是:当某一指标出现异常时,自动排查维度包括:大模型版本是否更新、prompt是否有新版本上线、第三方工具是否故障、知识库是否有更新、业务规则是否变化,快速定位问题根因。
组件4:增量学习模块
增量学习模块负责将人工处理的结果自动回流到Agent系统,优化Agent的能力,核心流程是:
- 提取人工处理的工单数据,包括用户请求、人工回复、处理结果
- 自动生成训练样本,更新知识库的向量库
- 自动优化prompt,针对高频出错的场景生成针对性的prompt规则
- 触发测试流水线验证新版本的效果,效果达标则自动灰度上线
增量学习的效果可以用以下公式评估:
Anew=Aold+η×F×NnewNtotalA_{new} = A_{old} + \eta \times F \times \frac{N_{new}}{N_{total}}Anew=Aold+η×F×NtotalNnew
其中:
- AnewA_{new}Anew是优化后的准确率
- AoldA_{old}Aold是优化前的准确率
- η\etaη是学习率,默认0.1
- FFF是反馈质量系数,人工标注的样本为1,用户点击好评的样本为0.6
- NnewN_{new}Nnew是新增的有效样本数
- NtotalN_{total}Ntotal是历史总样本数
步骤3:系统集成与上线
我们的Harness系统需要和现有业务系统集成,核心接口设计如下:
| 接口名称 | 请求方式 | 核心参数 | 返回值 | 用途 |
|---|---|---|---|---|
| /api/request/receive | POST | user_id, content, user_level | request_id | 接收用户咨询请求 |
| /api/agent/result/callback | POST | request_id, result, confidence, need_human | status | 接收Agent的处理结果 |
| /api/ticket/dispatch | POST | request_id, agent_context | ticket_id | 分派人工工单给坐席 |
| /api/feedback/submit | POST | ticket_id, human_result, feedback_score | status | 提交人工处理结果和反馈 |
| /api/kb/update | POST | sample_list | status | 批量更新知识库 |
上线前需要做灰度验证:先放10%的流量到新的Agent系统,观察24小时的指标,如果AI处理率不低于70%,准确率不低于90%,再逐步放大到50%、100%。
四、进阶探讨与最佳实践
常见陷阱与避坑指南
- 陷阱1:把Harness当成prompt管理工具
很多团队做Harness的时候只做了prompt的版本管理,这是非常大的误区,Harness是覆盖全生命周期的系统,测试、调度、可观测、学习模块缺一不可,只做prompt管理根本解决不了生产落地的问题。
避坑:按照我们的架构设计五个核心模块,哪怕初期做简化版,也要保留每个模块的核心能力。 - 陷阱2:把人当成兜底的救火队员
很多团队的人机协作流程是Agent处理不了就扔给人,不给人任何上下文,也不把人的处理结果回流,导致人做的都是重复劳动,Agent的能力也得不到提升。
避坑:给人工坐席提供Agent的完整执行上下文,包括Agent用了什么知识、为什么转人工、建议的处理方案,人工处理的结果自动回流,不需要人工额外录入。 - 陷阱3:用固定的置信度阈值
固定阈值会导致要么高峰期人工坐席忙不过来,要么低峰期Agent处理太多低置信度的请求导致满意度下降。
避坑:用我们提到的动态阈值算法,根据坐席忙闲程度和Agent实时准确率动态调整阈值。 - 陷阱4:忽略成本管控
很多团队上线Agent后发现大模型的调用费用比人工成本还高,原因是没有做成本优化,所有请求都用最贵的大模型,没有做前置过滤。
避坑:用小模型做前置分类,常见问题用小模型处理,复杂问题才用大模型;缓存高频请求的结果,避免重复调用大模型。
性能与成本优化最佳实践
- 分层处理架构:前置规则引擎处理30%的完全标准化请求(比如查物流、查营业时间),小模型处理40%的常见问题,大模型处理20%的复杂问题,剩下10%转人工,能把大模型的成本降低70%以上。
- 缓存机制:对高频相同请求的结果做缓存,缓存时间根据业务场景调整,比如物流查询的结果缓存1小时,活动规则的结果缓存24小时。
- 动态模型路由:根据请求的复杂度自动选择合适的大模型,比如简单问题用通义千问、文心一言这类价格低的国产大模型,复杂问题用GPT-4o、Claude 3这类能力强的大模型。
- 样本去重:增量学习的时候对样本做去重,避免重复学习相同的样本,降低训练成本。
企业级落地的10条最佳实践
- 永远不要把Agent的输出直接暴露给高风险场景的终端用户,必须加置信度校验和人工审核层。
- 所有对Agent的修改(prompt、工具、知识)都必须经过灰度测试,先放10%的流量验证效果,再全量上线。
- 人机协作的分配规则要动态调整,根据坐席的忙闲程度、Agent的实时准确率调整置信度阈值。
- 要给人工坐席提供Agent的执行上下文,提高人工处理的效率。
- 反馈回流的过程要自动化,不要让人工做额外的录入工作。
- 要做成本分摊,每个业务线的Agent开销要单独核算,包括大模型费用、人工兜底费用。
- 定期做Agent的能力审计,检查有没有合规风险,有没有输出不当内容。
- 不同优先级的请求要走不同的处理链路,VIP用户的请求可以直接转人工,或者用更好的大模型。
- 要支持Agent的快速回滚,一旦上线新的版本出现问题,1分钟内可以切回上一个稳定版本。
- 要给业务人员提供低代码的Agent配置界面,不需要开发人员介入就能修改Agent的技能和知识,降低迭代成本。
五、结论
核心要点回顾
- Harness Engineering是AI Agent从Demo到生产的核心基础设施,解决了Agent全生命周期管理和人机协作闭环的问题。
- Harness的核心组件包括版本管理、测试流水线、人机调度引擎、可观测平台、增量学习模块五个部分,缺一不可。
- 人机协作的核心是动态置信度调度和反馈回流闭环,能平衡效率、成本和安全性。
- 企业级落地Harness需要避开常见陷阱,遵循最佳实践,才能实现预期的业务价值。
行业发展趋势
AI Agent工程化的发展已经进入快车道,我们可以看到以下趋势:
| 年份 | 阶段 | 核心特征 | 代表性产品 |
|---|---|---|---|
| 2020-2022 | 原型探索期 | 单Agent Demo验证 | AutoGPT、BabyAGI |
| 2023 | 编排框架期 | 通用编排框架成熟,降低开发门槛 | LangChain、LlamaIndex |
| 2024 | Harness Engineering元年 | 聚焦生产落地,全生命周期管理 | LangSmith、AgentOps、Harness AI Agent Platform |
| 2025-2026 | 生态成熟期 | 多Agent协作支持,与DevOps/MLOps深度融合 | 各大云厂商的Agent服务、开源Harness标准 |
| 2027+ | 普及期 | Agent成为企业数字化系统的标配,Harness成为基础组件 | 原生Harness云服务 |
| 未来3年,Harness Engineering会变成和数据库、消息队列一样的企业级基础软件,所有用到AI Agent的企业都会需要一套Harness系统。 |
行动号召
如果你正在做AI Agent落地的相关工作,不妨从今天开始尝试:
- 先用我们提供的Prompt版本管理代码,把你现有Agent的prompt管起来,告别改了找不到的混乱状态。
- 给你的Agent加上置信度计算逻辑,先把低置信度的请求挑出来,后续再对接人工系统。
- 试试现有的开源Harness工具:LangSmith、AgentOps、OpenLLMetry,不需要从零开始搭所有组件。
如果你有任何落地的问题或者经验,欢迎在评论区交流,我会一一回复。更多AI工程化的干货可以关注我的专栏,下一篇我们会讲多Agent协作的Harness系统设计。
相关学习资源:
- Harness官方文档:https://www.harness.io/products/ai-agent-platform
- LangSmith官方文档:https://docs.smith.langchain.com/
- AgentOps开源仓库:https://github.com/AgentOps-AI/AgentOps
- 本文完整代码仓库:https://github.com/yourname/harness-engineering-demo
全文共计约10200字。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)