AI Agent工程化:Prompt、Context、Loop、Harness四大核心骨架解析

1. 项目概述:从四个关键词透视AI Agent的工程骨架

最近和不少朋友聊起AI Agent开发,发现一个挺有意思的现象:大家都能说出几个时髦的概念,比如“智能体”、“自主决策”,但一聊到具体怎么把一个Agent从想法变成能稳定运行的工程系统,很多人就开始挠头了。这感觉就像你知道一辆车有发动机、方向盘和轮子,但真要自己动手组装,却发现连螺丝该拧在哪里都搞不清楚。

在我看来,AI Agent的工程化,其核心骨架可以凝练为四个关键词:Prompt、Context、Loop、Harness。这四者绝非孤立的概念,而是一个环环相扣、层层递进的工程体系。Prompt是给AI的“指令集”,决定了它思考的起点和方式;Context是AI的“工作记忆”,决定了它能处理多复杂的问题;Loop是AI的“行动循环”,决定了它如何与环境互动并持续进化;而Harness,则是包裹在前三者之外的“基础设施与安全笼”,确保整个系统可控、可靠、可观测。

很多人一上来就沉迷于设计华丽的Prompt,或者追求超长的Context窗口,却忽略了Loop的设计和Harness的构建,结果就是造出一个在Demo里惊艳、在生产环境里“秒崩”的“玩具”。今天,我就结合自己趟过的坑,把这四个关键词掰开揉碎了讲清楚,希望能帮你搭建起一个既智能又健壮的AI Agent系统。

2. 核心需求解析:为什么是这四个词?

在深入每个词之前,我们得先明白,为什么是这四个词构成了工程化的核心?这源于AI Agent在落地时面临的几个根本性挑战:

2.1 从静态问答到动态执行的跨越传统的AI应用(如聊天机器人、文本生成)大多是“一问一答”的静态模式。用户输入,模型输出,交互结束。但AI Agent的核心是“执行”,它需要理解一个复杂目标,并将其分解为一系列动态的、可能依赖环境反馈的步骤。这就要求我们必须超越单次的Prompt调用,去设计一个能持续运行、根据反馈调整行动的机制(Loop),并为这个机制提供充足的信息支撑(Context)。

2.2 从开放域到受控域的约束大语言模型(LLM)本身是开放域的,它能天马行空地生成内容。但一个有用的Agent必须在特定领域、遵循特定规则、使用特定工具去工作。我们不能让它随意调用API,或者生成不符合业务逻辑的回复。这就需要一套强大的约束和引导机制,一方面通过精心设计的Prompt来设定角色、目标和边界,另一方面通过外部的Harness来强制执行安全策略、管理工具调用、监控异常。

2.3 从概率模型到可靠系统的转变LLM的输出具有概率性,这次表现好,下次可能就“胡言乱语”。工程化就是要将这种不确定性封装起来,构建确定性。Prompt工程是降低不确定性的第一道防线;Context管理是提供稳定认知背景的关键;Loop设计通过多步验证和纠错来提升整体可靠性;而Harness则是最后的保险丝和诊断工具,在系统出错时能及时熔断、记录现场、方便调试。

因此,Prompt、Context、Loop、Harness分别对应了引导、记忆、行动、管控这四个维度,共同解决了AI Agent在“做什么”、“记得什么”、“如何持续做”以及“如何安全地做”的问题。

3. Prompt:不止是提示词,更是系统指令与约束框架

一提到Prompt,很多人的第一反应就是“写给AI的几句话”。但在Agent工程里,Prompt是一个复杂的、结构化的系统指令集合。它至少包含以下几个层次:

3.1 系统指令(System Prompt):定义Agent的“人格”与“宪法”这是最核心的部分,在对话开始前一次性注入,定义了Agent的底层行为逻辑。一个好的系统指令应该像一份详细的岗位说明书和公司规章制度。

  • 角色与目标:清晰定义Agent是谁,它的终极任务是什么。例如:“你是一个资深的数据分析助手,目标是帮助用户通过自然语言查询,从数据库中安全、准确地获取和分析数据。”
  • 能力与边界:明确告知Agent它能做什么,不能做什么。特别是要强调安全边界,例如:“你只能执行被明确授权的数据查询操作。严禁尝试任何数据修改(INSERT、UPDATE、DELETE)、删除(DROP)或涉及用户隐私字段的查询。如果用户请求模糊或可能触及边界,你必须要求用户澄清。”
  • 输出格式规范:规定Agent思考过程和最终输出的格式。这对于后续的程序化解析至关重要。例如,要求Agent以特定的JSON结构输出,包含“thought”(思考链)、“action”(要执行的动作)、“action_input”(动作输入)等字段。
  • 思考链(Chain-of-Thought)引导:鼓励或强制要求Agent展示其推理步骤。这不仅能提高答案质量,更重要的是为Harness层提供了审计线索。例如:“请逐步思考你的分析过程。首先确认用户查询的意图,然后规划需要查询的数据表和字段,最后再生成SQL或结论。”

