多智能体强化学习框架PyMARL:从架构到实战全解析
简介PyMARL是一个基于PyTorch实现的深度多智能体强化学习框架面向需要处理多智能体协作、竞争与博弈问题的学习者和研究者内置多种主流算法并以《星际争霸II》的SMAC作为标准实验场景。这份压缩包共包含52个文件以32个Python源码文件为核心覆盖智能体、环境交互与训练逻辑11个YAML文件负责实验参数配置4个Shell脚本和Dockerfile用于搭建运行环境另有说明文档与许可文件整体仅47KB结构紧凑。目前已有1762人学习适合作为算法复现与二次开发的起点。包内代码按components、utils、learners、controllers、runners、envs等模块划分分别对应环境封装、经验处理、网络更新、智能体控制等关键环节随包还提供《星际争霸II》安装脚本和SMAC版本注意说明能有效规避SC2版本差异造成的性能不可比问题帮助读者快速搭建可复现的训练流程。对想深入研读多智能体强化学习实现、比较不同算法效果的读者而言这份资料能显著节省环境配置和代码梳理的时间。1. PyMARL 是什么把多智能体问题从“各训各的”拆成可复现的模块把一套训练好的单智能体强化学习代码直接复制成 N 份去训练 N 个智能体几乎必翻车每个智能体拿到的奖励都来自全局它分不清自己的哪个动作让奖励变好策略更新时互相踩踏。多智能体强化学习要解决的正是这种信用分配与协作问题。PyMARLPython Multi-Agent Reinforcement Learning是一个基于 PyTorch 的 Python 多智能体强化学习框架它把 CTDE集中训练、分散执行范式落地为环境采样、经验回放、智能体网络、值融合、训练器五个独立模块内置 IQL、VDN、QMIX、COMA、QTRAN 等主流算法并配套标准的多智能体对战微操评估环境。适合三类人要复现论文算法的研究生、为自己的多智能体任务选基线的工程师、想弄清楚 VDN 和 QMIX 到底差在哪的算法同学。2. PyMARL 的核心架构runner、agent、learner 与 mixer 怎么分工先说结论PyMARL 不是一个大而全的调度平台而是一套按 CTDE 思想拆好的 Python 模块。多智能体问题不能直接套单智能体框架是因为多了两样单智能体没有的东西——智能体之间的信用分配以及训练时可见、推理时不可见的全局状态。PyMARL 的每个模块划分都是在给这两个问题找明确的责任人。2.1 先看目录结构跑实验与改算法分别动哪些文件PyMARL 的代码组织非常有代表性跑实验的人和改算法的人看的是完全不同的两层。先把目录结构放出来后面所有定位都基于它。pymarl/ ├── src/ │ ├── main.py # 入口读配置、组装组件、启动训练 │ ├── runners/ │ │ ├── episode_runner.py # 回合制环境主循环对战类场景用这个 │ │ └── parallel_runner.py # 并行环境主循环连续控制类场景用这个 │ ├── controllers/ │ │ └── basic_controller.py # 把 agent 网络输出的 Q 值选成动作 │ ├── modules/ │ │ ├── agents/rnn_agent.py # 内置 GRU 循环智能体网络 │ │ ├── mixers/qmix.py # QMIX 融合网络超网络生成非负权重 │ │ ├── mixers/vdn.py # VDN 融合网络纯求和 │ │ ├── mixers/qtran.py # QTRAN 融合网络 │ │ └── critics/coma.py # COMA 的中心 critic │ ├── learners/ │ │ ├── q_learner.py # QMIX/VDN/IQL 共用 │ │ ├── coma_learner.py # COMA 专用 │ │ └── qtran_learner.py # QTRAN 专用 │ ├── components/ │ │ ├── episode_buffer.py # 回合数据缓冲 │ │ └── replay_buffer.py # 经验回放池存整条 episode │ ├── config/ │ │ ├── algs/ # 每个算法一个 yaml │ │ └── envs/ # 每个环境一个 yaml │ └── envs/ # 环境实现与注册表一条完整的数据流是这样的runner 并行跑若干个环境实例每个实例采一条完整 episode数据先落在 episode_bufferepisode 结束后整条轨迹写入 replay_buffer训练时 learner 从 replay_buffer 抽一个 batch 的完整 episode让共享的 agent 网络算出每个智能体每个时刻的 Q 值交给 mixer 融合成联合 Q 值最后用 TD 目标算损失更新网络。我一般会这样给人指路只跑实验就改src/config下的两个 yaml 和命令行覆盖参数复现论文盯learners和modules/mixers想接自己的环境看envs和runners。新手最容易犯的错是一上来就啃 main.py结果被配置加载逻辑绕晕——main.py 只是接线员真正的逻辑都在模块里。| 配置项 | 所在文件 | 作用与调试建议 | |-------------------|-------------------|----------------------------------------------------| | batch_size_run | config/envs/*.yaml | 并行环境数量决定采样速度调显存先动它3m 建议 4~8 | | batch_size | config/algs/*.yaml | 训练 batch单位是条完整 episode调试收敛性才动它 | | t_max | config/algs/*.yaml | 总训练步数小地图从几十万步起步 | | evaluation_interval | config/algs/*.yaml | 隔多少训练步评估一次默认 10000 | | test_nepisode | config/envs/*.yaml | 每次评估跑几个回合统计胜率时别低于 16 |这张表值得贴在手边。后文所有“调参”最后都会落到这五个字段上而其中最容易混淆的就是batch_size_run和batch_size这一对前者管采样速度后者管梯度更新二者没有换算关系。2.2 CTDE 的落地细节共享的 agent 网络与只在训练期出现的全局状态CTDE 是当前多智能体 RL 最主流的范式PyMARL 对它的落地方式非常直接。分散执行体现在 agent 网络所有智能体共享同一个 RNNAgent 实例参数只有一份每个智能体靠拼接在局部观测里的 one-hot agent id 区分彼此每个智能体私有的 GRU 隐状态单独保存所以推理时它只需要自己的观测和历史记忆就能选动作。集中训练体现在 mixer训练时把全局状态 state 和各智能体的 Q 值一起送进融合网络计算联合 Q 值做 TD 更新推理时不碰全局状态。# 内置 RNNAgent 的简化示意src/modules/agents/rnn_agent.py 的思路 class RNNAgent(nn.Module): def __init__(self, input_shape, hidden_dim, n_actions): super().__init__() self.fc1 nn.Linear(input_shape, hidden_dim) # 观测编码层 self.rnn nn.GRUCell(hidden_dim, hidden_dim) # 跨步记忆记住过去轨迹 self.fc2 nn.Linear(hidden_dim, n_actions) # 输出各动作的 Q 值 def forward(self, obs, hidden_state): # obs 是当前智能体的局部观测框架已把 agent id one-hot 拼在后面 x F.relu(self.fc1(obs)) h self.rnn(x, hidden_state) # 每个智能体独立维护自己的 h q self.fc2(h) return q, h逻辑说明forward 返回两个东西——本步各动作的 Q 值和更新后的隐状态。隐状态由 runner 按智能体索引维护每步传入上一步的 h这样智能体在部分可观测环境里也能靠记忆区分“我刚刚做过什么”。这是它能作为分散执行核心的原因选动作只需要局部观测和私有记忆不需要全局信息。参数说明input_shape对应环境配置里的观测维度注意已包含 agent id 拼接hidden_dim是 GRU 隐藏维度默认 64调大能提升表达力但显存和训练时间同步上升n_actions是单个智能体的动作数这三者决定网络参数量级。值得单独拎出来的是batch_size_run和batch_size这对参数。batch_size_run写在环境配置里允许同时开多个环境实例并行采样调大加速数据生产但每个实例都要保存自己的观测序列和隐状态显存峰值会明显上涨。batch_size写在算法配置里决定每次梯度更新抽多少条完整 episode。调试显存先动前者调试收敛性才动后者——把两者搞反了你会得到“调了参数但不解决问题”的经典体验。3. 从零跑通 PyMARL最小安装与第一个 QMIX 实验3.1 第一步不是训练装环境、锁版本、放地图资源PyMARL 是研究框架不是开箱即用的产品安装顺序有讲究。踩过一次坑的人都知道直接装最新版依赖把它跑崩的情况太常见所以第一步永远是隔离。我一般会用虚拟环境单独给它一个家避免和机器上其他 PyTorch 项目互相污染。# 用虚拟环境隔离避免污染机器上的其他 PyTorch 项目 python -m venv pymarl_env source pymarl_env/bin/activate # 克隆框架源码仓库地址以代码托管平台检索 pymarl 为准 git clone pymarl 仓库地址 pymarl cd pymarl # 按仓库 requirements 安装依赖 pip install -r requirements.txt逻辑说明前三步是常规操作重点在最后一句——requirements 里锁了 torch、numpy 等核心库的版本范围这是这个框架能不能跑起来的关键。版本玄学集中在这两层一是 PyTorch 与 CUDA 驱动匹配二是 numpy 新版本会移除旧 API。如果机器没有可用 GPU直接装 CPU 版 PyTorch先把流程在 CPU 上打通比在显卡问题上耗一小时划算得多。框架装完后还有一个容易漏的环节对战类微操评估环境的地图资源是独立发布的不随框架代码分发。需要按环境库的说明下载地图包放到指定目录并设置环境变量指向地图根目录。地图缺失时框架启动会直接报错后面避坑章节会讲怎么认这条报错。注意地图资源的下载与放置路径一律以你下载的环境库版本 README 为准不要自己猜目录名。不同版本的环境库对地图目录的约定不完全一样猜目录名是新手最常见的无效操作。3.2 跑通最小命令QMIX 在 3m 上的标准起手式与日志解读框架和环境都就绪后用一个最小命令验证整条链路。3m 是对战评估环境里最小的三人地图用于快速验证采样、训练、评估全流程胜率通常几十万步内能上去。# 最小可复现命令QMIX 算法 标准评估环境 3m 地图 python src/main.py --configqmix --env-configsc2 with env_args.map_name3m逻辑说明这是 PyMARL 最标准的用法。--config决定加载src/config/algs/下哪个算法配置--env-config决定加载src/config/envs/下哪个环境配置with后面是配置覆盖的标准语法env_args.map_name3m用点号逐级下沉到环境参数里的嵌套字段这里把默认地图覆盖成 3m。没有 GPU 或想先验证安装没问题时覆盖use_cuda即可# CPU 跑通流程速度慢但能确认代码、环境、地图三件事都没问题 python src/main.py --configqmix --env-configsc2 with env_args.map_name3m use_cudaFalse参数说明use_cuda是布尔覆盖项sacred 配置体系里直接写use_cudaFalse即可。启动后终端会周期性打出评估胜率同时results/sacred/下会生成以运行编号命名的目录里面存配置快照、模型权重和 TensorBoard 事件文件。results/sacred/ └── 123456/ ├── config.json # 本次实验完整配置快照复现实验靠它 ├── tb/ # TensorBoard 事件文件 └── models/ # 每轮评估后保存的模型权重看曲线用 TensorBoard启动命令也很简单tensorboard --logdir results/sacred想看细节时我建议把评估频率调高一点这样能更快看到胜率曲线的形状确认算法在往对的方向走# 每 5000 步评估一次每次跑 16 个回合 python src/main.py --configqmix --env-configsc2 with env_args.map_name3m evaluation_interval5000 test_nepisode16参数说明evaluation_interval控制隔多少训练步评估一次默认 10000test_nepisode控制每次评估跑几局16 局胜率已经有参考意义但要写进报告的话建议 32。注意评估时用的是贪心动作epsilon0和训练时的探索行为不一样看到胜率曲线上下波动是正常的不用一波动就以为是 bug。4. 换算法与换场景PyMARL 的配置参数地图4.1 算法切换的本质learner、mixer、critic 的替换关系--config换个名字只是入口真正决定算法行为的是 yaml 里learner和mixer两个字段。先看 QMIX 的关键配置# src/config/algs/qmix.yaml关键字段 learner: q_learner # 训练逻辑算 TD loss 并更新网络 mixer: qmix # 融合逻辑决定联合 Q 如何从个体 Q 得到 mixing_embed_dim: 32 # 融合网络隐藏维度 hypernet_layers: 2 # 超网络层数 hypernet_embed: 64 # 超网络隐藏维度 double_q: true # 是否用 double DQN 目标 target_update_interval: 200 # 目标网络同步间隔步 lr: 0.0005 optim_alpha: 0.99 # Adam 参数 optim_eps: 0.00001 batch_size: 32 # 一个训练 batch 抽多少条完整 episode buffer_size: 5000 # 回放池容量条VDN 的配置则短得多# src/config/algs/vdn.yaml关键字段 learner: q_learner # 训练逻辑与 QMIX 相同 mixer: vdn # 融合逻辑换成纯求和两者的差异是理解多智能体值分解的关键。VDN 的 mixer 没有任何参数联合 Q 值就是所有智能体 Q 值的直接求和隐含假设是“团队价值等于个人价值之和”。QMIX 的 mixer 是一个超网络它用全局状态生成一组权重为了保证联合 Q 对每个智能体 Q 单调不减这组权重经过绝对值处理。单调性约束让 QMIX 在信用分配上比 VDN 表达能力强但也带来一个边界——如果任务的最优联合动作本身不满足单调关系QMIX 反而学不出理想结果这时候才轮到 QTRAN 那种用松弛约束逼近的方案上场。所以换算法不能只看效果要先理解你的任务里联合值函数长什么样。COMA 走的是完全不同的路线# src/config/algs/coma.yaml关键字段 learner: coma_learner # 换成 actor-critic 训练逻辑 mixer: None # 不用值融合 mixer critic: coma # 启用中心 counterfactual critic说明COMA 从 Q 学习换成策略梯度中心 critic 利用全局状态计算每个动作的反事实优势帮智能体判断“如果我当时选了别的动作会怎样”。代价是 critic 的输入维度随智能体数量线性膨胀智能体一多显存就吃紧。四类算法的选型差异可以压成一张表| 算法 | learner | mixer/critic | 联合值构造方式 | 典型局限 | |------|------------------|------------------|----------------------------|------------------------| | IQL | q_learner | 无 | 不融合各智能体独立 Q | 协作任务上限低 | | VDN | q_learner | vdn | 个体 Q 直接求和 | 无法表达非线性协作 | | QMIX | q_learner | qmix | 非负权重加权和 | 单调性假设限制 | | QTRAN| qtran_learner | qtran 专属网络 | 松弛约束逼近联合值 | 训练稳定性要求高 | | COMA | coma_learner | 中心 critic | 反事实优势 | 智能体多时规模扩展差 |理解了这层关系再回头看--config从 qmix 切到 vdn你换掉的只是 mixer 这一层从 qmix 切到 coma则是把 learner 整个换掉因为 Q 学习和策略梯度的训练循环根本不是一回事。配置切换实验时每次只允许一个“层”变化否则对比结论没有说服力。4.2 换场景从粒子环境到自定义任务的三步接入法评估环境只有那几张地图做真实任务迟早要接自己的环境。最快的路径是先用粒子环境演一遍接口流程再替换成自己的任务。粒子环境里每个智能体要协作覆盖多个目标点是天然的“分散协作”测试床数据吞吐也比对战环境快适合验证算法在多智能体协作上的基本行为。# 粒子环境验证多智能体协作基础行为 python src/main.py --configqmix --env-configparticle with env_args.scenariosimple_spread逻辑说明env_args.scenario切换粒子环境的子任务观测维度和奖励结构都由环境内部决定框架只负责采样和训练。跑通这条命令后可以确认你的 PyMARL 安装不依赖对战地图资源也能把“换场景”这件事从环境代码里剥离出来单独调试。接入自定义任务有三个必须对齐的地方。第一环境类要实现框架约定的接口step 返回观测、全局状态、奖励、done、info 五元组reset 返回初始观测第二在src/config/envs/下新建 yaml声明智能体数量、观测维度、动作维度、回合长度上限第三在 envs 包的注册表里把环境类登记进去runner 才能按名字找到它。一个最小自定义环境配置长这样# src/config/envs/my_task.yaml env: my_env # 与注册表中的环境名一致 env_args: scenario: my_scenario n_agents: 4 obs_dim: 12 action_dim: 5 episode_limit: 200 # 一个 episode 最多多少步参数说明n_agents决定共享 agent 网络的实例规模也决定 mixer 的合并维度obs_dim要和环境返回的观测维度完全一致差一个数字都会在 Linear 层报 shape 错误episode_limit控制轨迹长度同时影响 replay buffer 里每条 episode 的存储占用。观测拼接里有个细节框架默认会把 agent id 的 one-hot 拼到每个智能体观测后面自定义环境时不要自己在观测里重复加 id否则维度会 double而且框架拼接的维度与n_agents绑定重复加会直接破坏对齐关系。从配置层接入自定义任务是最小改动的路径跑通后再回头改 runner 里针对具体环境的 state 构造逻辑。一个值得提前想清楚的点全局状态里不该让智能体在推理时看见的信息要在这里就隔离干净——这是“集中训练”能成立的前提也是很多论文里环境信息泄露 bug 的源头。5. PyMARL 训练与评估的常见问题与避坑记录这一章把 PyMARL 路上最常见的坑按“现象、原因、解决”三步写清楚。前两条是环境层面中间两条是训练层面最后一条是评估层面按遇到的顺序排查即可。5.1 装上了但起不来版本与地图的经典报错现象启动训练后立刻抛 AttributeError常见的有 numpy 的 bool 属性不存在、torch 的 Tensor 方法签名对不上。原因框架源码写作时间较早requirements 里锁的依赖如果被 pip 自动升级新旧 API 不兼容。解决严格按 requirements.txt 安装不要手动升级 numpy 或 torch实在要用新版本就把报错行里的旧 API 逐个替换成新写法比如np.bool换成np.bool_改完先跑通最小命令再继续。现象另一个高频报错是启动时提示找不到地图或找不到环境数据。原因对战评估环境的地图资源需要单独下载框架代码本身不携带地图文件地图版本与环境库版本不匹配也会触发同类问题。解决按你安装的环境库版本的官方说明下载地图放到指定目录并设置环境变量下载后先跑一个极小地图确认路径生效不要第一次就直接跑大图否则报错时你会分不清是路径问题还是地图文件本身的问题。5.2 训练不收敛与训练中途崩掉排查顺序现象胜率曲线在低水平震荡或者先升后大幅回撤。原因多智能体训练是个黑匣子最常见的嫌疑有三个——学习率太大导致梯度震荡、回放池太小导致样本分布被近期数据主导、探索退火过快导致智能体过早放弃探索。解决按顺序只改一个变量并保留日志。先把lr从 5e-4 降到 1e-4没起色再把buffer_size从 5000 提到 10000最后把epsilon_anneal_time从 50000 提到 100000。每次改动跑同样的步数再对比不要同时改两个参数否则你永远不知道是哪一个把问题修好的。现象训练中途显存溢出OOM报错往往出现在采样或回放阶段。原因并行环境数量乘上每个环境保留的轨迹长度实际占用比想象中大评估阶段还会额外加载目标网络和更长的批次数据。解决先把batch_size_run从 8 降到 4观察变化还不行就关掉 CUDA 用小地图在 CPU 上跑通验证。确认是显存问题前不要动batch_size——训练 batch 影响的是梯度计算的显存峰值而 OOM 通常先发生在环境采样这一侧。5.3 评估数字不可信胜率方差与随机种子现象同一套参数两次运行胜率差十几个点甚至算法 A 在某次运行中“赢过”了算法 B换一次又反过来了。原因一方面评估用的是贪心动作训练早期策略不稳定单次评估方差大另一方面强化学习本身对随机种子敏感单种子比较就是抛硬币。解决test_nepisode至少设到 32每种配置至少跑 3 个随机种子画中位数曲线并带分位区间。低于两个种子的对比结论不要写进报告这是多智能体 RL 对比的底线也是复现论文时最常被质疑的点。注意保存模型时把对应的config.json快照一起归档。PyMARL 的每次运行配置都在这个文件里等你三个月后回来看曲线唯一能救你的就是这张快照不然你根本想不起当时用了哪个epsilon_anneal_time。6. 把 PyMARL 用出自己的套路魔改 QMIX 融合网络与对照验证6.1 一个最小改动给 QMIX 融合层加状态注意力当你不再满足于跑通配置想验证自己的想法时PyMARL 最值得动的就是modules/mixers/qmix.py。下面是一个最小改动思路在保持 QMIX 非负单调权重的前提下额外用全局状态对每个智能体生成一个注意力系数让融合更关注当前局面里更关键的智能体。这只是示意代码作用是告诉你改动发生的位置和验证方式。# 魔改示意QMIX 融合层加状态注意力非仓库原版实现 class AttnQMixer(nn.Module): def __init__(self, args): super().__init__() self.n_agents args.n_agents # 注意力打分网络全局状态 - 每个智能体一个分数 self.attn nn.Linear(args.state_shape, self.n_agents) # 保留非负权重生成这是 QMIX 单调性的来源 self.w nn.Linear(args.state_shape, self.n_agents) def forward(self, agent_qs, states): # 简化形状表示为 (batch, episode_len, n_agents) # 实际仓库里传入的是展平后的 (batch*episode_len, n_agents) attn_w F.softmax(self.attn(states), dim-1) # 非负且和为 1 w torch.abs(self.w(states)) # 保持单调约束 q_tot (agent_qs * attn_w * w).sum(dim-1, keepdimTrue) return q_tot逻辑说明agent_qs是每个智能体对各自动作的 Q 值states是全局状态。softmax 保证注意力权重非负abs保证单调权重非负两者相乘后联合 Q 对任意智能体的 Q 值仍然单调不减——这就是 QMIX 的单调性约束没有被破坏的原因。参数说明args.state_shape来自环境配置attn和w的输出维度都是n_agents。改动只有十几行但真正的成本在验证。6.2 验证改动的底线做法多种子对照与中位数曲线# 原版与魔改版各跑三个种子分别记录曲线后画在一起对比 for s in 1 2 3; do python src/main.py --configqmix --env-configsc2 with env_args.map_name3m seed$s # 魔改版需要先把新模块注册到 mixers 注册表再写一个 attn_qmix.yaml done说明有些仓库版本把seed直接作为命令行参数而不是配置覆盖项遇到就用--seed $s的写法原理一样。对照实验的铁律是只改一个变量原版和魔改版使用同一张地图、同一个评估间隔、同一个test_nepisode最后把六条胜率曲线画在一起看中位数而不是最好的一次。我在这个环节吃过亏——某个改动在单次运行里赢了 8 个点补跑三个种子后优势只剩 2 个点而且只在一个地图上成立。这提醒我养成一个习惯任何魔改先在 3m 这种小地图上跑通验证再上大图跑通后把原版模型和魔改模型的权重各留一份方便之后做质性的行为对比——因为胜率数字会骗人回放里的行为差异不会。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

