写这篇文章的初衷主要是为了复盘自己近期的学与思毕竟在脑子里想的再多都不如将所思所想通过文字的形式表达出来。这既能达到个人学习复盘的目的又能将自己的学习心得分享给对这块儿同样感兴趣的朋友。虽然如此但我深知理论必须与实践相结合只有通过动手实践才能检验和纠正自己可能存在的认知偏差。因此我决定写一个关于Harness工程实践的系列文章通过理论和实践相结合来进一步加深我对Harness相关机制的理解深度。这个系列的文章主题包括但不限于Agent Loop、Tool Use、Sub-agent、Context Compact、Agent Teams等。今天是Harness工程实践系列的第一篇主题主要是围绕“Agent Loop”来展开我的分享。什么是Agent Loop?1. 先说说什么是“Loop”?Loop即循环为方便阅读以下简称循环。在我们日常的工作和生活中有很多循环的例子这里简单列举两个。先说说工作场景下的循环例如一名刚入职公司不久的新人在接到一项任务时他不会一开始就把完成任务所需步骤都想清楚而是先基于自己的理解去做第一步。做完后他会找相关人员沟通确认如“这样做对吗”。如果发现有问题他会马上调整然后再做下一步。接着再次沟通、再次调整以此重复循环直到任务被确认完成为止。再说说生活场景下的循环例如我正在家里找钥匙。我先想“可能在沙发上”然后去沙发上查看结果没找到接着我再想“可能在外套口袋”然后去衣帽间翻外套果然在外套口袋里找到了。从以上例子中我们可以提炼出以下要素有明确的目标先尝试执行获取外部反馈根据反馈判断是否正确动态调整下一步行动持续循环直到完成可能有人会说这和本文要讲的Agent循环有啥关系别急我们接着往下看。再说说什么是Agent循环其实前面讲的那些工作中的反复确认、生活中的翻找钥匙如果把主角换成大模型就是最典型的Agent循环。为了让大家有一个更直观的对比我们先来看看Agent在没有循环的工作场景下是如何工作的。没有循环机制的Agent是如何工作的一个没有循环机制的Agent你可以把它想象成一个只给一次机会、不允许中途问问题的执行者。当我们给Agent下达一个任务时它会先识别我们的意图然后根据意图来决定是否需要调用外部工具来处理。需要注意的是这里的工具调用是一次性的即它在完成一次工具调用后就会将最终回答返回给我们并结束当前对话。举个具体例子你让它“帮我查一下明天去北京的航班想订一张下午3点前能到、且价格低于1000元的机票。”这时候没有循环的Agent可能只会做一次搜索比如直接调用一个航班查询接口然后把返回的原始列表给到你“这是所有明天去北京的航班。”它既不会筛选“下午3点前到达”也不会过滤“1000元以下”更不会因为你皱了一下眉头而追问“是不是太贵了需要重新找”整个过程中它没有感知、没有确认、没有调整就像一个只能执行单步命令的“筛选器”——你只问了一次它就只答了一次执行结果是好是坏它并不知晓。而我们的实际需求可能需要Agent通过多次调用工具来完成比如前面订机票的例子仅靠调用一次工具远远满足不了实际需求。因此我们可以得出这样的结论Agent想要很好的完成复杂任务就需要加入循环机制。那么Agent循环到底是什么说到这里Agent循环的定义就呼之欲出了。Agent循环简单来说就是让Agent自己决定“什么时候该动手”然后反复“思考—动手—看结果—再思考”直到任务完成为止。在这个闭环里Agent不再是只输出一次而是不断地重复以下动作观察当前状态“我现在拿到了哪些信息外部环境有什么反馈”思考下一步行动“基于这些信息我现在最应该做什么才能离目标更近”采取具体行动调用工具、执行计算、向用户提问等。收获新的观察行动带来了什么结果然后再次进入思考……把这四个动作首尾相连就构成了经典的思考-行动-观察循环。这个循环会一直转动直到Agent判断“目标已经达成”或者“确实无法解决需要向用户求助”循环才会停止并输出最终结果。回到之前订机票的例子有了循环的Agent会怎么做呢它会先搜航班发现第一轮结果满足下午3点前到达的航班都超过1000元基于这个“观察”它会“思考”“看来需要放宽条件也许试试转机航班或者把价格上限调整到1200元”接着它可能会主动问你“直飞的都超预算转机的有低于1000元的可以吗” 得到你的反馈后它再调整下一步行动。Agent循环的工作原理那么Agent循环机制到底是怎么转起来的呢下面我们以“工具调用”为核心拆解加入了循环机制的Agent在工作时背后究竟发生了什么。1. 创建对话在新创建的对话窗口里用户会向Agent发送第一条消息。此时的对话窗口没有任何上下文用户发送的消息就是当前窗口的唯一上下文。2. 循环判断用户发送的消息会触发系统的循环机制大模型根据用户消息识别其意图并根据意图来判断是否需要调用工具来解决。首先是调用大模型用户发送的消息会作为输入提供给大模型大模型基于输入内容来识别任务类型以及是否需要调用工具。当大模型判断当前输入内容无需调用工具时它会直接返回最终回答。反之大模型则会发起调用工具的请求系统接收到请求后会调用指定工具执行相关操作。这里需要注意大模型本身并不直接调用外部工具。它只是告知系统当前需要调用哪个工具并且提供调用工具所需的相关信息及参数。然后是执行工具当接收到大模型提供的工具相关信息如工具名称、描述和相关参数后系统会直接调用对应工具并同步将相关参数传给工具。被调用的工具在接收到相关参数后就会进入到具体的处理流程。最后是返回工具执行结果当工具处理完后会同步返回处理结果给到大模型。此时大模型在接收到工具返回的结果后它会再次基于历史对话和工具返回结果来判断是否还需要再次发起工具调用请求。若不需要则直接返回最终回答若需要则继续发起工具调用请求系统执行工具工具返回执行结果以此循环。当大模型不需要再次调用工具时循环结束。3. 返回最终回答从最终结果来看用户收到的回答有两种可能一是未经工具调用大模型仅依靠自身知识得到的回答。二是经过工具调用大模型除了依靠自身知识外还结合了工具返回结果综合得到的回答。简单总结一下我们从Agent循环的工作原理可以看出循环机制的核心就是由大模型持续做决策通过循环来引导Agent逐步地去解决问题。动手实践Agent循环的工程实现不知道读到这里的你是否还记得我在本文开头有提到学习只有理论加实践才能对学习内容有更深刻的理解而实践是核心。因此当前这部分就是本文的动手实践环节。我的动手实践主要按照以下思路进行首先明确要解决的问题其次确定解决问题的思路接着进行实操验证最后基于实操结果进行优化调整。问题描述一个轻量的编码助手Code Agent项目该项目主要用于实践从0-1搭建Harness相关的核心机制。目前这个编码助手的问题在于无法多次调用工具只能根据我的任务完成一次工具调用这显然无法满足我的任务需求。我的预期效果是编码助手能够根据任务的复杂程度完成单次或者多次的工具调用直到任务完成。解决思路既然编码助手的当前问题在于无法多次调用工具那么我们可以为其加入循环机制让编码助手能够根据任务的实际需要进行单次或多次的工具调用。实操验证按照解决思路结合前面的工作原理我准备用Claude Code来协助我为这个编码助手加入循环机制。这里特别强调一下实践里涉及到的相关代码实现并非本文重点。实操验证这部分主要是想传递一个观点不仅理论要学得扎实更重要的是要多去动手实践。实践过程中遇到的问题会反向推动你进一步查漏补缺最终对相关概念有一个更加深刻的理解。若你想尝试用代码来实践也可以和我一样通过当前主流的编程Agent国产的RRAE、CodeBuddy国外的Claude Code、Codex来完成。不用担心你不会代码我一开始也不会。遇到问题就问你使用的编程Agent或者平时常用的AI豆包、元宝或者Kimi。当你真正动手实践的那一刻开始你已经走在了多数人的前面。具体实现关于具体实现我仅分享涉及Agent循环的核心部分。项目依赖和环境变量配置等常规设置不再过多赘述。在该项目中我使用的编程语言是Python。(1) 实现Agent循环1 定义 Agent Loop 函数首先在现有编码助手的工程实现里新增一个 Agent Loop 的函数定义。然后在定义的函数里添加一个无限循环 while True 。这里需要注意虽然是一个无限循环但当其满足退出条件时就会退出当前循环。def agent_loop(messages: list): while True:1 以下代码均包含在定义函数的 while True 无限循环里。1 初始化消息列表接着我们创建对话历史列表第一条消息来自用户的原始输入。messages [{role: user, content: query}]1 调用大模型接着将当前所有消息作为输入发送给大模型。同时将大模型的回复结果添加到对话历史中。response client.messages.create( modelMODEL, systemSYSTEM, messagesmessages,toolsTOOLS, max_tokens5000, ) messages.append({role: assistant, content: response.content})1 循环判断接着我们将明确退出循环的判断条件。如果大模型不需要调用工具则直接退出函数即结束循环如果大模型需要调用工具则继续往下执行即继续循环。if response.stop_reason ! tool_use: return1 执行工具接着我们需要明确执行工具时的规则。我们通过遍历大模型来返回所有的内容块找到类型为 tool_use 的块执行Bash命令并将执行结果打包成 tool_result 格式。results [] for block in response.content: if block.type tool_use: output run_bash(block.input[command]) results.append({ type: tool_result ...... })1 返回工具结果最后我们将工具返回的结果追加到对话历史中。当下次循环时大模型就会看到这个工具结果并决定是否再次调用用工具。messages.append({role: user, content: results})1 “role”: “user” 是 Anthropic Claude API 的设计约定告诉模型这是外部工具执行返1 回的信息而不是模型内部的信息。(2) 效果验证Agent循环的相关处理逻辑完成后我们通过终端来运行这个项目看一下添加了循环机制后的效果从运行效果来看Agent触发了循环机制并进行了两次工具调用一次是创建文件并写入指定内容第二次是显示被创建文件的具体内容。写在最后循环机制就像智能体的“心脏”持续驱动着其他机制的运转。比如工具调用多次调用的逻辑串联依赖循环来实现上下文压缩随着对话轮次增加需要在循环中动态判断哪些信息该保留、哪些该压缩才能避免上下文溢出多智能体协作每个智能体的输出作为其他智能体的输入这个交互过程得靠循环来维持直到共同完成任务。没有循环这些机制就成了“一次性操作”无法应对复杂场景的持续需求。结语抓住大模型时代的职业机遇AI大模型的发展不是“替代人类”而是“重塑职业价值”——它淘汰的是重复性、低附加值的工作却催生了更多需要“技术业务”交叉能力的高端岗位。对于求职者而言想要在这波浪潮中立足不仅需要掌握Python、TensorFlow/PyTorch等技术工具更要深入理解目标行业的业务逻辑如金融的风险控制、医疗的临床需求成为“懂技术、懂业务”的复合型人才。无论是技术研发岗如算法工程师、研究员还是业务落地岗如产品经理、应用工程师大模型都为不同背景的职场人提供了广阔的发展空间。只要保持学习热情紧跟技术趋势就能在AI大模型时代找到属于自己的职业新蓝海。最近两年大模型发展很迅速在理论研究方面得到很大的拓展基础模型的能力也取得重大突破大模型现在正在积极探索落地的方向如果与各行各业结合起来是未来落地的一个重大研究方向大模型应用工程师年包50w属于中等水平如果想要入门大模型那现在正是最佳时机2025年Agent的元年2026年将会百花齐放相应的应用将覆盖文本视频语音图像等全模态如果你对AI大模型入门感兴趣那么你需要的话可以点击这里大模型重磅福利入门进阶全套104G学习资源包免费分享扫描下方csdn官方合作二维码获取哦给大家推荐一个大模型应用学习路线这个学习路线的具体内容如下第一节提示词工程提示词是用于与AI模型沟通交流的这一部分主要介绍基本概念和相应的实践高级的提示词工程来实现模型最佳效果以现实案例为基础进行案例讲解在企业中除了微调之外最喜欢的就是用提示词工程技术来实现模型性能的提升第二节检索增强生成RAG可能大家经常会看见RAG这个名词这个就是将向量数据库与大模型结合的技术通过外部知识来增强改进提升大模型的回答结果这一部分主要介绍RAG架构与组件从零开始搭建RAG系统生成部署RAG性能优化等第三节微调预训练之后的模型想要在具体任务上进行适配那就需要通过微调来提升模型的性能能满足定制化的需求这一部分主要介绍微调的基础模型适配技术最佳实践的案例以及资源优化等内容第四节模型部署想要把预训练或者微调之后的模型应用于生产实践那就需要部署模型部署分为云端部署和本地部署部署的过程中需要考虑硬件支持服务器性能以及对性能进行优化使用过程中的监控维护等第五节人工智能系统和项目这一部分主要介绍自主人工智能系统包括代理框架决策框架多智能体系统以及实际应用然后通过实践项目应用前面学习到的知识包括端到端的实现行业相关情景等学完上面的大模型应用技术就可以去做一些开源的项目大模型领域现在非常注重项目的落地后续可以学习一些Agent框架等内容上面的资料做了一些整理有需要的同学可以下方添加二维码获取仅供学习使用