实操心得:系统指令不是写一次就完事的。你需要像训练一个新人一样,不断根据它的“犯错记录”来增补指令。我们曾经遇到Agent偶尔会生成带有DELETE关键词的语句,尽管它没有执行权限。后来我们在系统指令中明确加入了“严禁在生成的任何中间代码或语句中出现 ‘DELETE‘、’DROP‘、’TRUNCATE‘ 等危险关键词,即使是注释或示例中也禁止”的条款,这类问题就再没出现过。

3.2 用户查询(User Query)与对话历史(Message History)用户当次的问题,以及之前几轮的对话记录,共同构成了当次请求的具体上下文。这里的关键是如何有效利用历史。

  • 历史摘要:对于长对话,直接将全部历史消息传入Context会迅速消耗令牌(Token)。一个工程上的常见做法是,在对话轮次超过一定数量后,启动一个“摘要Agent”,将过往对话的核心结论和事实压缩成一段简短的摘要,替换掉冗长的原始历史,再连同最新几条原始记录一起送入Context。这能在有限窗口内保留最关键的记忆。
  • 相关性过滤:并非所有历史都对当前问题有帮助。可以设计简单的规则或用一个轻量级模型,筛选出与当前查询最相关的历史片段进行注入,提升信息密度。

3.3 工具描述(Tool Descriptions)当Agent需要调用外部API(如搜索、计算、数据库查询)时,你必须以结构化方式向它描述这些工具。这通常遵循类似OpenAI Function Calling的格式:

{ "name": "query_database", "description": "执行一条安全的SELECT查询语句,从授权的数据表中获取数据。", "parameters": { "type": "object", "properties": { "sql": { "type": "string", "description": "要执行的SELECT查询语句。必须仅涉及允许访问的表和字段。" } }, "required": ["sql"] } }

描述的质量直接影响Agent的工具使用能力。描述要精确、无歧义,并再次在描述中强调安全约定(如“安全的SELECT查询”)。

3.4 少样本示例(Few-shot Examples)对于复杂或易出错的任务,在Prompt中提供1-3个高质量的输入输出示例,能极其有效地对齐Agent的行为。示例应覆盖正例和常见的边界情况/错误处理。

示例: 用户:“帮我查一下上个月销售额最高的产品是什么。” 助理思考:“用户需要上个月销售额最高的产品信息。这需要查询销售记录表。我需要先确认‘上个月’的具体日期范围,然后按产品汇总销售额并排序。我将使用query_database工具。” 助理行动:

{ "thought": "用户需要查询上个月(假设当前是2023年11月,则上个月为2023年10月)的销售数据,并按产品汇总排序取第一名。", "action": "query_database", "action_input": { "sql": "SELECT product_id, product_name, SUM(sale_amount) as total_sales FROM sales_record WHERE sale_date BETWEEN '2023-10-01' AND '2023-10-31' GROUP BY product_id, product_name ORDER BY total_sales DESC LIMIT 1;" } }

通过这样一个结构化的Prompt体系,我们为Agent构建了一个坚固的“内在驱动与约束系统”。然而,仅有好的指令还不够,Agent需要有足够的“记忆力”来处理复杂任务。

4. Context:有限窗口下的无限艺术,记忆管理的核心

Context,即上下文窗口,是模型在一次处理中能够“看到”的所有文本(包括Prompt和历史)的总和。你可以把它想象成Agent的“工作内存”(RAM)。工程上的核心矛盾在于:模型的能力(理解复杂任务)需要更长的Context,但成本、延迟和模型本身的性能衰减都随着Context长度增加而上升。