开放式代码审查:打破传统评审死穴,提升团队代码质量

开放式代码审查:打破传统评审死穴,提升团队代码质量

做代码审查这件事做了不少年,我最大的感受是:很多团队根本没有在做真正的审查。open-code-review这个词听起来像是个工具名,但在我这里更多代表的是一套工作方式——把评审从少数几个人的私聊,变成整个团队都能参与、都能评论、都…

2026/10/12 22:24:02 阅读更多 →
Codex CLI 从入门到放弃:AI 编程代理的实战避坑指南

Codex CLI 从入门到放弃:AI 编程代理的实战避坑指南

1. 从"这玩意儿到底能干嘛"说起:Codex CLI 的真实定位第一次接触 Codex CLI 的人,十有八九是被"AI 编程助手"这个词吸引过来的。但真正上手之后,很多人的第一反应是——"就这?"然后开始怀疑是不是自…

2026/10/12 22:23:57 阅读更多 →
短关键词‘rea‘的检索陷阱与命名治理:从命令行到响应式框架

短关键词‘rea‘的检索陷阱与命名治理:从命令行到响应式框架

1. 从一个字母说起:为什么“rea”值得单独拎出来聊第一次看到“rea”这个标题,我脑子里蹦出来的第一个念头是——这大概率不是某个完整单词,而是一个被截断的缩写、一个前缀,或者某个工具链里约定俗成的短标识。做技术的人对短字符…

