阿里云 Multi-Agent 实践:大模型如何灵活编排智能体解决业务难题?

阿里云 Multi-Agent 实践经验分享:如何利用大模型灵活编排智能体,更高效地解决商家经营中的实际问题?重点介绍了Planning模块和GRPO训练。

原文标题:Multi-Agent 的灵活编排之路

原文作者:阿里云开发者

冷月清谈:

本文深入探讨了在多智能体(Multi-Agent)架构下,如何利用大模型灵活编排多个智能体以解决实际问题。文章以阿里云商家经营Copilot 3.0 架构中的规划(Planning)模块为例,结合 DeepSeek R1 的强化学习(GRPO)训练实践,详细阐述了如何平衡复杂问题和简单问题的处理效率,以及如何低成本地进行数据标注和模型迭代。解决方案包括数据集构造(冷启动数据、人工标注数据)和多阶段训练(SFT+GRPO),并设计了多维度的奖励体系,从格式完整性、思考过程和答案准确性等方面对模型进行评估和优化。实验结果表明,先进行SFT再进行GRPO训练,能有效提高模型的准确率,降低推理成本,最终使模型在多个reward上收敛。

怜星夜思:

1、文章中提到 Planning 模块需要平衡复杂问题和简单问题的处理效率,你们觉得在实际应用中,如何判断一个用户问题是复杂问题还是简单问题,有没有什么量化的指标或者方法?
2、文章中提到使用 Deepseek R1 套取合成数据,但没有详细说明如何套取。大家有什么好的 Prompt 工程实践经验,可以分享一下如何让模型生成高质量、符合特定格式(例如文章中的思考过程+规划结果)的数据?
3、文章中提到 GRPO 训练可以通过混合新旧数据来适应业务迭代,但如果新 Agent 的加入,导致历史数据的最优解发生了变化(例如,原本应该由策略 Agent 处理的问题,现在更适合由人群运营 Agent 处理),这种情况下,如何更有效地利用历史数据?

原文内容

本文从 Copilot 3.0 架构中的规划(Planning)模块出发,结合 DeepSeek R1 的强化学习(GRPO)训练实践,深入探讨在多智能体(Multi-Agent)架构下,大模型如何灵活编排多个智能体,以更好地解决实际问题。

GRPO Trainning Table


背景

1. 业务场景

商家经营Copilot作为一款专业的经营助手,主要服务于商家在日常经营中遇到的各类问题,其核心功能包括:

  • 基础业务支持:商家入驻、产品签约、运营工具使用等;

  • 运营服务:对账结算、数据分析、策略推荐等;

  • 智能优化:关键词配置、banner生成、商品图片优化等;

体验入口:支付宝APP搜索“支付宝商家助手”小程序。打开小程序可以直接体验经营助手Copilot。核心功能目前仅支持支付宝入驻商家。

从用户问题解决维度,Copilot需要具备以下核心能力:

1.全网搜索与自然语言解答

2.经营数据分析与可视化

3.平台策略智能匹配

4.图片素材生成与优化

5.精准用户群体圈选

2. 问题分析

在总结Copilot2.0框架的局限性时,我们发现以下核心问题:

  • 单一LLM架构难以平衡业务需求与通用能力;

  • 意图识别、query改写、任务规划等子模块能力受限;

  • 对复杂query的处理效能不足;

基于这些挑战,我们在CY25对Copilot架构进行了重大升级,推出了3.0版本。该版本采用Multi-Agent架构,通过planning模型实现智能Agent调度,显著提升了系统的问题解决能力。

3. Planning的角色

planning更像是去完成一道复杂的排列组合题,在充分理解用户问题的前提下(上下文),将用户问题分配给合适的一个或多个专家去解决问题,是同时包括改写、拆解、分配、生成执行顺序等多个环节的复杂任务。对于这样的复杂任务,我们首先会想到用CoT来提高准确率。CY24的Copilot2.0中的规划模块,我们首次尝试了短CoT模式,效果不错。在经过对比《没有思考过程》和《有思考过程》的planning准确率后,我们决定延用去年的CoT方式,并且在此基础上升级模型,显式地打印模型思考过程,让用户理解我们会有多个Agent共同服务他的问题。

举个例子,如果有三个 Agent(abc),理论上 planning 的分配方案至少有 15 种。再结合用户问题,给每个专家分配对应的需要解决的问题。


难点

1. 鱼和熊掌如何兼得

