当前位置: 首页 > news >正文

构建 Agent Harness:打造可靠 AI Agent 的核心控制层

Prompt Engineering、Context Engineering,以及现在的 Harness Engineering。

Prompt engineering 随着 2022 年底 ChatGPT 的发布进入公众视野,定义了与大型语言模型高效交互的方式。Context engineering 则在去年(2025 年)走到台前,构建者们尝试在上下文窗口限制内,将尽可能多的有用信息塞进 prompt。Harness engineering 则成为今年的热点话题,构建者优化模型周边的“脚手架”,以确保 agent 能正确处理任务请求,并尽可能给出最佳响应。

LangChain https://www.langchain.com/blog/improving-deep-agents-with-harness-engineering 探讨如何通过 harness engineering 改进 deep agents,展示了在不更换底层模型的前提下,通过调整 system prompts、tool 使用以及 middleware 来优化 agent 性能。尤其是中间的 middleware 层,注入了目录上下文以加速 agent 上手、验证输出以进行质量校验,并强制执行时间预算以在合理时限内完成工作。这表明,agent 构建者不必一味等待下一个模型版本来提升质量,而是可以“站在前沿实验室的肩膀上”,取得更好的结果。

Birgitta Böckeler 在一篇面向编码类 agent 用户的文章中提出了一个简单公式来定义 harness engineering:agent = model + harness。她这样阐述一个良好 harness 的目标:

一个构建良好的外部 harness 有两个目标:它提高 agent 一开始“就做对”的概率,并在结果到达人类视线之前,提供尽可能多的问题自我纠正反馈回路。

AWS 也刚刚为 AgentCore 推出 了全新的托管 agent harness,用简单的基于配置的部署,取代了前期繁琐的 agent 构建流程。

在这篇博客中,我将分享在我的 agent 平台原型 Loom 中构建 agent harness 的持续探索,并介绍如何集成 AgentCore 的新 harness 作为另一种构建 agent 的选项。

注:

  • 为保证专业性与可对照性,文中的专业名词如 agent harness、harness engineering、AgentCore、middleware、MCP、A2A、CLI、Bedrock、boto3、JWT、RFC 8693 等均保留英文原文;必要处在首次出现时辅以中文解释。

走进 Loom 的引擎盖之下

在 Loom 的介绍文章中,我提出了客户挑战 #4:软件部署需要严格测试,尤其是 AI 生成代码。因此我使用预写的 agent,并通过 feature flags 启用 memory、tools、与其他 agents 的集成。这样既能进行标准化的代码扫描,也无需为不受信任的代码执行准备隔离环境。

通过配置注入构建预写的 agent

为此,我注入了一个名为AGENT_CONFIG_JSON的环境变量,其负载如下:

{ "system_prompt": "persona, instructions, guidelines", "model_id": "us.amazon.nova-2-lite-v1:0", "max_tokens": 16384, "integrations": { "mcp_servers": [ { "name": "utilities", "enabled": true, "transport": "streamable_http", "endpoint_url": "https://example.heeki.cloud/mcp", "auth": { "type": "oauth2", "credential_provider_name": "<agentcore-credential-provider-for-utilities>", "well_known_endpoint": "https://cognito-idp.<region>.amazonaws.com/<cognito-pool-id>/.well-known/openid-configuration", "scopes": "utilities/invoke ..." } } ], "a2a_agents": [ { "name": "agentforce-assistant", "enabled": true, "endpoint_url": "https://api.salesforce.com/einstein/ai-agent/a2a/<agent-identifier>", "auth": { "type": "oauth2", "credential_provider_name": "<agentcore-credential-provider-for-agentforce-assistant>", "well_known_endpoint": "https://<organization-id>.develop.my.salesforce.com/.well-known/openid-configuration" } } ], "memory": { "enabled": true, "resources": [ { "name": "demo_employee_assistant", "memory_id": "demo_employee_assistant-RNDrSHC2P5", "arn": "arn:aws:bedrock-agentcore:<region>:<account-id>:memory/demo_employee_assistant-RNDrSHC2P5" } ] } }}

system_prompt参数将 persona、instructions、guidelines 这几项输入合并,用于初始化 agent。