2026/10/12 22:23:52 阅读更多 →

最新新闻

node.bcrypt.js 版本演进全解析:从 CHANGELOG 看 bcrypt 密码哈希库的关键修复与架构变迁

node.bcrypt.js 版本演进全解析:从 CHANGELOG 看 bcrypt 密码哈希库的关键修复与架构变迁

密码学 【免费下载链接】node.bcrypt.js bcrypt for NodeJs 项目地址: https://gitcode.com/gh_mirrors/no/node.bcrypt.js 点击查看 免费下载 node.bcrypt.js(npm 包名 bcrypt)是 Node.js 生态中最常用的 bcrypt 密码哈希实现,本…

2026/10/14 2:07:19 阅读更多 →
eve 多租户内存实战:以认证作用域元组实现租户级记忆隔离

eve 多租户内存实战:以认证作用域元组实现租户级记忆隔离

人工智能AI AgentAgent 框架后端工具调用 【免费下载链接】eve The Open Framework for Building Agents 项目地址: https://gitcode.com/gh_mirrors/eve28/eve 点击查看 免费下载 多租户内存(Multi-tenant Memory)是 eve 中把"谁可以读…

2026/10/14 2:07:19 阅读更多 →
Binaryen 贡献指南深度解读:AI 协作规范与新增指令全流程清单

