构建 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 engineeringagent 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_promptconfig.system_prompt, modelmodel, toolstools, hookshooks,)model_id与max_tokens参数用于配置 Bedrock 模型。后续我计划扩展以支持其他 3p第三方模型提供方。model BedrockModel( model_idconfig.model_id, max_tokensconfig.max_tokens, streamingTrue,)integrations.mcp_servers与integrations.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_idmemory_store_id) hooks.append(memory_hook) logger.info(Enabled AgentCore Memory hook (store_id%s), memory_store_id)这种方式允许在部署时对 agent 进行配置并可根据具体用例的需要选择性地设置上述各项配置。但如果我想在运行时变更 agent 配置怎么办允许终端用户选择偏好的模型很常见在与 agent 交互途中追加工具集成也很常见。部署时配置 vs 运行时配置如何实现部署时配置作为默认设置运行时配置允许用户用自己的选择覆盖这些默认值。默认的部署配置与可在运行时覆盖的配置invoke 的负载支持在运行时覆盖模型、并新增 connectorstools 或其他 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 tokenconnector_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( harnessArnHARNESS_ARN, runtimeSessionIdSESSION_ID, messages[ { role: user, content: [ {text: Whats 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: Whats 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%免费】

相关新闻

Windows系统wpsystem文件夹解析:安卓子系统数据管理与清理指南

Windows系统wpsystem文件夹解析:安卓子系统数据管理与清理指南

1. 项目概述:揭开“wpsystem”文件夹的神秘面纱如果你在Windows电脑的某个磁盘根目录下,突然发现一个名为“wpsystem”的文件夹,并且它顽固地占据着不小的空间,还无法轻易删除,心里是不是会咯噔一下?这玩意…

2026/6/18 1:15:31阅读更多 →
3步快速解决华硕笔记本色彩配置文件丢失问题:G-Helper免费修复指南

3步快速解决华硕笔记本色彩配置文件丢失问题:G-Helper免费修复指南

3步快速解决华硕笔记本色彩配置文件丢失问题:G-Helper免费修复指南 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook,…

2026/6/18 1:10:30阅读更多 →
告别“改代码式”运维!eBPF 技术如何实现全语言、零侵入的应用可观测?

告别“改代码式”运维!eBPF 技术如何实现全语言、零侵入的应用可观测?

作者:古琦 背景 在云原生与微服务架构下,一套生产系统往往横跨 Go、Java、Python、Node.js 等多种语言运行时,部署形态又散落在容器、Kubernetes、Serverless 之间。要在这样的异构环境里建立统一的可观测性,传统做法是为每种语…

2026/6/18 1:10:30阅读更多 →
Node.js爬虫技术革命:x-crawl如何用AI解决90%的动态网页采集难题

Node.js爬虫技术革命:x-crawl如何用AI解决90%的动态网页采集难题

Node.js爬虫技术革命:x-crawl如何用AI解决90%的动态网页采集难题 【免费下载链接】x-crawl Flexible Node.js AI-assisted crawler library 项目地址: https://gitcode.com/gh_mirrors/xc/x-crawl 在当今数据驱动的商业环境中,企业每天需要处理超…

2026/6/18 2:25:35阅读更多 →
Visual C++运行库终极解决方案:AIO一键修复Windows程序运行问题

Visual C++运行库终极解决方案:AIO一键修复Windows程序运行问题

Visual C运行库终极解决方案:AIO一键修复Windows程序运行问题 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否遇到过打开游戏时提示"找不…

2026/6/18 2:25:35阅读更多 →
客户流失预警模型:RFM+行为数据的算法实现

客户流失预警模型:RFM+行为数据的算法实现

为什么你的流失预警总是"事后诸葛亮"做了这么多年客户成功系统,我发现一个很普遍的问题:很多企业上了一套BI系统,能看到客户过去三个月的数据报表,但到了预测客户会不会流失的时候,还是靠"经验"判…

2026/6/18 2:25:35阅读更多 →
知识管理终极指南:5个技巧让你在Knowledge Repo中高效使用标签系统组织内容

知识管理终极指南:5个技巧让你在Knowledge Repo中高效使用标签系统组织内容

知识管理终极指南:5个技巧让你在Knowledge Repo中高效使用标签系统组织内容 【免费下载链接】knowledge-repo A next-generation curated knowledge sharing platform for data scientists and other technical professions. 项目地址: https://gitcode.com/gh_mi…

2026/6/18 2:25:35阅读更多 →
3分钟了解:如何用openpilot开源系统让你的汽车秒变智能驾驶座驾

3分钟了解:如何用openpilot开源系统让你的汽车秒变智能驾驶座驾

3分钟了解:如何用openpilot开源系统让你的汽车秒变智能驾驶座驾 【免费下载链接】openpilot openpilot is an operating system for robotics. Currently, it upgrades the driver assistance system on 300 supported cars. 项目地址: https://gitcode.com/GitHu…

2026/6/18 2:25:35阅读更多 →
常用类的概念.

常用类的概念.

常用类一、Object类1. Object类的介绍(1) Object类位于java.lang包中,是继承关系的根类、超类,是所有类的父类(直接的父类或是间接父类) (2) Object类型的引用可以用于存储任意类型的对象。 (3) Object类中定义方法,所有类都可以直接使用。2.…

2026/6/18 2:20:35阅读更多 →
ZigBee HA智能家居开发实战:从集群模型到NXP JN516x代码实现

ZigBee HA智能家居开发实战:从集群模型到NXP JN516x代码实现

1. ZigBee HA:智能家居的“通用语言”与开发基石如果你正在或计划踏入智能家居设备开发领域,尤其是基于ZigBee协议,那么“ZigBee Home Automation”这个名词你一定不陌生。它不仅仅是ZigBee联盟定义的一套应用层规范,更是确保不同…

2026/6/18 0:00:24阅读更多 →
Java毕设选题推荐:基于 Spring Boot 的个人随笔博客运维管理系统的设计与实现 基于 Spring Boot 的用户原创博客分享社区【附源码、mysql、文档、调试+代码讲解+全bao等】

Java毕设选题推荐:基于 Spring Boot 的个人随笔博客运维管理系统的设计与实现 基于 Spring Boot 的用户原创博客分享社区【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/6/18 0:00:24阅读更多 →
JN517x嵌入式开发实战:看门狗、脉冲计数器与I2C接口的深度解析与避坑指南

JN517x嵌入式开发实战:看门狗、脉冲计数器与I2C接口的深度解析与避坑指南

1. 项目概述在嵌入式开发领域,尤其是基于NXP JN517x这类无线微控制器的项目中,系统稳定性和与外设的可靠交互是两大核心挑战。前者关乎产品能否在无人值守的复杂环境中长期运行,后者则决定了设备能否准确感知世界并与其他芯片“对话”。JN517…

2026/6/18 0:00:24阅读更多 →