用过 deepseek r1 深度思考模型的小伙伴都懂,有时候模型一思考起来就 “刹不住车”。思考过程太长,输出直接卡住;简单问题也翻来覆去地验证,说来说去都是车轱辘话。深度思考本来是为复杂问题设计的,可这也导致模型养成了反复验证的习惯。我们现在面临的难题就是,既要保证复杂问题的准确率,又得让简单问题的思考过程 “速战速决”,节省推理成本,提升用户体验。

2. 思考过程如何标注

听说deepseek模型的很多数据是北大中文系的学生标注的,可我们的小二大多不是中文系专业,如何写出又符合业务又有逻辑性的思考过程?标一段思考过程耗时长,验收成本也高,真的有必要人工去写吗?带思考过程的数据标注,对于我们合成数据的要求更高。

3. 每次产品迭代,历史数据都要重新标吗

业务迭代频繁,今天可能是5个Agent,明天升级成8个Agent,历史标注的数据都不能用了吗?如何在业务变更的情况下,低成本保证模型的迭代时效也很重要。


效果对比

1. 从案例看

1.1. 多agent案例对比


Query

Copilot3.0

Copilot2.0

用户问题:如何配置搜索关键词


对比分析:

Copilot3.0的planning模块将用户问题分配全网搜知识问答和策略推荐专家,即使用户问的是操作类,也为用户推荐合适的策略,更方便一键操作。预判用户的预判。


执行计划:知识问答专家->策略推荐专家


Copilot2.0的意图直接判别为知识问答,用faq的形式回复用户,虽然没有错,但是不够智能。

1.2. 思考长度对比
Query
GRPO前
GRPO后
推荐
今日资讯

2. 从指标看

GRPO训练后,推理长度均值由240.29降至93.28(降幅61.2%),长度波动性明显改善(标准差从77.30降至26.11),分布更趋集中。

同时,准确率由78.7%提升至86.1%,绝对提升7.4个百分点,相对提升9.4%

同时验证了GRPO训练能在保障模型精度前提下,同时提升准确度和思考长度(即推理成本)。

(上面的结果是在标问3217条数据上跑批得到)


解决方案

1. 数据集构造

1.1. 输入输出定义

输入维度

  • 历史上下文窗口:采用动态滑动窗口(N轮对话)

  • 专家列表:Copilot中支持的Agent能力

  • 数据分析工具列表

  • 产品服务列表

  • ...

输出格式

  • 思考过程

  • 规划结果(补全问题+专家序列+专家处理的问题+执行顺序)

<think>
好的,我现在需要处理用户的问题:“查看经营周报”。首先,根据提供的工具列表,用户问题属于其中的一项。因此,这个问题应该由数据分析专家来处理,因为他们负责查询和分析工具列表中的数据。接下来,检查是否有其他相关的子问题常要分解,但用户的问题很明确,所以不需要进一步拆解。最后,确认是否需要其他专家介入,但这里只需数据分析专家即可。
</think>

<answer>
{
  “补全后的问题”: “查看经营周报”,
  “plan”: [{
    “专家”: “数据分析专家”,
    “处理问题”: [“查看经营周报”]
  }]
}
</answer>

1.2. 冷启动数据

使用Deepseek R1套取合成数据(思考过程+规划结果),筛选长度较短的样本,用于sft阶段的训练。该阶段主要让模型学会按照特定的格式输出。

1.3. 人工标注数据

人工标注合成数据(仅规划结果),用于GRPO训练。通过人工标注,确保模型在规划结果上的准确性和一致性,为后续的强化学习提供高质量的训练数据。

2. 多阶段训练(SFT+GRPO)

如果说sft是应试教育的话,grpo就是素质教育,给模型一个范围去探索,从更优的回答中找到下一步迭代的方向。sft的训练我不过多赘述,下面详细展开GRPO的训练过程。

2.1. 训练配置

基座

QwQ-32B

GPU配置

3机24卡A100

参数配置

比较重要的设置是lrbeta,即KL散度的梯度的权重。这两个参数设置的越大,模型收敛原则上更快,但训练往往会不稳定。在实际训练中,请根据是否出现不稳定的震荡情况适当调整这两个参数。

训练框架

ModelScope的ms-swift

2.2. 奖励函数设计

Reward系统主要从三个方向展开,涉及7个不同的reward function,可以根据每部分的重要性进行加权平均。