agent = Agent( system_prompt=config.system_prompt, model=model, tools=tools, hooks=hooks,)

model_idmax_tokens参数用于配置 Bedrock 模型。后续我计划扩展以支持其他 3p(第三方)模型提供方。

model = BedrockModel( model_id=config.model_id, max_tokens=config.max_tokens, streaming=True,)

integrations.mcp_serversintegrations.a2a_agents用于按条件定义 agent 的工具列表。下面的代码为了简洁做了轻微简化。

if config.integrations.mcp_servers: enabled_servers = [s for s in config.integrations.mcp_servers if s.enabled] if enabled_servers: mcp_clients = build_mcp_clients(config.integrations.mcp_servers) tools.extend(mcp_clients) logger.info("Loaded %d MCP tool client(s)", len(mcp_clients))if config.integrations.a2a_agents: enabled_agents = [a for a in config.integrations.a2a_agents if a.enabled] if enabled_agents: a2a_clients = create_a2a_clients(config.integrations.a2a_agents) if a2a_clients: tools.extend(a2a_clients) logger.info("Loaded %d A2A client(s)", len(a2a_clients))

integrations.memory参数用于决定是否在生命周期事件中接入与 memory 交互的 hook。

if config.integrations.memory.enabled: memory_store_id = None if config.integrations.memory.resources: memory_store_id = config.integrations.memory.resources[0].memory_id memory_hook = MemoryHook(memory_store_id=memory_store_id) hooks.append(memory_hook) logger.info("Enabled AgentCore Memory hook (store_id=%s)", memory_store_id)

这种方式允许在部署时对 agent 进行配置,并可根据具体用例的需要,选择性地设置上述各项配置。

但如果我想在运行时变更 agent 配置怎么办?允许终端用户选择偏好的模型很常见;在与 agent 交互途中追加工具集成也很常见。

部署时配置 vs 运行时配置

如何实现?部署时配置作为默认设置,运行时配置允许用户用自己的选择覆盖这些默认值。

默认的部署配置与可在运行时覆盖的配置

invoke 的负载支持在运行时覆盖模型、并新增 connectors(tools 或其他 agents)。这在InvokeRequest类中有定义。

{ "prompt": "What is the weather in New York?", "session_id": "existing-session-id-or-null", "model_id": "us.amazon.nova-2-lite-v1:0", "credential_id": 1, "bearer_token": "<your-bearer-token>", "connector_ids": [3, 7]}
  • prompt

    (必填):用户消息

  • session_id

    :复用现有会话;省略则创建新会话

  • model_id

    :覆盖 agent 的默认模型,必须在allowed_model_ids

  • credential_id

    :用于令牌生成的内部授权方标识

  • bearer_token

    :手动生成的 bearer token

  • connector_ids

    :本次调用要附加的内部 connector id

例如,我可以为某个 agent 配置一组可选模型,终端用户只能从中选择。

管理员视图:为终端用户选择允许的模型

然后终端用户即可选择自己的偏好模型。

终端用户视图:选择偏好模型

如果用户选择了另一个模型,该选择会随 invoke 请求一并传入;随后 agent 会使用该模型进行处理。

运行时添加工具

在运行时更新模型相对容易,因为这只是 agent 里多处理一个参数。而在运行时新增工具则有些“弯”,需要格外注意。

运行时启用 connector 的界面

在介绍文中,我提出了客户挑战 #6:需要在委托的 actor 链条中管理身份传递。我建议用有意的架构约束将其简化为单跳。这也是许多 agent 式用户界面今天采取的方式——用户可按需启用连接。

这种方式的关键好处在于:当用户切换打开一个新的 connector 时,顺势捕获用户凭证。我推测,在这一刻采集凭证会带来“最小化”的用户授权疲劳,因为用户此时强烈意图与该集成交互。

等到真正需要时才去采集凭证并不合理,因为用户可能已离开去处理一个长时任务。比如,这就像你在 Claude Code 中启动了一个长时任务、转身离开,回来后发现它在你离开 10 秒后就暂停执行了,并请求你授权访问某个目录或读取某个文件。