Binaryen 贡献指南深度解读:AI 协作规范与新增指令全流程清单

编译器编程语言 【免费下载链接】binaryen Optimizer and compiler/toolchain library for WebAssembly 项目地址: https://gitcode.com/gh_mirrors/bi/binaryen 点击查看 免费下载 引言 Binaryen 是 WebAssembly 生态中一款核心的编译工具链库与优化器&#xff0…

2026/10/14 2:07:19 阅读更多 →
高位数阶乘计算:C语言数组模拟、Python内置与MATLAB符号运算对比

高位数阶乘计算:C语言数组模拟、Python内置与MATLAB符号运算对比

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 2:07:19 阅读更多 →
从零手写大语言模型:Happy-LLM 源码级教程核心拆解

从零手写大语言模型:Happy-LLM 源码级教程核心拆解

简介:《Happy-LLM:从零开始的大语言模型原理与实践教程》由Datawhale社区发起,是一份系统学习大语言模型的PDF资料,适合已掌握Python基础、希望深入理解Transformer与预训练机制,并渴望亲手完成大模型项目的学习者。教…

2026/10/14 2:07:19 阅读更多 →
Python pywebcopy整站镜像:实现网页离线保存的完整方案

Python pywebcopy整站镜像:实现网页离线保存的完整方案

简介:pywebcopy 是一款用 Python 编写的网页镜像与归档工具,面向需要离线保存网页、网站资源或研究爬虫实现的开发者。它尊重 robots.txt,一次调用即可把 CSS、JS、图片等资产连同页面完整下载,并能重新映射链接、克隆整站&#x…

2026/10/14 2:06:18 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →