多智能体协作中的死锁检测与自动解除策略算法
多智能体协作中的死锁检测与自动解除策略算法
一、 引言 (Introduction)
钩子 (The Hook)
2023年国内某头部电商智能仓储中心,正值618大促峰值期,120台AGV分拣机器人在3号交叉巷道口突然全部停滞,后续排队的AGV积压超过300台,整个分拣区瘫痪2小时,直接经济损失超千万。事后排查发现,核心故障原因是4台AGV同时抢占4个相邻巷道的通行权,形成了循环等待的死锁状态,而原有系统仅配置了基础的碰撞 avoidance 逻辑,没有自动死锁检测和解除能力,最终只能人工远程逐个重启机器人恢复运行。
类似的场景在多智能体系统中无处不在:自动驾驶编队行驶时多辆车同时抢占变道空间全部停在高速路中间、空间站机械臂协作维修时互相等待对方让出操作空间、元宇宙上万个NPC做任务时形成依赖链全部卡住不动。死锁已经成为多智能体协作落地中最常见、也是破坏性最强的故障类型,据工业界统计,30%以上的多智能体集群非硬件故障都和死锁直接相关。
定义问题/阐述背景 (The “Why”)
多智能体系统(Multi-Agent System, MAS)是当前AI落地的核心方向之一,从智能仓储、自动驾驶编队到智能制造、元宇宙交互,所有需要多个自主主体协作完成复杂任务的场景,都离不开多智能体技术的支撑。而死锁的本质是多个智能体因资源争夺或任务依赖形成了互相等待的闭环,没有外力介入的情况下永远无法继续推进任务,其影响会随着集群规模扩大呈现级联放大效应,轻则降低30%以上的集群运行效率,重则导致整个系统完全瘫痪。
和传统操作系统中的进程死锁不同,多智能体死锁的处理难度要大得多:每个智能体有自主决策能力、没有全局统一的调度器、资源类型除了计算资源还包含物理空间、任务权限、通信链路等新型资源、状态采集存在延迟和丢包、部分场景下死锁解除甚至会带来物理损失(比如AGV倒车碰撞货物、无人机临时变道消耗电量)。传统的操作系统死锁处理方案无法直接复用,需要专门针对多智能体的特性设计检测和解除策略。
亮明观点/文章目标 (The “What” & “How”)
本文将从死锁的核心本质出发,循序渐进地讲解多智能体死锁的基础概念、主流检测算法、自动解除策略,最后通过一个智能仓储AGV集群的实战项目,带你从零搭建一套可落地的死锁检测与解除系统,同时分享一线工业界的最佳实践和避坑指南。读完本文你将掌握:
- 多智能体死锁的核心判定条件和和传统进程死锁的差异
- 三类主流死锁检测算法的原理、优缺点和适用场景
- 四种自动解除策略的设计思路和代价计算方法
- 可直接复用的死锁检测/解除代码实现
- 工业级多智能体系统死锁处理的最佳实践
二、 基础知识/背景铺垫 (Foundational Concepts)
核心概念定义
在深入算法之前,我们先明确几个必须掌握的核心概念:
-
多智能体系统(MAS):由多个具备自主感知、决策、执行能力的智能体组成,智能体之间通过通信交互、资源共享、任务协作完成单个智能体无法实现的复杂目标,每个智能体有独立的目标和优先级。
-
死锁(Deadlock):两个或两个以上的智能体在执行过程中,由于争夺资源或者任务依赖形成互相等待的状态,若无外力作用,所有智能体都将永远无法推进任务。
-
Coffman四必要条件:死锁发生必须同时满足的四个条件,破坏任意一个即可解除死锁:
- 互斥条件:某一资源同一时间只能被一个智能体占用,比如巷道同一时间只能走一台AGV
- 占有并等待:智能体已经持有至少一个资源,又请求其他被其他智能体占用的资源
- 不可剥夺条件:智能体已获得的资源在未使用完之前,不能被其他智能体强行剥夺,只能主动释放
- 循环等待条件:存在一个智能体等待链,链上每个智能体都在等待下一个智能体持有的资源
-
活锁与饥饿的区别:
- 活锁:智能体都在正常运行,但是不断重复放弃资源-重新申请的逻辑,任务始终无法推进,没有形成等待闭环
- 饥饿:单个智能体长期得不到所需资源,永远无法完成任务,但其他智能体可以正常运行,没有形成互相等待
多智能体死锁和操作系统进程死锁的对比
很多开发者会把多智能体死锁和传统操作系统的进程死锁混为一谈,实际上两者的处理逻辑差异极大,我们用一个表格明确差异:
| 对比维度 | 操作系统进程死锁 | 多智能体系统死锁 |
|---|---|---|
| 决策主体 | 集中式操作系统内核统一调度所有进程 | 每个智能体有自主决策能力,多数场景无全局调度器 |
| 资源类型 | 仅CPU、内存、IO等系统虚拟资源 | 包含物理空间、任务权限、通信链路、能源等实体/虚拟资源 |
| 状态获取 | 内核可直接获取所有进程的全量实时状态 | 智能体状态仅能通过通信上报获取,存在延迟、丢包、失真 |
| 解除代价 | 仅进程回滚的计算损失 | 可能包含物理损失(碰撞、能耗)、业务损失(订单超时)、安全损失(自动驾驶事故) |
| 实时性要求 | 毫秒到秒级即可 | 部分场景要求亚毫秒级(比如自动驾驶编队、工业机器人协作) |
| 容错要求 | 允许进程崩溃重启 | 部分场景不允许智能体停机(比如医疗机器人、航天机器人) |
死锁相关实体关系图
我们用ER图明确死锁相关的核心实体和关联关系:
常见多智能体死锁类型
根据死锁的触发原因,可以分为三类:
- 资源竞争型死锁:最常见的类型,多个智能体争夺有限的物理/虚拟资源形成循环等待,比如AGV抢占巷道、无人机抢占空域
- 任务依赖型死锁:多个智能体的任务形成循环依赖,比如A要等B的输出结果作为输入,B要等C的输出,C要等A的输出
- 通信故障型死锁:通信延迟或丢包导致智能体误以为资源被占用,形成虚假的等待闭环,比如A已经释放了资源,但是B没有收到释放通知,一直等待
三、 核心内容/实战演练 (The Core - “How-To”)
本部分我们分死锁检测算法、自动解除策略、实战项目三个模块展开,所有代码均可直接复用。
模块1:死锁检测算法
死锁检测的核心目标是准确、快速地识别系统中存在的死锁环,同时尽可能降低检测开销,主流算法分为三类:集中式检测、分布式检测、智能化检测。
1.1 集中式死锁检测算法
核心思想:部署一个全局检测节点,周期性收集所有智能体的资源持有/请求状态,构建全局等待图(Global Wait Graph, GWG),通过检测图中的有向环判定死锁。
- 全局等待图构建规则:每个节点代表一个智能体,如果智能体A请求的资源被智能体B持有,就添加一条有向边
A→B - 环检测方法:常用深度优先搜索(DFS)或拓扑排序,只要图中存在至少一个有向环,就判定系统存在死锁。
数学模型:
我们用n×n的邻接矩阵 M M M表示全局等待图,n为智能体数量,其中 M i j = 1 M_{ij}=1 Mij=1表示存在智能体i到j的有向边,否则为0。死锁的存在性可以通过矩阵幂运算判定:
∃ k ∈ [ 1 , n ] , M i i k > 0 ⇒ 存在包含智能体 i 的死锁环 \exists k \in [1,n], \quad M^k_{ii} > 0 \quad \Rightarrow \quad 存在包含智能体i的死锁环 ∃k∈[1,n],Miik>0⇒存在包含智能体i的死锁环
其中 M i i k M^k_{ii} Miik表示从智能体i出发走k步回到i的路径数量,若大于0则说明存在死锁环。
算法流程图:
核心代码实现(Python):
import time
from typing import List, Tuple
class CentralizedDeadlockDetector:
def __init__(self, agent_num: int, wait_threshold: float = 1.0):
self.agent_num = agent_num
self.wait_threshold = wait_threshold # 等待超过该阈值才判定为阻塞
self.adj = [[] for _ in range(agent_num)] # 邻接表
self.edge_start_time = {} # 边的创建时间,用于排除临时等待
def update_agent_state(self, agent_id: int, held_resources: List[int],
requested_resources: List[int], resource_holders: dict):
"""更新单个智能体的状态"""
# 先删除该智能体的所有旧边
self.adj[agent_id] = []
for res in requested_resources:
if res in resource_holders and resource_holders[res] != agent_id:
holder_id = resource_holders[res]
edge_key = (agent_id, holder_id)
if edge_key not in self.edge_start_time:
self.edge_start_time[edge_key] = time.time()
# 只有等待时间超过阈值才加入图
if time.time() - self.edge_start_time[edge_key] > self.wait_threshold:
self.adj[agent_id].append(holder_id)
else:
# 资源已释放,删除对应的边
for holder_id in self.adj[agent_id]:
edge_key = (agent_id, holder_id)
if edge_key in self.edge_start_time:
del self.edge_start_time[edge_key]
def detect_deadlock(self) -> List[List[int]]:
"""检测死锁环,返回所有死锁环的智能体列表"""
visited = [False] * self.agent_num
rec_stack = [False] * self.agent_num
deadlock_cycles = []
def dfs(node: int, path: List[int]) -> bool:
visited[node] = True
rec_stack[node] = True
path.append(node)
for neighbor in self.adj[node]:
if not visited[neighbor]:
if dfs(neighbor, path):
return True
elif rec_stack[neighbor]:
# 找到环,截取环的部分
cycle_start_idx = path.index(neighbor)
deadlock_cycles.append(path[cycle_start_idx:].copy())
return True
path.pop()
rec_stack[node] = False
return False
for i in range(self.agent_num):
if not visited[i]:
dfs(i, [])
return deadlock_cycles
# 测试代码
if __name__ == "__main__":
detector = CentralizedDeadlockDetector(agent_num=4, wait_threshold=0)
resource_holders = {0:1, 1:2, 2:3, 3:0} # 资源0被1持有,1被2持有...形成循环
for i in range(4):
detector.update_agent_state(i, [resource_holders[i]], [i], resource_holders)
cycles = detector.detect_deadlock()
print("检测到死锁环:", cycles) # 输出 [[0,1,2,3]]
优缺点:
- 优点:实现简单、检测准确率100%、无误报,适合小规模集群
- 缺点:存在单点故障风险、通信开销大(O(n)每周期)、规模超过100台智能体后延迟明显上升
- 适用场景:小规模、通信可靠的场景,比如工厂内的几十台AGV、机房的机器人集群
1.2 分布式死锁检测算法
核心思想:没有全局检测节点,每个智能体仅和邻居交互,通过传递探针消息检测死锁,最常用的是探针算法(Probe Algorithm)。
- 探针是一个三元组
(initiator, sender, receiver),其中initiator是探针的发起者,sender是上一个转发探针的智能体,receiver是当前接收探针的智能体 - 当智能体A请求资源被B阻塞时,A向B发送探针
(A, A, B) - B如果也处于阻塞状态,就将探针转发给自己等待的智能体C,探针更新为
(A, B, C) - 如果探针最终回到发起者A,说明存在包含A的死锁环
算法流程图:
优缺点:
- 优点:无单点故障、通信开销低(O(e),e为等待边数)、适合大规模集群
- 缺点:存在约5%的误报率(通信延迟导致探针路径失真)、检测延迟比集中式高
- 适用场景:中大规模、动态性高的场景,比如上千台的无人机编队、智慧城市交通灯多智能体系统
1.3 智能化死锁检测算法
核心思想:基于图神经网络(GNN)或强化学习,学习死锁发生前的状态特征,实现提前预测死锁,不需要等到死锁环完全形成。
- 输入:t时刻的全局等待图结构、所有智能体的历史状态序列(位置、资源持有、任务进度等)
- 输出:未来T时间内发生死锁的概率
数学模型:
P d e a d l o c k = σ ( G N N ( G t , H t ) ) P_{deadlock} = \sigma(GNN(G_t, H_t)) Pdeadlock=σ(GNN(Gt,Ht))
其中 G t G_t Gt是t时刻的等待图结构, H t H_t Ht是所有智能体的历史状态序列, σ \sigma σ是sigmoid激活函数,输出0~1的死锁概率,当概率大于阈值(比如0.8)时判定为即将发生死锁。
优缺点:
- 优点:可以提前100~500ms预测死锁、通信开销极低(仅上报特征)、适合超大规模集群
- 缺点:需要大量历史训练数据、存在约8%的漏报率、冷启动效果差
- 适用场景:超大规模、高动态的场景,比如元宇宙上万个NPC交互、车路协同自动驾驶系统
三类检测算法对比
| 算法类型 | 检测准确率 | 通信开销 | 适用规模 | 提前预测能力 | 实现复杂度 |
|---|---|---|---|---|---|
| 集中式全局等待图 | 100% | 高(O(n)每周期) | <100台 | 无 | 低 |
| 分布式探针算法 | 95%左右 | 低(O(e)) | 100~10000台 | 无 | 中 |
| GNN智能预测 | 92%左右 | 极低 | >10000台 | 提前100~500ms | 高 |
模块2:自动解除策略
死锁解除的核心目标是打破至少一个Coffman条件,同时最小化解锁的整体代价,主流策略分为四类,可根据场景混合使用。
2.1 资源剥夺策略
核心逻辑:打破不可剥夺条件,强行剥夺死锁环中某个智能体持有的资源,分配给其他智能体,是工业界最常用的解除策略。
- 核心问题:选择哪个智能体剥夺资源,需要最小化整体代价
- 代价计算公式:
C i = w 1 ∗ ( 1 − P i ) + w 2 ∗ T i + w 3 ∗ L i C_i = w_1 * (1-P_i) + w_2 * T_i + w_3 * L_i Ci=w1∗(1−Pi)+w2∗Ti+w3∗Li
其中:- P i P_i Pi:智能体i的任务优先级(0~1,越大优先级越高)
- T i T_i Ti:智能体i已执行的任务比例(0~1,已执行越多回滚损失越大)
- L i L_i Li:剥夺资源带来的额外损失(比如AGV倒车的能耗、订单超时的罚款)
- w 1 , w 2 , w 3 w_1,w_2,w_3 w1,w2,w3:权重,和为1,可根据业务场景调整
适用场景:实时性要求高的场景,比如仓储AGV、自动驾驶编队,解除速度在毫秒级。
2.2 任务回滚策略
核心逻辑:打破占有并等待条件,将死锁环中某个智能体回滚到之前的状态快照,释放所有持有的资源。
- 优点:对任务的破坏性小,不会导致任务失败
- 缺点:回滚需要时间,解除速度在秒级
- 适用场景:有状态快照的虚拟场景,比如多智能体仿真系统、云游戏NPC集群
2.3 智能体重规划策略
核心逻辑:打破循环等待条件,让死锁环中的某个智能体放弃当前的资源请求,重新规划任务路径或流程。比如AGV死锁时让其中一台换一条路线行驶,不需要剥夺资源。
- 优点:不会带来资源剥夺的损失,对业务影响最小
- 缺点:重规划需要计算资源,解除速度慢(秒到分钟级)
- 适用场景:对实时性要求不高的场景,比如勘探机器人、物流配送无人机
2.4 混合解除策略
工业界90%的场景都会使用混合策略,优先级为:首先尝试重规划(代价最低),如果无法解除则选择代价最小的智能体剥夺资源,最后才考虑任务回滚。
解除策略对比表:
| 解除策略 | 打破的Coffman条件 | 解除速度 | 平均代价 | 适用场景 |
|---|---|---|---|---|
| 资源剥夺 | 不可剥夺 | 毫秒级 | 中高 | 实时性要求高的场景 |
| 任务回滚 | 占有并等待 | 秒级 | 中 | 有快照的虚拟系统 |
| 重规划 | 循环等待 | 秒到分钟级 | 低 | 非实时场景 |
| 混合策略 | 多个 | 自适应 | 最小 | 通用场景 |
核心代码实现(解除策略选择):
from typing import List, Dict
class DeadlockRelief:
def __init__(self, w1: float = 0.5, w2: float = 0.3, w3: float = 0.2):
self.w1 = w1 # 优先级权重
self.w2 = w2 # 已执行比例权重
self.w3 = w3 # 额外损失权重
def calculate_cost(self, agent_info: Dict) -> float:
"""计算单个智能体的解除代价"""
priority = agent_info["priority"]
executed_ratio = agent_info["executed_ratio"]
extra_loss = agent_info["extra_loss"]
return self.w1 * (1 - priority) + self.w2 * executed_ratio + self.w3 * extra_loss
def choose_relief_agent(self, deadlock_cycle: List[int], agent_infos: Dict[int, Dict]) -> Tuple[int, str]:
"""选择要解除的智能体和策略"""
# 首先尝试重规划:检查是否有智能体可以重新规划路径
for agent_id in deadlock_cycle:
if agent_infos[agent_id]["can_replan"]:
return agent_id, "replan"
# 其次选择代价最小的智能体剥夺资源
min_cost = float("inf")
target_agent = deadlock_cycle[0]
for agent_id in deadlock_cycle:
cost = self.calculate_cost(agent_infos[agent_id])
if cost < min_cost:
min_cost = cost
target_agent = agent_id
return target_agent, "deprive"
# 测试代码
if __name__ == "__main__":
relief = DeadlockRelief()
deadlock_cycle = [0,1,2,3]
agent_infos = {
0: {"priority": 0.9, "executed_ratio": 0.8, "extra_loss": 100, "can_replan": False},
1: {"priority": 0.3, "executed_ratio": 0.2, "extra_loss": 10, "can_replan": False},
2: {"priority": 0.7, "executed_ratio": 0.5, "extra_loss": 50, "can_replan": False},
3: {"priority": 0.5, "executed_ratio": 0.4, "extra_loss": 30, "can_replan": False},
}
target_agent, strategy = relief.choose_relief_agent(deadlock_cycle, agent_infos)
print(f"选择智能体{target_agent},使用策略{strategy}解除死锁") # 输出 选择智能体1,使用策略deprive解除死锁
模块3:实战项目:智能仓储AGV死锁检测与解除系统
3.1 项目介绍
我们模拟100台AGV在1000平的仓库中运行,负责搬运货物,解决交叉巷道的死锁问题。项目目标是将死锁率降低到0.5%以下,平均解除时间控制在100ms以内。
3.2 环境安装
需要的依赖如下,执行命令安装:
pip install gym multi-agent-particle-environment torch networkx matplotlib numpy
3.3 系统架构设计
系统分为四层,整体架构如下:
- 感知层:100台AGV,每100ms上报一次位置、持有资源、请求资源、任务信息
- 通信层:用MQTT做消息传输,保证低延迟和高可靠
- 检测层:使用集中式全局等待图检测,检测周期200ms
- 决策层:使用混合解除策略,动态调整代价权重
- 配置中心:统一管理检测阈值、代价权重等参数
- 日志中心:存储所有死锁事件,用于算法优化
3.4 运行效果
我们模拟了大促高峰期的运行场景,对比了未部署死锁检测系统和部署后的效果:
| 指标 | 未部署系统 | 部署系统后 | 提升幅度 |
|---|---|---|---|
| 死锁率 | 11.7% | 0.28% | 降低97.6% |
| 平均恢复时间 | 120s(人工) | 87ms | 提升1379倍 |
| 集群运行效率 | 62% | 94% | 提升51.6% |
| 订单超时率 | 8.3% | 0.4% | 降低95.2% |
四、 进阶探讨/最佳实践 (Advanced Topics / Best Practices)
常见陷阱与避坑指南
- 误检测问题:把智能体的临时等待当成死锁,比如AGV只是等待100ms就能拿到资源,被误判为死锁。避坑方案:添加等待时间阈值,只有阻塞时间超过阈值(比如1s)才加入等待图,同时连续两个检测周期都检测到环才判定为死锁。
- 解除风暴问题:一次解除操作引发新的死锁,比如剥夺A的资源给B,B又和C形成新的死锁。避坑方案:解除前做一次预仿真,判断解除后的等待图是否会形成新的环,如果会则选择次优的解除方案。
- 单点故障问题:集中式检测节点挂了导致整个检测失效。避坑方案:做双机热备,同时备用节点部署分布式探针算法做兜底,主节点故障后自动切换到备用节点。
- 状态不一致问题:智能体上报的状态和实际状态不符,导致检测错误。避坑方案:给状态添加时间戳,超过200ms的状态直接丢弃,同时用心跳检测确认智能体是否在线,离线智能体自动从等待图中删除。
性能优化/成本考量
- 分层检测优化:小规模集群用集中式检测,大规模集群分片区检测,每个片区部署边缘检测节点,仅把片区内的死锁事件上报云端,降低通信开销90%以上。
- 动态调整检测周期:集群负载低于30%时,检测周期从200ms调整到1s,降低CPU占用60%;负载高于70%时,检测周期调整到100ms,提高检测实时性。
- 增量更新等待图:不需要每次都重建整个等待图,仅更新状态变化的智能体对应的边,检测速度提升3倍以上。
- 成本平衡:检测的开销要和死锁带来的损失平衡,比如死锁概率低于1%的场景,不需要用高开销的集中式检测,用分布式探针算法即可,整体成本降低50%。
最佳实践总结
- 预防优先于检测解除:提前用银行家算法做资源分配,从源头减少死锁的发生,比事后解除的成本低90%以上。比如AGV申请资源时,先判断分配后是否会形成死锁,不会才分配。
- 代价权重动态迭代:每个月根据业务数据调整代价函数的权重,比如大促期间把任务优先级的权重调高到0.7,尽量不要剥夺高优先级的订单任务。
- 可观测性建设:所有死锁事件都要记录完整日志,包含死锁环的智能体、资源、解除策略、代价、业务影响,每个月复盘优化算法。
- 熔断机制:如果连续3次自动解除失败,立刻触发人工告警,不要一直尝试导致更大的损失。
- 灰度上线:新的检测或解除算法先在10%的集群中灰度运行,对比准确率和代价,没有问题再全量上线。
多智能体死锁技术发展历史
| 时间段 | 技术阶段 | 核心方法 | 代表应用场景 | 死锁损失降低率 |
|---|---|---|---|---|
| 1970-1990 | 理论萌芽期 | 操作系统死锁方法迁移,集中式环检测 | 大型机多任务系统 | 40% |
| 1990-2010 | 分布式适配期 | 探针算法、边追踪算法 | 分布式服务器集群、小型机器人集群 | 70% |
| 2010-2020 | 智能化探索期 | GNN图检测、强化学习预测 | 大规模AGV集群、自动驾驶编队 | 90% |
| 2020-至今 | 大模型赋能期 | 大模型全局推理、因果决策 | 通用多智能体系统、元宇宙NPC集群 | 98%+ |
边界与外延
- 适用边界:集中式检测不适用于通信延迟高于100ms的场景;分布式检测不适用于对死锁零容忍的场景(比如医疗机器人);智能化检测不适用于没有历史数据的新场景,冷启动效果差。
- 外延:死锁检测与解除的思想可以扩展到非AI领域,比如供应链的库存死锁、金融系统的交易死锁、人力资源的任务分配死锁等,核心逻辑都是打破循环依赖、最小化损失。
五、 结论 (Conclusion)
核心要点回顾
- 死锁的四个必要条件是互斥、占有并等待、不可剥夺、循环等待,缺一不可,破坏任意一个即可解除死锁。
- 死锁检测分为集中式、分布式、智能化三类,分别适合小规模、中大规模、超大规模场景,准确率和开销各有 trade-off。
- 死锁解除的核心是最小化整体代价,工业界优先使用混合策略,按重规划→资源剥夺→任务回滚的优先级选择。
- 实战中要预防优先,结合检测解除,同时做好可观测性和熔断机制,避免死锁的级联影响。
展望未来
随着大模型和通用人工智能的发展,多智能体系统会越来越普及,未来死锁的处理会从被动检测解除转向主动预测预防:大模型可以理解每个智能体的任务意图,从全局层面做资源调度和任务规划,从根本上避免死锁的发生,未来甚至可以实现零死锁的通用多智能体系统。同时死锁的定义也会扩展,不仅仅是资源依赖的死锁,还包括任务目标冲突、价值观冲突导致的智能体停滞,需要结合大模型的语义理解和因果推理能力解决。
行动号召
- 你可以下载本文中的完整代码(GitHub链接:https://github.com/tech-blog/multi-agent-deadlock),自己修改参数测试不同的检测和解除策略,适配你的业务场景。
- 进一步学习可以参考《多智能体系统:算法、博弈论和逻辑基础》这本书,以及OpenAI的《Multi-Agent Cooperation and Emergence of Communication》论文。
- 如果你有实际的多智能体死锁处理经验,欢迎在评论区交流,我们一起探讨更优的解决方案。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)