请注意,这是一种“简化”,而不是 agent 身份与权限委托问题的最终解。RFC 8693 是一个 token exchange 的提案,它通过在 JWT 中携带 actor claim 的方式帮助进行委托。

在上面的示例截图中,我在 exa.ai/mcp 上注册并创建了一个 API key,在免费档位下每月可发出 1000 次请求,足以满足基础原型需求。虽然我可以在管理员层面配置 MCP server,但这样做会导致每位启用该 connector 的用户都共用这把 API key。有的场景没问题,但也有的场景需要“按用户”的 API key。

MCP connectors 的按用户 API key

我选择了后者。因此当用户启用该 connector 时,会弹出一个对话框,提示用户输入个人 API key。之后在请求 MCP server 时就使用这把个人 key。

需要注意的是,在我写下这段内容时,AgentCore 的 credential providers 还不支持按用户的 API key。因此我是在 agent 请求里注入请求头,而不是使用 credential provider。

在 Loom 中集成托管的 agent harness

为了达到目前的状态,我进行了相当多的迭代。一方面,自建 agent harness 让我学到了很多,也带来了极大的灵活性,比如为遥测与成本估算添加自定义日志。另一方面,这可能比一个人愿意为 agent 平台投入的工程量更多。

Harness for AgentCore 刚刚发布,目标是简化 agent 的部署以及与各类上下文提供方的集成。

我尤其喜欢托管 agent harness 的一点是:它在部署时与运行时都同时支持模型选择与工具集成。比如在部署阶段,我可以这样配置(以 CLI 为例):

aws bedrock-agentcore-control create-harness \ --region us-east-1 \ --harness-name "loom-harness-example" \ --execution-role-arn "arn:aws:iam::${ACCOUNT_ID}:role/loom-harness-role" \ --system-prompt "persona, instructions, guidelines" \ --model "us.amazon.nova-2-lite-v1:0" \ --max-iterations 75 \ --max-tokens 16384 \ --tools '[{"type": "remote_mcp", "name": "exa", "config": {"remoteMcp": {"url": "https://mcp.exa.ai/mcp"}}}]' \ --memory '{"optionalValue": {"agentCoreMemoryConfiguration": {"arn": "arn:aws:bedrock-agentcore:${REGION}:${ACCOUNT_ID}:memory/${MEMORY_ID}"}}}'

同样地,在运行时我也可以覆盖模型与工具选项,例如:

response = client.invoke_harness( harnessArn=HARNESS_ARN, runtimeSessionId=SESSION_ID, messages=[ { "role": "user", "content": [ {"text": "What's the weather in New York City?"} ], } ], model={ "bedrockModelConfig": { "modelId": "us.anthropic.claude-sonnet-4-6" } }, tools=[ { "type": "remote_mcp", "name": "exa", "config": {"remoteMcp": {"url": "https://mcp.exa.ai/mcp"}} } ])

对于构建 agent 的全托管、serverless 体验而言,这节省了大量时间!而且部署过程相当轻快:我的自定义 agent 大约需要 1 分钟,harness 部署只需约 20 秒!

在 Loom 中使用 AgentCore 新 harness 创建的 agent

我也已经将托管的 agent harness 集成进 Loom,并在版本 1.3.0 中提供。

请注意:你需要将boto3升级到1.42.94版本以使用新的 harness 方法。

另请注意:对于需要 OAuth2 access tokens 的远程 MCP servers,目前似乎还不支持 credential providers,需要自行添加自定义授权请求头。

{ "harnessArn": "arn:aws:bedrock-agentcore:<region>:<account-id>:harness/<harness-id>", "runtimeSessionId": "552bb0ed-f268-46e6-9db9-53df37b149f0", "messages": [ { "role": "user", "content": [ { "text": "What's the weather in New York City?" } ] } ], "tools": [ { "type": "remote_mcp", "name": "utilities", "config": { "remoteMcp": { "url": "https://<mcp-server-endpoint>/mcp", "headers": { "Authorization": "Bearer " } } } } ], "actorId": "admin"}

结语

随着各组织同时追求效率与响应质量,harness engineering 正当其时。构建一个 agent harness 并非难事,但确实需要仔细权衡与设计。

