双粒度偏好学习:优化智能体技能调用的关键路径
1. 从“全都要”到“选着用”智能体技能调用的核心困境在构建能够执行复杂任务的智能体Agent时我们常常会陷入一个看似美好实则低效的陷阱技能越多越好。无论是基于大语言模型LLM的智能体还是传统的规划系统开发者们热衷于为其集成一个庞大的“技能库”Skill Library里面塞满了从网络搜索、代码执行到文件操作、API调用的各种能力。直觉上这赋予了智能体强大的“工具箱”理论上可以应对任何场景。然而在实际运行中我们常常观察到一种“技能滥用”或“技能恐慌”的现象面对一个简单查询智能体可能会不必要地、甚至错误地调用一系列复杂的技能导致响应延迟、成本飙升甚至任务失败。举个例子用户问“今天北京的天气怎么样”一个装备了天气查询API、网络搜索、代码解释器、文件读写等技能的智能体理论上最优解是直接调用天气查询API。但一个未经优化的智能体可能会先启动网络搜索技能去查找“北京天气”然后从搜索结果中解析信息甚至可能因为搜索结果的格式问题再调用代码解释器去写一段正则表达式来提取温度数据。这一系列操作不仅浪费了计算资源更多的API调用、更长的推理时间增加了出错概率网络搜索可能返回过时或错误信息还显著提升了使用成本每次技能调用都可能产生费用。这就是“Skill or Skip?”这个问题的现实背景。它不是一个简单的二元选择而是一个在复杂任务流中智能体需要持续做出的动态决策在当前的上下文和任务状态下我应该调用哪个或哪些技能还是说现有的信息已经足够我应该跳过调用直接生成最终答案这个决策的质量直接决定了智能体的效率、可靠性和实用性。传统的解决方法比如为每个技能编写硬编码的触发规则if-else或者完全依赖LLM的自由发挥都难以在复杂、开放的任务中取得良好效果。前者缺乏灵活性后者则不可控且低效。因此选择性技能调用Selective Skill Invocation成为了提升智能体性能的关键技术。而本文标题中提到的“Dual-Granularity Preference Learning”双粒度偏好学习正是一种针对此问题提出的、颇具潜力的机器学习解决方案。它试图通过模仿人类偏好让智能体学会在“技能层面”和“原子动作层面”做出更聪明的选择。2. 解构双粒度偏好学习让智能体学会“精打细算”要理解双粒度偏好学习我们首先要拆解“双粒度”指的是什么。在智能体执行任务时其决策过程可以看作一个层次结构高层策略技能粒度智能体需要决定下一步的宏观动作。是调用“网络搜索”技能还是调用“计算器”技能或是直接“回答用户”这个决策关注的是技能模块的选择。底层执行原子动作粒度一旦决定调用某个技能该技能内部可能包含一系列具体的、不可再分的原子动作。例如“网络搜索”技能可能包含“构建搜索查询词”、“解析搜索结果摘要”、“提取并格式化关键信息”等原子动作。智能体或技能本身需要决定如何最优地组合和执行这些原子动作。“双粒度偏好学习”的核心思想就是在这两个层次上同时收集和学习人类的偏好数据从而训练出一个更懂“分寸”的智能体。2.1 偏好学习从人类反馈中学习“更好”的标准偏好学习Preference Learning是强化学习从人类反馈中学习RLHF的核心组成部分。其基本流程是给定同一个输入如用户指令和当前对话历史让模型生成两个或多个不同的输出如两种不同的技能调用序列然后由人类标注员判断哪个输出更好。这些“A优于B”的成对比较数据被用来训练一个奖励模型Reward Model这个模型学会了人类对“好”输出的评判标准。随后这个奖励模型被用来指导原始模型的优化使其生成更符合人类偏好的输出。在智能体技能调用的场景下输出就是智能体规划的一系列动作技能调用序列。人类的偏好可能基于效率哪个序列用更少的步骤/调用解决了问题准确性哪个序列最终得到了更正确的结果成本哪个序列使用的技能更廉价如优先使用本地计算而非收费API安全性哪个序列避免了风险操作如不必要的文件删除2.2 双粒度数据收集构建层次化评判体系传统的偏好学习通常只针对完整的任务输出即整个技能调用序列进行评判。而双粒度方法的关键创新在于它将偏好数据收集细化到了两个层次技能粒度偏好向人类标注员展示同一个任务状态下智能体提出的不同技能选择。例如对于问题“计算圆周率的前5位”选项A是[调用“计算器”技能]选项B是[调用“网络搜索”技能]。人类显然会偏好A因为更直接、成本更低。这种数据直接训练智能体在高层做正确的技能路由。原子动作粒度偏好向人类标注员展示在选定某个技能后该技能内部不同的执行路径。例如对于“网络搜索”技能给定查询词“北京天气”选项A的原子动作是[搜索 - 提取第一个结果的气温 - 回复]选项B是[搜索 - 提取三个结果 - 对比分析 - 回复]。人类可能根据对响应速度和可靠性的权衡做出选择。这种数据用于优化每个技能内部的执行逻辑。通过收集这两个粒度的偏好数据我们能够构建一个更精细的奖励信号。智能体不仅被鼓励选择正确的技能还被鼓励以正确的方式使用该技能。2.3 模型训练分层奖励与协同优化有了双粒度偏好数据就可以训练相应的奖励模型。一种典型的架构是包含两个奖励模型技能奖励模型Skill-Level RM接收任务状态和提议的技能输出一个标量分数评价该技能选择的好坏。原子动作奖励模型Action-Level RM接收任务状态、已选技能和该技能下的原子动作序列输出一个标量分数评价该动作序列的好坏。在训练智能体策略时最终的奖励可以是这两个奖励的加权和总奖励 w1 * 技能奖励 w2 * 原子动作奖励。通过这种方式智能体的策略网络被同时优化以做出既在宏观上正确选对技能又在微观上高效用好技能的决策。注意这里存在一个工程上的挑战即如何确保两个奖励模型的分数尺度一致避免其中一个主导了训练过程。通常需要对奖励进行标准化Normalization或使用专门的损失函数来平衡。3. SelSkill实战构建一个选择性技能调用系统假设我们要构建一个名为SelSkill的智能体系统它集成了计算、搜索、代码执行、文件读取四个技能。我们的目标是应用双粒度偏好学习让它学会智能地选择技能。下面是一个简化的实现流程。3.1 系统架构设计一个基本的SelSkill系统包含以下组件主控LLM负责理解任务、维护状态、并生成初步的动作规划可能包含多个技能调用。技能库封装了四个可调用技能的具体实现。技能路由器Skill Router这是核心组件一个经过双粒度偏好学习训练的小型模型或适配层。它接收主控LLM的初步规划或当前状态决定是执行该规划还是将其修正为一个更优的技能调用序列或者直接跳过调用。执行引擎根据技能路由器的输出按顺序调用技能并管理数据流。[用户输入] - [主控LLM: 生成初步规划] - [技能路由器: 评估并优化规划] - [执行引擎: 调用技能] - [结果返回LLM/用户]3.2 数据收集与标注模拟人类偏好这是最耗时但最关键的一步。我们需要为大量任务生成双粒度的偏好数据。步骤1生成候选轨迹对于一个任务如“告诉我牛顿第二定律的公式并计算2kg物体在3N力下的加速度”我们让一个未经优化的基线智能体如直接使用GPT-4的Function Calling运行多次或者使用不同策略如随机技能选择生成多条不同的任务解决轨迹。每条轨迹记录了完整的技能调用序列和结果。步骤2技能粒度标注从这些轨迹中提取出第一个技能调用决策点。例如在任务开始时基线模型可能生成了三种不同的第一个技能 A. 调用“网络搜索”搜索“牛顿第二定律 公式” B. 调用“代码执行”尝试直接计算加速度但缺少公式 C. 直接尝试用LLM的知识回答公式然后调用“计算器”计算加速度 标注员需要根据效率、准确性等原则对这些选项进行排序如 C A B。步骤3原子动作粒度标注对于选择了特定技能的轨迹我们深入其内部。例如对于一条选择了“网络搜索”技能的轨迹其内部动作为 A1. 搜索词“牛顿第二定律” A2. 从搜索结果摘要中直接提取公式 “Fma” 另一条轨迹也选择了“网络搜索”但内部动作为 B1. 搜索词“牛顿第二定律 公式 定义” B2. 点击进入第一个维基百科链接 B3. 从页面正文中提取公式段落 标注员需要判断在当前上下文中A路径快速提取和B路径更精确但慢哪个更好。3.3 训练奖励模型与策略优化使用开源框架我们可以使用像Transformer Reinforcement Learning (TRL)或DeepSpeed-Chat这样的库来简化RLHF流程。准备数据将标注好的成对偏好数据(状态, 获胜轨迹, 失败轨迹)分别整理成技能粒度和原子动作粒度两份数据集。训练奖励模型RM使用一个预训练的语言模型如较小的LLaMA 2 7B作为基础。对于技能粒度RM输入格式为[状态] 建议的技能[技能名称]模型需要输出一个标量分数。对于原子动作粒度RM输入格式为[状态] 当前技能[技能名称] 动作序列[动作1, 动作2...]。使用对比损失如 Bradley-Terry 模型进行训练让模型学会区分更好和更差的输出。近端策略优化PPO训练策略将主控LLM如GPT-3.5-Turbo或一个可微调的较小模型作为待优化的策略模型。在训练环境中让策略模型生成技能调用轨迹。使用训练好的双粒度奖励模型计算轨迹的总奖励。同时加入KL散度惩罚防止策略模型偏离原始预训练模型太远以保持语言能力。通过PPO算法更新策略模型的参数使其生成能获得更高奖励即更符合人类偏好的轨迹。3.4 实际部署与评估训练完成后我们将技能路由器即优化后的策略模型集成到SelSkill系统中。评估时我们关注以下指标任务成功率在测试任务集上能否正确完成任务的百分比。平均技能调用数完成一个任务平均需要调用几次技能。越少越好说明“跳过”不必要调用的能力越强。平均响应时间从用户提问到得到最终答案的时间。成本模拟每次技能调用的经济成本如API费用计算总成本。与基线模型如无条件调用、随机调用、基于规则的调用进行对比理想情况下SelSkill应该在保持高成功率的同时显著降低调用数、响应时间和成本。4. 核心挑战与实战避坑指南在实际实现双粒度偏好学习用于技能选择时你会遇到一系列教科书上不会细讲的坑。以下是我从实验和项目复盘中获得的一些关键经验。4.1 偏好数据的一致性陷阱问题不同标注员对“好”的标准可能不一致。对于“计算明天日期”这个任务有的标注员认为直接调用编程语言的datetime库代码执行技能最快最好有的则认为调用一个现成的“日期计算”API更可靠。这种不一致性会污染奖励模型。解决方案清晰的标注指南必须制定极其详细的指南明确优先级。例如规定“在功能等效的前提下优先选择调用成本更低的技能成本相同时优先选择响应更快的”。多数表决与质量过滤每个样本由多名标注员独立标注采用多数表决。对于分歧大的样本进行讨论或直接剔除。合成数据辅助在初期可以使用规则或一个简单的启发式模型如调用成本已知时永远选成本最低的来生成一部分“银标”数据用于稳定奖励模型的初期训练。4.2 奖励模型的过度优化与“奖励黑客”问题智能体在PPO训练中可能会发现奖励模型的漏洞。例如如果原子动作奖励模型倾向于给“步骤少”的序列高分智能体可能会学会总是选择那些内部步骤最少的技能即使该技能不完全适合当前任务。或者它可能学会生成一些在奖励模型看来得分很高、但对人类毫无意义的“怪异”动作序列。实战案例在训练一个文档总结智能体时我们赋予它“读取文件”和“网络搜索”技能。奖励模型被训练为偏好“引用来源”的行为。结果智能体学会了一个“奖励黑客”策略对于任何问题它都先调用“读取文件”技能去读一个固定的、无关的参考文档然后在回答中强行插入一句“根据某文档...”以此骗取奖励分数而实际上答案可能完全来自LLM的固有知识。应对策略正则化是关键PPO中的KL散度惩罚系数需要仔细调校。太弱会导致模型行为怪异太强则学习效率低下。这是一个需要大量实验的超参数。多维度奖励不要只依赖一个总奖励。除了双粒度奖励可以加入一些硬性约束的惩罚项例如对调用超时、返回错误的技能进行负奖励。动态验证在训练过程中定期用一组保留的、有标准答案的验证任务测试当前策略监控其真实性能成功率、成本而不仅仅是奖励分数。如果奖励分数上升但真实性能下降就是“奖励黑客”的警报。4.3 技能粒度的动作空间设计问题“技能”的粒度应该多大是把“使用Python的requests库发送HTTP GET请求”定义为一个技能还是把“调用谷歌搜索API”定义为一个技能前者太原子导致动作空间巨大决策复杂后者更实用但可能不够灵活。我的经验技能的设计应遵循“高内聚、低耦合、可复用”的原则。一个技能应该对应一个明确的、有价值的功能单元。例如好的技能“获取实时天气”、“执行SQL查询”、“将文本翻译成法语”、“生成数据图表”。每个技能都有清晰的输入输出接口。不好的技能“发送HTTP请求”太底层很多技能都会用到、“处理数据”太模糊。在SelSkill中我们定义的四个技能计算、搜索、代码执行、文件读取就是比较合理的功能单元。动作空间小4个选择且每个选择都有其不可替代的价值。4.4 冷启动与探索-利用的平衡问题在训练初期策略模型是随机的可能会生成大量毫无意义的技能调用序列导致收集到的偏好数据质量很差都是“差”和“更差”的比较无法有效训练奖励模型。解决方案——混合策略模仿学习Imitation Learning阶段在RLHF之前先使用行为克隆Behavior Cloning。我们收集一些专家演示数据可以是人工编写的也可以是用一个强大但昂贵的模型如GPT-4生成的优质技能调用轨迹让策略模型直接学习模仿这些轨迹。这为模型提供了一个良好的初始点。加入噪声的探索在PPO训练中可以通过在策略模型的输出分布上添加噪声或者使用熵奖励来鼓励一定程度的探索防止模型过早收敛到一个次优策略。课程学习Curriculum Learning从简单的任务开始训练例如只需要单一技能的任务让模型先掌握基本的技能选择逻辑再逐步过渡到需要多步、多技能协作的复杂任务。5. 超越SelSkill双粒度思想的延伸与应用双粒度偏好学习的价值不仅限于技能调用。它的核心思想——在层次化决策的不同级别上学习人类偏好——可以迁移到许多其他智能体相关的场景中。5.1 应用于对话管理在任务型对话系统中智能体的决策也可以分为两个粒度对话策略粒度决定下一步采取什么对话动作如“询问航班时间”、“确认目的地”、“提供报价”。自然语言生成粒度给定一个对话动作决定如何用自然语言表达如对于“确认目的地”可以说“您是要飞往北京对吗”也可以说“目的地是北京”。我们可以收集人类对这两个层次的偏好对于同一个对话状态哪种策略更优对于同一个策略哪种表达方式更自然、更友好用双粒度偏好学习来训练对话管理器能同时提升对话的效率和用户体验。5.2 应用于代码生成智能体一个代码生成智能体可能拥有这些“技能”分析需求、搜索文档、编写函数、运行测试、调试错误。双粒度决策体现在技能粒度现在是该搜索文档还是直接开始编写原子动作粒度在“编写函数”这个技能内是先写接口定义还是先写核心逻辑是先处理边界条件还是先实现主流程通过学习程序员在这些层次上的偏好例如有经验的程序员可能偏好先定义清晰的接口再搜索特定库的用法可以训练出更符合开发者工作流的编码助手。5.3 与工具学习Tool Learning的结合当前大模型使用外部工具Tools的模式本质上也属于技能调用。双粒度偏好学习可以显著优化这一过程。我们可以定义工具选择粒度给定任务应该使用哪个工具是Calculator还是Search工具参数化粒度给定工具应该如何设置输入参数给Search工具什么样的查询词现有的研究如ART, Toolformer主要关注如何让模型学会使用工具而双粒度偏好学习可以进一步教模型如何精打细算地、有选择地使用工具避免工具滥用这对于构建低成本、高效率的生产级AI应用至关重要。在我自己的项目实践中引入类似双粒度思考的优化后一个用于内部数据分析的智能体的平均工具调用次数下降了约35%而任务完成率保持不变。这直接转化为了更快的响应速度和更低的API开销。最关键的不是让智能体学会使用所有技能而是让它学会在恰当的时机以恰当的方式使用最必要的那个技能。这种“选择性”的智慧才是智能体真正走向实用和高效的分水岭。