例如:

Reward = 0.1 * StrictFormatReward + 0.1 * JSONValidReward + 0.1*ThinkLengthReward + 0.1 * ThinkQualityReward + 0.2 * CorrectnessReward + 0.3 * ExpertValidationReward + 0.1 * ProcessingQualityReward

多维度奖励体系

图片

格式完整性评估

  • StrictFormatReward:正则匹配XML标签结构有效性;

class StrictFormatReward(BaseReward):
    _pattern = re.compile(r"^<think>\n.*?\n</think>\n\n<answer>\n.*?\n</answer>$", re.DOTALL)

    def call(self, completions, **kwargs) -> List[float]:
        processed = self.preprocess(completions)
        return [1.0if p.answer and self._pattern.match(c) else0.0
                for c, p in zip(completions, processed)]

  • JSONValidReward:校验JSON结构完整性和字段合规性;

思考过程评估

  • ThinkLengthReward:限制思考文本长度;

class ThinkLengthReward(BaseReward):
    def __call__(self, completions, **kwargs) -> List[float]:
        processed = self.preprocess(completions)
        rewards = []
        for p in processed:
            try:
                length = len(p.think)
                if min_length <= length <= max_length:
                    rewards.append(1.0)
                else:
                    # 使用S形曲线计算惩罚
                    deviation = abs(length - mid)/eps  # 
                    reward = 1.0 / (1.0 + np.exp(5*(deviation-0.5)))  # 平滑过渡
                    rewards.append(float(reward))
            except Exception as e:
                logger.error(f"Error calculating think length reward: {e}")
                rewards.append(0.0)
        return rewards
  • ThinkQualityReward:关键词过滤机制(如"微信"等敏感词检测);

答案准确性评估

  • CorrectnessReward:改写准确率,多维度评估(语义相似度/覆盖度);

  • ExpertValidationReward:专家分配准确率;

  • ProcessingQualityReward:规划准确率,多维度评估(语义相似度/覆盖度/多样性);

3. 多任务混合训练

GRPO可以很好的保证模型的泛化能力,对于分配Agent的任务,模型学习的是在给定的列表中选择更合适的Agent。如果要加新的Agent,那么可以在原有数据集基础上增加新增任务的数据。在sft模型的基础上进行grpo训练。我们把历史数据和迭代后的数据混合在一起进行训练,并不影响模型的效果。在推理时,使用最新的推理prompt就可以满足迭代的效果。

举个例子

因为业务变动原本分配给《策略Agent》的问题,需要剥离一部分分给《人群运营Agent》。

ToDo在prompt中的专家列表新增《人群运营Agent》,新增相关训练数据,与历史数据混合。

Tips这里不需要更改历史数据,因为历史的Prompt的专家列表没有《人群运营Agent》,《策略Agent》就是问题的当下最优选择。


实验现象

1. 有思考过程

1.1. 直接GRPO

现象:

所有reward func都是从一个较低的值开始震荡,reward最终在0.5-0.6之间收敛。

1.2. 先SFT再GRPO

现象:

1.模型格式遵循、答案质量一开始就是比较高的水平。

2.随着模型迭代,改写、专家选择、规划reward都在提高。

3.思考长度显著下降,并最终收敛在 150 左右。

4.reward 最终在 0.9 左右收敛。

2. 无思考过程

先SFT再GRPO

现象:

1.经过GRPO之后,无思考过程的模型能力也可以有一定的提升;

2.模型的平均输出变长,最后稳定在100token左右;

3.改写能力一直很弱,可能需要回溯prompt和数据质量。

云上经典架构serverless版


本方案采用云上的Serverless架构,原生支持弹性伸缩、按量付费和服务托管,减少企业手动资源管理和性能成本优化的工作,同时通过高可用的配置,避免可能遇到的单点故障风险。    


点击阅读原文查看详情。

楼上说的有道理,我补充一点,还可以**考虑用户本身的知识水平和历史行为。**对于某个用户来说是复杂问题,对于另一个用户来说可能就是简单问题。例如,一个新手商家和一个资深商家,对于“如何配置商品橱窗”这个问题的理解和需求肯定不一样。所以,需要建立用户画像,结合用户历史行为数据,动态调整问题复杂度的判断标准。可以搞个A/B测试,看看不同复杂度的划分方式,对用户满意度有没有影响。

