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

[Loop Engineering在MAF中的实现-05]MAF预定义的评估器

除了利用AIJudgeLoopEvaluator让LLM当评委介绍的AIJudgeLoopEvaluator,MAF还提供了其他几种继承自LoopEvaluator的评估器类型,接下来我们会逐个介绍它们。

1. DelegateLoopEvaluator

DelegateLoopEvaluator非常简单,就是利用提供的Func<LoopContext, CancellationToken, ValueTask<LoopEvaluation>>类型的委托来实现EvaluateAsync方法的评估工作。

publicsealedclassDelegateLoopEvaluator:LoopEvaluator{privatereadonlyFunc<LoopContext,CancellationToken,ValueTask<LoopEvaluation>>_evaluate;publicDelegateLoopEvaluator(Func<LoopContext,CancellationToken,ValueTask<LoopEvaluation>>evaluate)=>_evaluate=evaluate;publicoverrideValueTask<LoopEvaluation>EvaluateAsync(LoopContextcontext,CancellationTokencancellationToken=default)=>_evaluate(context,cancellationToken);}

2. CompletionMarkerLoopEvaluator

CompletionMarkerLoopEvaluator旨在确定任务是否结束来决定循环调用是否继续。它的做法很简单,在调用Agent提供的提示词中明确告诉LLM:如果它认为任务已经完成,就在返回的响应文本中包含指定的完成标记(Completion Marker)CompletionMarkerLoopEvaluator通过确定最终的响应文本是否包含此标记来生成最终的LoopEvaluation

publicsealedclassCompletionMarkerLoopEvaluator:LoopEvaluator{publicCompletionMarkerLoopEvaluator(stringcompletionMarker,CompletionMarkerLoopEvaluatorOptions?options=null);publicoverrideValueTask<LoopEvaluation>EvaluateAsync(LoopContextcontext,CancellationTokencancellationToken=default);}publicsealedclassCompletionMarkerLoopEvaluatorOptions{publicstring?FeedbackMessageTemplate{get;set;}}

我们在调用构造函数的时候,通过completionMarker参数指定上述的完成标记,并通过提供可选的配置选项CompletionMarkerLoopEvaluatorOptions提供一个格式化反馈文本的模板。如果没有提供此配置选项,则使用如下这个默认模板,这就是我们上面介绍的让LLM在认为推理任务结束时在响应文本放置完成标记的提示词。如果原始的请求中没有类似的提示词,意味着针对首次迭代的评估必然会失败。

Continue working on the request. When you have fully completed the task, end your response with the marker '{completion_marker}' to indicate completion.

下面的演示程序很好地体现了CompletionMarkerLoopEvaluator的评估逻辑。该程序同时指明了,CompletionMarkerLoopEvaluator在进行字符比较时,针对大小写是敏感的。

varevaluator1=newCompletionMarkerLoopEvaluator(completionMarker:"DONE");varevaluator2=newCompletionMarkerLoopEvaluator(completionMarker:"done");varcontext=newLoopContext(agent:newFakeAgent(),session:newFakeSession(),initialMessages:[],lastResponse:newAgentResponse(newChatMessage(ChatRole.Assistant,"DONE")));varevaluation=awaitevaluator1.EvaluateAsync(context);Debug.Assert(!evaluation.ShouldReinvoke);Debug.Assert(evaluation.Feedbackisnull);evaluation=awaitevaluator2.EvaluateAsync(context);Debug.Assert(evaluation.ShouldReinvoke);Debug.Assert(evaluation.Feedback=="Continue working on the request. When you have fully completed the task, end your response with the marker 'done' to indicate completion.");

3. TodoCompletionLoopEvaluator

TodoCompletionLoopEvaluator会结合TodoProviderAgentModeProvider一起使用,它们都是MAF两个自定义的AIContextProvider类型。前者利用提供的系统指令和工具指导和帮助LLM采用TodoList的模式执行任务,后者则为根据不同阶段的任务特性指定针对性的推理模式。在我的文章TodoProvider:用TodoList驱动Agent的任务执行和AgentModeProvider:自由切换行为模式具有这对这两个AIContextProvider类型的详细介绍。

如果采用TodoCompletionLoopEvaluator,意味着在执行任务的之前会制定一份TodoList,并按部就班地按照它来实施。TodoCompletionLoopEvaluator旨在避免在某些事项尚未执行就停止循环。如果同时还同时使用了AgentModeProvider,并且只希望LoopAgent只在指定的模式下才进行后续迭代,我们还可以利用TodoCompletionLoopEvaluatorOptions设置这个模式列表。

publicsealedclassTodoCompletionLoopEvaluatorOptions{publicIEnumerable<string>?Modes{get;set;}publicstring?FeedbackMessageTemplate{get;set;}}

除了用于指定允许继续迭代的模式列表的Modes属性外,配置选项类型TodoCompletionLoopEvaluatorOptions还提供了FeedbackMessageTemplate属性用来定义评估反馈的文本模板。如果没有显式指定,默认采用如下的模板文本,占位符{remaining_todos}表示尚未完成的Todo事项。

You still have incomplete todo items. Continue working until every item is complete, marking each item as complete when finished. The following items are still open: {remaining_todos}

TodoCompletionLoopEvaluator的构造函数具有唯一的可选参数options。如果没有通过这个参数显式指定一个TodoCompletionLoopEvaluatorOptions对象,意味着TodoCompletionLoopEvaluator的评估将不会考虑推理模式的因素。

publicsealedclassTodoCompletionLoopEvaluator:LoopEvaluator{publicTodoCompletionLoopEvaluator(TodoCompletionLoopEvaluatorOptions?options=null);publicoverrideasyncValueTask<LoopEvaluation>EvaluateAsync(LoopContextcontext,CancellationTokencancellationToken=default);}

重写的EvaluateAsync会采用如下的方式实施评估:

  • 如果设置了运行继续迭代的推理模式列表,利用LoopContext上下文获取当前AIAgent,并调用其GetService<AgentModeProvider>方法获取注册的AgentModeProvider:
    • 如果AgentModeProvider不存在,直接抛出异常;
    • 否则则继续调用它的GetMode方法得到当前的推理模式,如果此推理模式不在设定的模式列表中,直接返回一个ShouldReinvokefalseLoopEvaluation终止循环;
  • 按照相同的方式得到注册的TodoProvider
    • 如果TodoProvider不存在,直接抛出异常;
    • 否则调用其GetRemainingTodosAsync方法返回尚未完成的Todo事项:
      • 如果存在,利用设置的或者默认的模板生成反馈文本,并封装在返回的ShouldReinvoketrueLoopEvaluation中;
      • 否则返回一个ShouldReinvokefalseLoopEvaluation终止循环。

4. BackgroundTaskCompletionLoopEvaluator

BackgroundTaskCompletionLoopEvaluatorTodoCompletionLoopEvaluator其实有点类似,它们的目的都是为了避免在有些必要的任务尚未执行前就终止循环。具体来说,BackgroundTaskCompletionLoopEvaluatorBackgroundAgentsProvider这个AIContextProvider有关。BackgroundAgentsProvider提供了一系列的工具,使我们可以采用后台任务的形式执行指定的AIAgent,在我的文章BackgroundAgentsProvider:异步执行SubAgent对进行了详细介绍。

BackgroundTaskCompletionLoopEvaluator的目的在于:如果当前具有还在后台执行的任务,就不能终止循环。如下面的代码所示,我们创建BackgroundTaskCompletionLoopEvaluator时可以通过指定对应的BackgroundTaskCompletionLoopEvaluatorOptions,并利用后者的FeedbackMessageTemplate提供一个用于格式化反馈文本的模板。