AWS 刚刚发布了全托管的 agent harness,显著简化了在云端构建与部署 agent 的体验。AWS 控制台还提供了 playground 体验,让测试变得非常轻松。

学AI大模型的正确顺序,千万不要搞错了

🤔2026年AI风口已来!各行各业的AI渗透肉眼可见,超多公司要么转型做AI相关产品,要么高薪挖AI技术人才,机遇直接摆在眼前!

有往AI方向发展,或者本身有后端编程基础的朋友,直接冲AI大模型应用开发转岗超合适!

就算暂时不打算转岗,了解大模型、RAG、Prompt、Agent这些热门概念,能上手做简单项目,也绝对是求职加分王🔋

📝给大家整理了超全最新的AI大模型应用开发学习清单和资料,手把手帮你快速入门!👇👇

学习路线:

✅大模型基础认知—大模型核心原理、发展历程、主流模型(GPT、文心一言等)特点解析
✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑
✅开发基础能力—Python进阶、API接口调用、大模型开发框架(LangChain等)实操
✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用
✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代
✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经

以上6大模块,看似清晰好上手,实则每个部分都有扎实的核心内容需要吃透!

我把大模型的学习全流程已经整理📚好了!抓住AI时代风口,轻松解锁职业新可能,希望大家都能把握机遇,实现薪资/职业跃迁~

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

http://www.jsqmd.com/news/1033094/

相关文章:

  • 检查unionid是否所属当前钉钉企业/组织架构
  • RL驱动的神经架构搜索实战:从搜索空间设计到芯片部署
  • 分布式系统考察重点
  • 摩托车托运哪家便宜又靠谱?选这几点避坑 - 快递物流资讯
  • 2026深圳福田区搬家公司怎么选?本地人公认的优质搬家品牌服务商优选推荐 - 从来都是英雄出少年
  • BaiduPCS-Go命令行工具:彻底解决百度网盘管理难题的高效方案
  • 2026虚拟资源电商 暑假TOP 爆款品类(附虚拟资源进货渠道分享)
  • 《数组:让程序一下子记住一堆数据》
  • 拒绝断货焦虑!拥有大库存量的Nitronic60不锈钢厂商推荐 - 品牌2026
  • 2026年中武汉宝宝照推荐指南:一岁一咔家庭照相馆深度解析 - 品牌鉴赏官2026
  • Python实现协同过滤算法:从零搭建个性化小说推荐系统
  • Gemini Pro 2026实操指南:普通人如何用提示工程+本地化实现AI深度协作
  • Navicat密码解密终极指南:如何快速找回遗忘的数据库密码
  • 2026红石崖街道正规的空调回收公司有哪些 - 品牌排行榜
  • 2026餐饮店隔油池堵了怎么办?绍兴管道疏通商铺类专项服务评测,主打就是真实! - 极速版本
  • Orange3:如何通过可视化编程实现零代码机器学习分析
  • NXP MC33771 BMS评估板硬件配置与调试实战指南
  • ZigBee ZCL属性管理:核心函数原理、实战与调试指南
  • 从零上手经典8位MCU评估板:硬件调试与CodeWarrior开发全流程
  • 1N6506二极管阵列深度解析:从ESD保护到高速开关的实战应用
  • OpenSlide 终极指南:快速掌握虚拟切片图像处理技术
  • 深度学习入门完全指南:用Deeplearning4j-examples快速掌握Java深度学习
  • 电脑常见问题汇总
  • 2026年台州税务咨询选对=省心 企赢税务AI智能财税推荐 - 本地品牌推荐
  • AI Agent 入门:从会回答到能完成任务
  • 深度应用:YOLO检测模型解决实际视觉识别难题的关键策略
  • AI-Scientist:10分钟自动化科研工作流,让LLM为你完成科学发现全流程
  • SVN 分支管理最佳实践 SVN 与 Git 命令对照表
  • 开发者最喜欢的PHP开源商城源码排行榜(2026版)——为什么有些商城源码拥有几万Star,却依然很少进入企业项目?
  • i.MX35 PDK嵌入式Linux开发套件:从硬件认知到多媒体应用实战