4.1 Context的构成与消耗一次典型的Agent调用,其Context消耗大致如下:Context消耗 = 系统指令 + 工具描述 + 少样本示例 + 压缩后的对话历史 + 当前用户查询 + 模型之前的回复其中,系统指令、工具描述和少样本示例是相对固定的“基础负载”,而对话历史和模型回复是随着交互不断增长的“可变负载”。

4.2 长Context的挑战与应对当任务非常复杂,需要参考大量背景资料(如一份长文档、一个代码库)时,我们很容易触及模型的Context长度上限(如128K、200K tokens)。直接塞入所有内容不仅昂贵,而且模型在长文本中部的注意力会下降,导致性能不佳。

工程上常见的解决方案是检索增强(Retrieval-Augmented Generation, RAG)与动态Context管理

  1. 知识库检索:将长文档切片、向量化后存入向量数据库。当用户提问时,用问题去检索最相关的几个片段(Chunks),只将这些片段作为Context注入,而不是整个文档。
  2. 分层记忆系统
    • 短期记忆:即当前的对话历史,保存在Context窗口内,用于维持会话连贯性。
    • 长期记忆:将对话中的重要结论、用户偏好、执行结果等结构化信息,保存到外部数据库(如SQLite、Redis)。当后续对话需要时,再通过检索或直接查询的方式,将相关信息摘要后重新注入Context。
  3. 主动的Context修剪与摘要:如前所述,设定一个阈值,当对话轮次或Context长度超过阈值时,触发一个“摘要”动作,用另一个LLM调用将冗长的历史压缩成精炼的要点,替换旧历史。

4.3 关于Context长度的误区“模型支持200K Context,所以我应该把所有东西都放进去。”——这是一个危险的误区。更长的Context意味着:

  • 更高的API成本:按Token计费,输入Token通常也收费。
  • 更长的响应延迟:模型处理长序列需要更多计算时间。
  • “中间迷失”现象:模型对放在Context中间部分的信息,回忆准确率可能下降。

实操心得:不要盲目追求用满Context窗口。我们的策略是“按需供给,精准投放”。为不同类型的任务设定不同的Context预算。对于简单问答,只保留最近3-5轮历史;对于复杂分析任务,则动态检索相关文档片段并入。我们曾监控到,当注入的无关Context过多时,Agent的指令遵循率会下降约15%。因此,保持Context的“洁净”与“高相关性”是提升Agent表现的关键

管理好Context,相当于为Agent配备了高效的内存系统。接下来,Agent需要利用这些记忆,在一个循环中持续行动。

5. Loop:智能体的心跳,从单次推理到持续行动的引擎

如果说Prompt是大脑的初始设定,Context是当下的记忆,那么Loop就是驱动身体与环境交互的“心跳”和“神经反射弧”。它是Agent自主性的体现。

5.1 Loop的基本模式:感知-思考-行动一个最基础的Agent Loop可以概括为以下步骤:

  1. 感知:接收来自用户的输入或环境的观察(Observation)。
  2. 思考:结合系统指令、历史Context和当前感知,决定下一步该做什么。是直接回答,还是调用某个工具?
  3. 行动:执行决定。如果是调用工具,则执行工具代码并获取结果。
  4. 再感知:将行动的结果(工具返回的结果或环境的新状态)作为新的观察,反馈给Agent。
  5. 循环:重复思考-行动-观察的步骤,直到任务完成或达到终止条件(如最大步数)。

这个循环在代码中通常体现为一个while循环。

5.2 关键循环设计模式在实际工程中,简单的循环不够健壮,需要引入更多设计模式:

  • ReAct(Reason + Act)模式:这是目前最主流的范式。强制要求Agent在每次行动前,输出一段“思考”(Reason),解释它为什么这么做。这极大地提升了行动的可解释性和准确性。Harness层可以解析这段思考,用于监控和安全性检查。
  • 规划-执行-检查(Plan-Execute-Check)模式:对于复杂任务,让Agent先输出一个分步计划(Plan),然后逐步执行(Execute),每步完成后自我检查(Check)是否偏离目标。这适合需要多步骤协作的任务,如编写一个完整程序。
  • 反思(Reflection)循环:在行动失败或结果不理想时,不是直接重试,而是进入一个“反思”子循环。让Agent分析失败原因,调整策略,然后再尝试。这能有效避免在死胡同里无限循环。

5.3 循环的终止与故障处理一个设计不当的Loop可能会陷入死循环,或者反复执行错误操作。必须设置安全阀:

  • 最大迭代次数:硬性规定Loop最多运行N步(如10步、20步),超过则强制终止,并返回“任务超时”错误。
  • 超时控制:不仅限制步数,还要限制总耗时。防止某一步工具调用卡住导致整个Agent挂起。
  • 目标达成检测:让Agent在每次循环后判断“任务是否已完成”。可以定义明确的目标状态,或让Agent自己生成一个完成度判断。
  • 异常捕获与降级:在Loop的每一步,尤其是工具调用环节,必须有完善的Try-Catch。工具调用失败时,应将清晰的错误信息反馈给Agent,让它有机会调整策略。如果连续多次失败,则应跳出循环,交由Harness层进行错误处理和用户提示。

踩坑记录:我们早期的一个数据分析Agent,在用户问“分析趋势”时,会陷入“查询数据 -> 发现数据不足 -> 试图查询更早数据 -> 再次发现格式不对”的死循环。后来我们引入了“反思循环”和“差异检测”:如果连续两次工具调用的输入参数差异很小且都失败,则触发反思,让Agent分析可能的数据边界问题,并最终引导它向用户提问:“您想分析的具体时间范围和指标是什么?目前的数据可能无法直接支持‘趋势’分析。” 这大大提升了系统的健壮性。

Loop让Agent“动”了起来,但一个不受约束、全力奔跑的Agent是危险的。我们需要为它套上“缰绳”和“鞍具”,这就是Harness的职责。

6. Harness:智能体的基础设施与安全笼,工程化的真正体现

Harness,直译是“马具”,在AI Agent工程中,它指的是一套包裹在核心Agent推理逻辑(即Prompt+Context+Loop)之外的基础设施层。它不负责代替Agent思考,而是负责管理、约束、观察和保障Agent的运行。如果说Agent核心是“发动机”,Harness就是整台车的“底盘、控制系统、仪表盘和安全气囊”。

6.1 Harness的核心职能一个完整的Harness系统通常包含以下模块:

模块功能描述为什么重要
生命周期管理负责Agent的创建、初始化、运行、暂停、恢复和销毁。管理Loop的启动与停止。提供Agent作为服务的基石,支持多会话、资源回收。
工具调用网关所有Agent对外部工具(API、数据库、函数)的调用都必须通过此网关。网关负责鉴权、参数校验、执行和返回结果格式化。安全核心!防止Agent越权访问、调用危险函数、进行非法操作。是实现“沙箱”环境的关键。
输入/输出过滤与校验对用户的输入进行清洗(如过滤敏感词、攻击代码),对Agent的输出进行结构化验证和安全扫描(如检查是否包含恶意指令、隐私数据)。防止提示词注入攻击,确保输出合规、可解析。
上下文管理器实现前面提到的Context管理策略:历史摘要、长期记忆存储与检索、Context窗口修剪。优化成本与性能,维持Agent的“记忆”效率。
观察与监控记录完整的交互流水:用户输入、Agent的思考过程、工具调用请求及结果、最终输出。采集性能指标(响应延迟、Token消耗、工具调用成功率)。用于调试、优化、审计和计费。是理解Agent行为的“黑匣子”。
护栏与安全策略定义并执行硬性安全规则。例如:禁止工具调用列表、单次会话最大成本、输出内容合规性检查(如政治、暴力、歧视性内容)。确保Agent行为符合法律法规和商业伦理,是系统的“保险丝”。
流式与异步处理对于耗时长任务,支持流式输出中间思考过程,或将任务放入队列异步执行,避免HTTP请求超时。提升用户体验,处理复杂任务。

6.2 Harness与Agent的关系一个常见的误解是Harness“管理”或“控制”Agent。更准确的比喻是Harness为Agent提供了“运行环境”和“开发工具”

  • 运行环境:Harness像操作系统,为Agent进程分配资源(Context内存、计算时间),提供系统调用接口(工具网关),并实施进程隔离(安全策略)。
  • 开发工具:Harness提供的监控、日志、调试接口,让开发者能像用IDE调试程序一样,去观察和优化Agent的行为。

6.3 构建Harness的实践要点

  1. 工具网关必须“默认拒绝”:网关的权限模型应该是白名单制。Agent只能调用在网关中明确注册并授权了的工具。任何未注册的工具调用请求都被直接拦截并返回错误。
  2. 监控数据要结构化:不要只记录日志文本。应该将Agent的每一步输出(思考、行动指令)都解析成结构化的JSON对象进行存储。这样后续才能做高效的查询分析,比如“统计一下哪种工具被调用最频繁”、“分析任务失败的主要原因”。
  3. 设置多层超时:在Loop层设置单步超时,在Harness层设置单次会话总超时,在网络层面设置HTTP请求超时。多层防护,避免资源泄漏。
  4. 设计降级策略:当核心模型API不可用,或某个关键工具调用持续失败时,Harness应能检测到并切换到降级模式。例如,返回预定义的提示信息,或者用一个更简单的规则引擎来回答高频问题。

血泪教训:我们曾经因为没有在工具网关做严格的参数校验,导致Agent在构造SQL查询时,由于用户输入中包含一个未转义的单引号,生成了错误的SQL语句,工具网关直接执行导致数据库报错。虽然因为权限限制没有造成数据损失,但导致了服务中断。事后,我们在网关层增加了参数语法预检查SQL只读验证(通过解析SQL语法树,确保只有SELECT语句),彻底杜绝了此类问题。Harness的每一个安全特性,几乎都是从一次真实的故障或隐患中总结出来的。

7. 四者协同:一个数据分析Agent的完整工作流

让我们通过一个虚构但典型的“数据分析Agent”场景,将Prompt、Context、Loop、Harness串联起来,看它们如何协同工作。

场景:用户问:“对比一下我们产品A和产品B在过去一个季度的用户活跃度和营收情况。”

7.1 初始化阶段

  1. Harness:接收用户请求,创建一个新的Agent会话实例。加载为该Agent配置的系统指令(包含角色、目标、安全规则、输出格式)、工具描述query_database,calculate_metrics等)和少样本示例,形成初始Prompt模板。
  2. Context:初始Context仅包含上述Prompt模板。

7.2 第一轮循环

  1. 感知:Harness将用户问题Q1放入Context。
  2. 思考:Agent核心(LLM)基于当前Context(系统指令+工具描述+Q1)进行推理。它遵循系统指令中的思考链要求,输出:
    { “thought”: “用户需要对比产品A和B在过去一个季度(假设当前是2023-Q4,则过去一个季度是2023-Q3)的活跃度和营收。这需要从用户行为表和营收表中分别查询相关数据。我需要先明确‘活跃度’的指标(如日活用户数DAU),然后分别查询两个产品的数据。”, “action”: “query_database”, “action_input”: { “sql”: “SELECT product_name, COUNT(DISTINCT user_id) as dau, SUM(revenue) as total_revenue FROM user_activity JOIN revenue_data ON ... WHERE quarter = ‘2023-Q3’ AND product_name IN (‘Product A‘, ’Product B‘) GROUP BY product_name;” } }
  3. 行动:Harness的工具网关接收到行动请求。网关首先校验:query_database工具是否在授权列表?是。接着校验SQL:解析SQL,确认是SELECT查询,且涉及的表和字段在许可范围内。校验通过后,网关执行查询,获得结果R1
  4. 再感知:Harness将工具执行结果R1(一段结构化数据)格式化后,作为“观察”添加到Context中。此时Context变为:初始Prompt + Q1 + Agent的第一次思考与行动 + 观察R1。

7.3 第二轮循环

  1. 感知:Context已更新,包含了上一轮的结果。
  2. 思考:Agent看到R1中的数据,开始下一步推理:“已获取基础数据。现在需要计算一些对比指标,如增长率、占比。我可以调用计算工具。”
    { “thought”: “已获得产品A和B的DAU和总收入。现在需要计算营收增长率(如果历史数据可用)以及各自的营收占比。我将调用calculate_metrics工具。”, “action”: “calculate_metrics”, “action_input”: { “data”: R1, “metrics”: [“revenue_growth”, “revenue_share”] } }
  3. 行动:工具网关再次校验并执行计算工具,返回结果R2
  4. 再感知:R2加入Context。

7.4 最终轮与输出

  1. 思考:Agent基于所有Context(初始Prompt, Q1, 历史思考行动, R1, R2)进行综合推理,认为已获得足够信息来生成最终答案。
    { “thought”: “数据已齐全。现在需要生成一份对比分析报告,包括关键数据、简要分析和可视化建议。”, “action”: “final_answer”, “action_input”: { “answer”: “根据2023年第三季度数据:产品A的DAU为10万,营收50万;产品B的DAU为8万,营收40万。产品A的营收同比增长率更高...建议可绘制柱状图进行对比。” } }
  2. 行动:Harness识别到final_answer是一个特殊动作,不调用外部工具,而是将其中的answer内容取出。
  3. Harness输出过滤:在将答案返回给用户前,Harness的输出过滤模块会检查答案内容是否合规,是否包含未授权的原始数据(如果需要脱敏)。检查通过后,将最终答案返回给用户。
  4. Loop终止:Agent在思考中判定任务完成(或Harness根据预设规则判定),Loop结束。

7.5 全程的Harness保障在整个过程中,Harness的监控模块记录了完整的交互链。上下文管理器可能在对话轮次过多时,自动触发对早期历史的摘要。安全护栏始终在扫描输入和输出,防止任何越权或不合规的内容。

8. 常见问题与排查技巧实录

在实际开发和运维AI Agent系统时,你会遇到各种各样的问题。下面是一些典型问题及其排查思路:

8.1 Agent“胡言乱语”或拒绝执行简单指令

  • 可能原因1:Context污染。检查是否在Context中混入了无关的、可能干扰系统指令的历史信息或示例。
    • 排查:查看Harness记录的完整Context流水。检查系统指令是否被后续对话淹没或覆盖。
    • 解决:强化系统指令的权重(如在某些框架中将其设为永久性消息),或定期在Context中重申关键指令。
  • 可能原因2:Prompt冲突或歧义。系统指令中可能存在矛盾,或者工具描述不够清晰。
    • 排查:仔细审查系统指令,确保角色、目标、约束之间逻辑一致。检查工具描述的parameters是否清晰无歧义。
    • 解决:简化指令,避免复杂的长句。为工具参数提供更具体的示例。

8.2 Agent陷入死循环或重复执行相同操作

  • 可能原因1:目标不明确或无法达成。Agent无法判断任务何时算“完成”。
    • 排查:查看Loop历史,看Agent的思考是否在几个相似状态间来回切换。
    • 解决:在系统指令中明确定义任务完成的条件。或者在Harness中设置更严格的最大迭代步数,并在超时时让Agent输出当前进展和阻塞点。
  • 可能原因2:工具反馈信息不足。工具调用失败或返回的结果过于模糊,导致Agent无法做出有效决策。
    • 排查:检查工具调用的返回结果。是否只是简单的“错误代码500”,而没有更详细的错误信息?
    • 解决:让工具网关返回更丰富的错误信息,例如“查询失败:表 ‘XXX’ 不存在”或“参数错误:’end_date‘ 不能早于 ’start_date‘”。这些信息能有效引导Agent调整策略。

8.3 工具调用错误或越权

  • 可能原因:Harness工具网关校验不严
    • 排查:检查网关日志,看失败的调用请求具体是什么。参数是否合法?SQL是否真的只读?
    • 解决:这是Harness层的核心职责。必须实施严格的白名单校验输入参数清洗与类型校验业务逻辑预检(如SQL解析验证)。对于高风险操作,可以考虑二次确认机制。

8.4 处理长文档或复杂任务时性能低下、成本高

  • 可能原因:将全部文档塞入Context
    • 排查:分析任务的Token使用情况,看输入Context的长度。
    • 解决:引入RAG。将文档切片索引,在用户提问时进行语义检索,只注入最相关的片段。同时,建立分层记忆,将本次会话的摘要存入长期记忆,供后续使用。

8.5 如何调试一个行为异常的Agent?这是Harness监控价值最大的地方。你需要一个“上帝视角”的调试面板,能够回放整个会话:

  1. 查看完整思维链:Harness记录的结构化日志中,必须包含Agent每一步的“思考”(thought)。这是理解其决策逻辑的关键。
  2. 检查Context演变:观察每一轮循环后,Context的具体内容是什么,是否有异常信息注入。
  3. 审查工具输入输出:检查每一次工具调用的请求参数和返回结果,确认是否符合预期。
  4. 性能分析:查看各步骤的耗时、Token消耗,定位瓶颈是在模型推理还是工具调用。

我个人在团队中推行一个习惯:任何一次线上Agent的异常或失败,我们不仅要修复Bug,还必须从中提炼出一条新的Prompt约束、一个Context管理策略、一条Loop终止规则或一项Harness安全校验,并更新到我们的“Agent工程手册”中。这四个关键词构成的框架,正是在这样一次次迭代中变得越发坚固和成熟。