publicsealedclassBackgroundTaskCompletionLoopEvaluator:LoopEvaluator{publicBackgroundTaskCompletionLoopEvaluator(BackgroundTaskCompletionLoopEvaluatorOptions?options=null);publicoverrideasyncValueTask<LoopEvaluation>EvaluateAsync(LoopContextcontext,CancellationTokencancellationToken=default);}publicsealedclassBackgroundTaskCompletionLoopEvaluatorOptions{publicstring?FeedbackMessageTemplate{get;set;}}

如果反馈文本模板没有显示指定,默认会采用如下所示的模板文本,占位符{incomplete_task_count}表示尚未完成的后台任务的数量。

You still have {incomplete_task_count} background task(s) running that must finish before you can complete the work:\ {incomplete_tasks} Wait for these tasks to complete, retrieve their results, and incorporate them. Only stop once every background task has finished.

重写的EvaluateAsync会按照如下的方式实施评估:

  • 利用LoopContext上下文获取当前AIAgent,并调用其GetService<BackgroundAgentsProvider>方法获取注册的BackgroundAgentsProvider
  • 如果BackgroundAgentsProvider不存在,直接抛出异常;
  • 否则调用BackgroundAgentsProviderGetIncompleteTasks方法的到尚未完成的后台任务:
    • 如果任务列表不为空:利用模板格式化反馈文本,并封装在返回的ShouldReinvoketrueLoopEvaluation中;
    • 否则返回一个ShouldReinvokefalseLoopEvaluation终止循环。
http://www.jsqmd.com/news/1210913/

相关文章:

  • 三维地图引擎选型指南:Cesium与Mapbox对比
  • PHP开发者必备资源大全与工具链指南
  • 天津宝珀回收价格查询与靠谱平台实测排行(2026年7月最新) - 收的高名表回收平台
  • Python程序打包实战:PyInstaller详解与最佳实践
  • C++构建高性能教育推荐系统:架构设计与工程实践
  • WPF 六大集合容器控件完整对比
  • OpenAI全内部安全委员会:AI治理从外部合规到内生能力的范式转变
  • 技术平权——眨眼猫打造“一顿饭的会务智能体”,让每一场会务活动都能拥有自己的智能体小程序!
  • AI如何学会听懂无文字的闽南语:任务驱动的方言建模实践
  • AI落地物理世界的五大断点与七步实操法
  • 腾讯:长时终端任务密集评测基准
  • ROS2在Ubuntu 22.04上的安装与优化指南
  • 4.Deep Dream 模型
  • 寒假笔记5
  • GPT服务订阅技术解析:支付失败、区域限制与工程实践
  • Java内存泄漏排查终极手册:工具+步骤+真实案例复盘
  • 2026年7月最新卡地亚北京双安商场维修保养服务电话 - 卡地亚官方售后中心
  • Spring Gateway+Sa-Token+Nacos构建微服务统一认证方案
  • STM32驱动DHT11温湿度传感器:单总线协议与代码实现详解
  • 2026年北京市生成式人工智能大模型备案综合分析报告
  • 【慕伏白】如何在远程公共服务器部署个人深度学习 Docker 环境(With GPUs)
  • Java工程师进阶指南:从基础到高级的技术成长路径
  • Android开发全流程:从系统架构到性能优化
  • 基于YOLOV8的道路缺陷检测系统21(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_
  • Android模拟定位技术解析与应用实践
  • 江诗丹顿中国官方售后服务中心|服务电话和详细网点地址权威信息声明(2026年7月更新) - 江诗丹顿服务中心
  • Go模块调试总卡壳?Cursor实时诊断功能全解析,3分钟定位panic根源
  • 人形机器人城市漫步:从技术原理到社会实验的全面解析
  • 从机器人厨房打滑事件看双足机器人平衡控制与感知技术挑战
  • 内容产能不足、获客成本高,拓氪科技 AI 系统该如何赋能电商精细化运营?