这种情况下,直接混合新旧数据可能会引入噪声,降低模型的准确率。一个更有效的做法是对历史数据进行“数据增强”。具体来说,可以利用大模型或者人工,对部分历史数据进行重新标注,将原本应该分配给策略 Agent 的问题,重新分配给人群运营 Agent。这样,就可以让模型同时学习到新旧两种分配方式,并根据实际情况做出更合理的选择。当然,数据增强的比例需要 carefully 考虑,避免过度拟合新数据。

提供一个不一样的思路,可以考虑引入一个“路由”机制。简单来说,就是训练一个专门的“路由模型”,用于判断当前的问题应该由哪个 Agent 来处理。路由模型可以根据问题的特征、用户的画像、Agent 的能力等多个因素进行判断,并选择最合适的 Agent。 这种方式的优势在于,可以将 Agent 的选择逻辑从主模型中解耦出来,使其更加灵活和可维护。当新的 Agent 加入时,只需要更新路由模型即可,而无需重新训练主模型。当然,路由模型的训练也需要一定的数据和算力投入。

我之前用过“思维链(Chain of Thought)”的 Prompt 技巧,感觉效果还不错。简单来说,就是在 Prompt 中引导模型一步一步地思考,将复杂的问题分解为多个简单的步骤,并在每一步都给出清晰的解释。例如,“用户问题:如何提高店铺的点击率?首先,我们需要分析店铺的流量来源。目前主要的流量来源有哪些?……然后,针对不同的流量来源,我们可以采取哪些优化措施?……最后,将所有的优化措施整合起来,形成一份完整的方案……” 这种方式可以让模型更容易理解问题,并生成更具逻辑性和条理性的答案。当然,也需要注意控制思考过程的长度,避免模型“刹不住车”。

除了数据增强,还可以尝试使用“迁移学习”。先用大量的历史数据训练一个基础模型,然后,用少量的新数据对其进行微调,使其能够适应新的 Agent 和分配规则。 迁移学习的优势在于,可以充分利用历史数据中已经学习到的知识,加速模型的训练过程,并提高模型的泛化能力。当然,也需要注意选择合适的微调策略,避免过度修改基础模型的参数,导致性能下降。

分享一个玄学一点的经验:给模型起个“人设”。比如,你可以告诉模型“你是一位经验丰富的电商运营专家,擅长解决各种商家经营问题”,或者“你是一位性格幽默风趣的客服机器人,喜欢用简洁明了的语言回答用户的问题”。 给模型赋予一个鲜明的人设,可以让它更容易理解自己的角色和任务,从而生成更符合期望的答案。当然,这种方法的效果可能因模型而异,需要多尝试。

谢邀,人在实验室,刚下飞机(bushi)。结合我之前做客服机器人的经验,其实可以搞一个“求助难度分级”。简单来说,就是用户提问后,系统根据一些预设规则(例如关键词匹配、意图识别等)初步判断问题的难度等级。然后,客服(或者说Agent)在解决问题后,可以对问题的难度进行复核和调整。这样,就可以形成一个动态更新的难度分级体系,为后续的问题复杂度判断提供更准确的参考。当然,这个体系的维护需要一定的人力投入,但长期来看,可以有效提升系统的智能化水平。

Prompt工程的核心在于精准描述和约束输出。首先,Prompt需要清晰地定义目标数据格式,例如“请你扮演一位商家经营助手,根据用户提出的问题,生成一段思考过程,并给出最终的解决方案。思考过程需要包含对问题的理解、解决方案的步骤和原因。解决方案需要按照JSON格式输出,包含’补全后的问题’和’plan’两个字段……”;其次,可以通过Few-shot Learning,在Prompt中提供一些高质量的示例,让模型学习模仿;最后,可以设置一些约束条件,例如限制思考过程的长度、强制JSON格式校验等。此外,还可以尝试使用不同的模型参数(例如temperature、top_p等),找到最佳的生成效果。

我个人觉得判断问题复杂程度可以从几个维度入手:一是问题本身的长度和信息量,长问题一般包含的信息多,需要更深入的理解;二是问题涉及的领域和概念数量,跨领域或者需要调用多个专业知识的概念的问题,往往更复杂;三是解决问题所需的步骤和Agent数量,需要深度思考和多个Agent协同的问题自然更复杂。量化指标上,可以考虑问题文本的token数量、实体数量、关键词密度等。算法上,可以训练一个专门的问题复杂度分类器,结合人工规则进行判断。