生产级AI代理的核心:运行时框架而非提示工程
深入探讨AI代理系统的关键组件,揭示运行时框架在生产环境中的决定性作用,而非仅依赖提示工程技术。
在AI代理系统的发展过程中,提示工程(Prompt Engineering)常被视为核心技术,但真正决定生产级代理系统可靠性和安全性的,是运行时框架(Agent Harness)。这种框架不仅管理代理的执行流程,还确保系统在复杂环境中保持稳定、可追溯和可控。本文将深入探讨运行时框架的关键作用,并对比其与提示工程的差异,帮助读者理解如何构建更安全、更高效的AI代理系统。运行时框架的核心功能运行时框架是包裹模型的控制系统,负责上下文组装、工具暴露、权限检查、循环控制、状态持久化、观察处理、UI/审计投影、跟踪记录和最终输出约束。这些功能共同构成了代理系统的运行时环境,确保代理在执行任务时不会超出预定义的边界。上下文组装是运行时框架的重要组成部分。
当用户输入任务时,框架不会直接将原始输入传递给模型。相反,它会分析输入的意图和上下文,决定需要加载哪些业务上下文、系统状态和历史消息。例如,在SRE(Site Reliability Engineering)场景中,框架可能会组装服务名称、环境、时间范围、已知依赖关系和最近的事件等信息。这种精细化的上下文管理确保模型获得足够的信息来完成任务,同时避免上下文污染和信息泄露。提示编译器是另一个关键组件。它将运行时状态编译成模型实际看到的输入。
提示编译器不仅仅是简单的字符串拼接,而是将多层信息整合成模型的输入。这些信息包括系统/开发者规则、代理角色/配置文件、任务特定指令、动态上下文、工具使用策略、输出合约、之前的观察、约束和预算等。例如,在SRE RCA(Root Cause Analysis)场景中,提示编译器可能会生成以下输入:系统:您是一个受控的SRE RCA代理;开发者:所有危险操作必须通过批准门;任务:诊断payment-api在过去10分钟内返回的500错误;上下文:service=payment-api,env=prod,time_range=last_10m;输出合约:必须输出症状、影响、证据、可能的原因和下一步行动。工具表面解析器决定模型在当前轮次中可以看到和调用的工具集合。工具表面不是全局工具列表,而是根据任务、角色、权限和环境动态解析的。例如,对于相同的SRE代理,在只读诊断模式下,可能只暴露search_logs、query_metrics和inspect_deployments工具;而在受控执行模式下,可能还会暴露restart_service工具,但需要批准。
这种动态工具管理确保模型只能访问适当的工具,从而提高系统的安全性和可靠性。模型调用是代理系统的核心环节。模型调用后,通常会返回多种类型的输出,包括最终答案、工具调用、澄清请求、结构化计划、拒绝/不确定等。对于运行时框架来说,模型输出既不是事实也不是命令,而是需要处理的事件。例如,模型可能返回一个工具调用请求,但该请求需要经过权限检查和执行前的验证,才能真正执行。工具调用、工具结果和工具模式是理解代理系统运行时的关键区别。
工具模式是工具的规范,定义了工具的名称、描述、参数结构和可用性。工具调用事件是模型实际发起的工具调用请求,而工具结果事件是工具执行后的实际记录。这种分层管理确保工具调用过程的每个环节都受到严格控制和记录。权限检查是代理系统安全性的重要保障。在模型发出工具调用后,运行时必须检查当前代理是否有权限使用该工具,工具是否有权限访问该资源,参数是否在范围内,是否需要批准,是否触发风险策略,预算是否已超支等。例如,模型可能请求重启服务,但运行时会检查该操作是否需要批准,并可能暂停运行以等待批准。
工具结果处理是代理系统的另一个关键环节。原始工具结果不能直接传递给模型,因为它们可能包含格式错误、缺少字段、过大、包含提示注入、数据过时、来自不可信来源或与其他证据冲突的信息。运行时框架需要对工具结果进行验证、清理、标记来源、添加置信度和新鲜度元数据,并将其投影为模型的下一轮推理材料。观察处理是将工具结果转换为模型下一轮推理材料的过程。观察不是原始结果,而是经过验证、清理、压缩和标记后的结果。例如,观察可能包括工具名称、服务名称、时间范围、结果摘要、限制条件和置信度等信息。
这种处理确保模型获得的信息是安全、可靠和可用的。循环控制器决定代理是否继续或停止。观察本身并不能决定是否进入下一轮,真正的裁决者是循环控制器/停止策略。判断逻辑通常包括硬停止、暂停、继续和最终等多种情况。例如,当最大步数达到、预算耗尽、用户取消、出现致命错误或批准被拒绝时,代理会停止;当需要批准、等待人工输入或外部异步作业挂起时,代理会暂停;当证据不足、结果模糊、工具结果可恢复错误、模型请求允许的工具或输出合约未满足时,代理会继续;当输出合约满足、没有有用的下一步行动或只能给出部分答案时,代理会最终结束。投影是将内部状态投影到不同的消费者的过程。
相同的内部事件应该有不同的表示,以适应不同的目标。例如,内部工具结果可能投影为模型的自然语言描述、UI的简洁摘要、审计系统的详细记录或最终用户的可理解答案。这种投影确保内部事实不会直接暴露,而是根据不同的需求转换为适当的视图。跟踪是代理系统的完整运行轨迹。跟踪应该能够回答用户原始输入、意图/上下文组装添加的内容、提示编译器最终给模型的输入、当时暴露的工具、模型请求的工具、参数、权限检查的原因、工具返回的结果、观察如何进入下一轮、为什么循环停止以及最终答案如何生成等问题。跟踪是调试、审计、评估和改进代理系统的重要工具。
在失败场景下,运行时框架的设计也至关重要。例如,当模型请求调用未经授权的工具时,运行时应该拒绝该请求,并将拒绝事件记录到跟踪中;当子代理请求访问父代理的上下文时,运行时应该拒绝该请求,并确保子代理只能看到父代理明确传递的信息;当工具返回脏数据时,运行时应该对其进行验证、清理和标记,而不能直接传递给模型;当提示注入使模型忽略批准时,运行时应该检查实际的批准状态,而不能依赖模型的输出;当长时间运行的任务被中断时,运行时应该保存运行状态、步骤、工具结果、批准状态、工件和检查点,以便在恢复时继续执行;当最终答案与跟踪不一致时,运行时应该通过声明-证据映射来定位问题。声明-证据映射是代理系统的重要机制。每个最终答案中的关键结论都必须能够映射回代理跟踪中的具体证据。例如,最终答案可能包括两个声明:payment-api故障的主要原因是数据库连接池耗尽;部署变更不是直接原因。这些声明应该映射到具体的证据,如metrics_query#14显示数据库连接池使用率为100%、log_search#12显示128个数据库连接超时错误和db_inspect#16显示活动连接达到最大连接数。
这种映射确保最终答案是可追溯、可验证和可审计的。代理系统的循环执行是基于运行时框架的判断进行的。循环执行的前提是运行时框架判断当前运行尚未完成,并且下一步需要模型或工具继续推进。循环的入口通常来自用户消息事件、工具结果事件、批准结果事件或恢复事件。循环以小步推进,而不是盲目循环直到结束。例如,代理系统可能创建或加载运行状态,组装模型输入,调用模型,处理模型输出,可能执行工具,创建观察,决定继续、暂停、最终或失败等。
在代理系统的代码层面,判断是否进入下一轮应该依据运行状态、预算、权限、待处理操作、观察有效性、输出合约、证据充分性和安全下一步行动等多种因素。例如,代理系统可能定义一个RunState接口,包含状态、步骤计数、最大步数、工具调用计数、最大工具调用次数、证据、待处理操作、输出合约和预算等信息。基于这些信息,代理系统可以决定是否继续、执行工具、等待批准、最终结束或部分结束。输出合约是代理系统的重要组成部分。输出合约定义了代理系统需要满足的条件。例如,在SRE RCA场景中,输出合约可能包括症状、影响、可能的原因、支持的指标或日志、检查或解释最近的部署和可操作的下一步行动等。
这种合约确保代理系统的输出符合预期,并满足用户的需求。在面试或评估代理系统时,可以通过多种方式判断候选人是否理解运行时框架。例如,可以要求候选人绘制一个代理轮次的数据流图,从用户输入到最终答案。优秀的答案应该包括上下文组装、提示编译器、工具表面、模型调用、工具调用事件、权限检查、工具结果事件、观察、循环控制器、投影和跟踪等多个环节。浅薄的答案通常只包括提示、模型、工具和答案等简单流程。边界问题是另一个重要的评估方式。
可以问候选人哪些事情可以依赖提示,哪些必须依赖运行时。优秀的答案应该包括提示可以指导策略和格式,而权限、批准、工具可见性、主机绑定、预算、停止条件和状态恢复必须由运行时强制执行。浅薄的答案通常只提到在系统提示中更严格地编写规则。工具问题是评估候选人对代理系统理解的重要方式。可以问候选人工具模式、工具调用事件和工具结果事件的区别。优秀的答案应该包括模式是工具合同,调用事件是模型发起的操作请求,结果事件是运行时执行后的实际记录。
浅薄的答案通常只提到它们与工具调用相关的JSON。安全问题是评估候选人对代理系统理解的重要方式。可以问候选人如果提示注入使模型忽略批准,应该如何处理。优秀的答案应该包括批准状态必须由运行时批准存储管理,模型文本不能代表批准,危险操作必须通过批准门和范围令牌。浅薄的答案通常只提到在系统提示中告诉模型不受提示注入影响。失败恢复问题是评估候选人对代理系统理解的重要方式。
可以问候选人如何在长时间运行的任务被中断后恢复。优秀的答案应该包括持久化运行状态、步骤、工具结果、批准状态、工件和检查点,在恢复时从最后持久化的步骤继续,危险操作不能自动重放。浅薄的答案通常只提到将聊天历史重新发送给模型。证据问题是评估候选人对代理系统理解的重要方式。可以问候选人如何在最终答案与跟踪不一致时定位原因。优秀的答案应该包括执行声明-证据映射,将每个声明追溯到观察、工具结果、工具参数、权限决定、模型输入和投影层。
浅薄的答案通常只提到再次询问模型。在面试或评估代理系统时,可以通过一个强有力的问题来判断候选人是否理解运行时框架。例如,可以要求候选人设计一个SRE RCA代理,该代理可以读取监控、检查日志、执行只读命令并生成修复建议,某些危险命令需要批准。优秀的答案应该包括代理配置文件、上下文组装、提示编译器、工具表面、权限策略、观察管道、循环控制器、跟踪和测试等多个环节。浅薄的答案通常只提到编写SRE系统提示,并给予日志和监控工具。在面试或评估代理系统时,可以通过多个维度来判断候选人是否理解运行时框架。
例如,可以比较候选人对代理定义、工具调用、权限、工具结果、多代理、循环、批准、中断恢复和最终答案的理解。优秀的答案应该包括代理定义是受控运行时中的任务执行单元,工具调用、权限、工具结果、多代理、循环、批准、中断恢复和最终答案都需要运行时框架的强制执行。浅薄的答案通常只提到提示工程和简单的工具调用。在总结中,提示工程使模型倾向于做正确的事情,而运行时框架使系统只能在受控边界内行动。理解运行时框架的重要性,有助于构建更安全、更高效、更可靠的AI代理系统。 。