云工作流DRL调度系统:从DAG生成到PPO训练全链路复现
简介本资源是一套高分毕业设计项目——基于Python深度强化学习的云工作流调度系统实现面向计算机、人工智能、软件工程等专业本科生及研究生解决云环境中DAG任务在异构资源上的动态调度优化问题。项目完整复现马尔可夫决策过程建模融合图神经网络表征与PPO算法训练并对比蒙特卡洛树搜索MCTS等基线方法涵盖DAG生成、环境封装、策略训练、推理测试全流程。压缩包含136个文件以21个核心Python脚本含DAG生成、Gym环境注册、PPO训练/测试、MCTS实现、17个训练好的.pth模型、33个.npy数据集及15张性能分析图表为主总大小11.22MB结构清晰、注释详尽开箱即用。已有122人学习下载提供全部部署文档、参数配置说明与多组DAG规模20–90节点实验支持适合毕设开发、课程设计或强化学习落地实践参考。1. 毕业设计真能跑通深度强化学习调度——一个95分云工作流DRL系统从DAG生成到PPO训练全链路可复现你是不是也见过太多“毕业设计基于XXX的YYY系统”标题党点开一看只有3个空文件夹、一份Word文档写着“本系统采用先进算法”连requirements.txt都缺pip install命令这次不一样。这份资源是某高校计算机专业学生实打实跑出来的高分毕设项目它用PythonPyTorch实现了一个端到端的云工作流调度器核心不是调API而是把DAG建模成马尔可夫决策过程用PPO训练策略网络在真实模拟环境中完成任务分配与资源抢占。它不讲虚的“智能调度”而是把状态空间拆成98维含Ready_task列表截断补-1、剩余CPU/Mem、未完成DAG最大路径长等把动作空间定义为“选哪个任务投到哪台机器”连蒙特卡洛树搜索MCTS都单独写了对比脚本。更关键的是——所有数据生成、环境注册、训练启动、baseline对齐步骤全部写死在代码里不是伪代码不是截图不是“请自行实现”。我拿它在本地M1 Mac无GPU上用CPU模式跑了2000步loss稳定下降reward曲线有明显爬升趋势换到Ubuntu服务器上启4个vCPU16GB内存3小时训完5000步测试时调度延迟比HEFT低17.3%。适合谁软件工程/人工智能方向本科生做毕设不翻车研一同学想快速理解DRL在系统调度中的落地边界企业工程师评估是否值得把这套状态建模思路迁移到自研调度平台。别被“深度强化学习”吓住——它本质是个结构清晰的Gym环境PPO训练管道连gym.register()怎么写、DAG_generator.py输出目录怎么和env.py对齐、.tfevents日志怎么用TensorBoard看都给你标好了。2. DAG生成与环境注册从随机图构造到Gym环境标准化封装2.1 DAG生成器原理与参数控制逻辑alpha/beta如何决定调度难度DAG有向无环图是工作流调度的基石。这份资源没用现成数据集而是手写DAGs_generator.py动态生成——这才是工程价值所在。它不靠固定拓扑而是用统计学控制图结构size [20,30,40,50,60,70,80,90]控制节点总数覆盖小规模调试到中等负载压力测试max_out [1,2,3,4,5]限制每个节点最多出边数避免单点爆炸式依赖alpha [0.5,1.0,1.5]决定层数公式length sqrt(size) / alphaalpha越小层数越多如size50, alpha0.5 → length≈14层意味着长链依赖多、关键路径敏感调度器必须预判远期资源占用beta [0.0,0.5,1.0,2.0]控制每层节点数波动以size/length为均值、beta为标准差采样正态分布beta0时各层均匀beta2.0时出现“厚首尾薄中间”结构模拟真实业务中冷启动与收尾阶段任务密集的场景。提示生成逻辑第2步强调“随机增删节点使总task数严格等于size”这是防伪关键——很多伪代码只说“采样”实际运行会因浮点误差导致DAG节点数漂移后续状态向量维度直接错乱。该脚本用math.ceil()取整后校验sum不满足则在随机层±1补足确保len(dag.nodes()) size恒成立。2.2 Gym环境注册全流程从Env/init.py到gym.make()可调用PyTorch DRL项目最常卡在环境注册这一步。这份资源把Env/目录设计成标准Gym v0.21.0兼容结构Env/__init__.py中执行from .cloud_env import CloudWorkflowEnv并gym.envs.registration.register()Env/cloud_env.py继承gym.Env重写reset(),step(),render()关键是gym.register()的参数必须与后续调用完全一致# Env/__init__.py from gym.envs.registration import register register( idCloudWorkflow-v0, entry_pointEnv.cloud_env:CloudWorkflowEnv, max_episode_steps1000, reward_threshold100.0, )调用时必须用CloudWorkflow-v0字符串不能写cloudworkflow或漏掉-v0。我第一次跑就因ID大小写错误报gym.error.UnregisteredEnv查了20分钟才发现__init__.py里写的是CloudWorkflowV0少横线。注意CloudWorkflowEnv.__init__()中硬编码了数据路径self.data_dir data/train/但DAGs_generator.py默认输出到./dags/。必须手动修改两处① 在DAGs_generator.py末尾添加os.makedirs(data/train, exist_okTrue)并将生成的.pkl文件shutil.move()过去② 或直接改cloud_env.py中self.data_dir ./dags/。否则reset()加载DAG时抛FileNotFoundError。2.3 状态空间98维详解为什么Ready_task要截断到10个补-1的物理意义是什么状态向量不是随便拼的。98维设计直指调度核心矛盾局部可见性 vs 全局优化。前3维当前时间、剩余CPU、剩余Mem是资源池快照第4~33维Ready_task时间要求×10、34~63维CPU要求×10、64~93维Mem要求×10——这里10是经验阈值实验发现超过10个就绪任务时PPO agent注意力严重分散reward方差增大300%补-1不是占位符而是语义标记当某维为-1表示该位置无任务agent应忽略此维度计算代码中state[4:34][state[4:34]-1] 0第94~96维超长Ready队列的sum_time/sum_cpu/sum_mem是“模糊聚合”解决截断带来的信息损失——即使看不到第11个任务也要知道后面还压着多少资源需求第97维未完成DAG最大路径长度和98维子节点数是图结构特征让agent感知任务依赖深度避免把长链任务塞进即将满载的机器。这个设计比单纯用NetworkX图嵌入更轻量且98维向量可直接喂给全连接网络省去GNN的复杂度。我在复现时验证过若把Ready_task长度从10改成5训练收敛速度降40%但改成15后显存溢出batch_size32时GPU OOM。3. PPO训练与MCTS对比从DRLagent.py启动到baseline_tableau.py结果可视化3.1 PPO训练脚本解析clip_epsilon、entropy_coef如何影响调度稳定性PPO/DRLagent.py是整个项目的引擎。它没用现成的stable-baselines3而是手写PPO核心循环——好处是每一行都能debug坏处是参数敏感。关键参数含义如下参数默认值作用调试建议clip_epsilon0.2PPO ratio clipping范围防止策略更新过大导致崩溃调度场景下建议0.1~0.15过高易震荡我试0.3时reward在±50间跳变entropy_coef0.01鼓励探索的熵项系数初始训练设0.02后期降到0.005否则agent总选“安全但次优”的机器n_steps2048每次收集的transition数小规模DAGsize20可降到1024加速迭代大DAGsize90必须≥2048否则梯度不准batch_size64mini-batch大小CPU训练时设32GPU训练可提至128但需同步调高n_epochs10训练启动命令极简cd PPO python DRLagent.py --env_id CloudWorkflow-v0 --total_timesteps 5000 --log_dir ./logs/--total_timesteps不是episode数而是环境交互步数1 step 调度1个任务。5000步在size50的DAG上约等于50个完整工作流调度周期。3.2 MCTS对比脚本MonteCarloTreeSearch.py如何复现经典算法MonteCarloTreeSearch.py不是调库而是从零实现MCTS四步循环Selection: 用UCT公式Q c * sqrt(ln(N_parent)/N)选择子节点c1.41√2Expansion: 对叶子节点扩展所有合法动作即所有就绪任务×所有可用机器组合Simulation: 随机 rollout 20步非完整DAG因耗时用简单启发式如最小完成时间估价Backpropagation: 将rollout reward反向传播更新路径上所有节点的Q/N值。关键细节它把DAG状态编码为(ready_tasks, remaining_resources, unfinished_dag_subgraph)三元组用hash(str(state))作节点key避免重复扩展。我在对比实验中发现MCTS在size≤40的DAG上比PPO快3倍因无需训练但size≥70时rollout耗时指数增长而PPO推理延迟恒定在8ms内。这印证了DRL的泛化优势——学一次策略适配任意DAG规模。3.3 baseline_tableau.pyHEFT、FCFS、Random三种基线算法实现要点baseline_tableau.py提供三个必对比基线HEFTHeterogeneous Earliest Finish Time经典静态调度需预知所有DAG节点执行时间。代码中用networkx.dag_longest_path_length()算关键路径再按rank_u avg_comp_cost(u) max(rank_v comm_cost(u,v))自底向上排序FCFSFirst Come First Serve按Ready_task列表顺序调度但注意——它不考虑机器负载直接选第一个有足够资源的机器Random纯随机选任务随机选机器作为性能下限。提示baseline_tableau.py输出CSV含5列algorithm, dag_size, makespan, resource_utilization, scheduling_overhead。其中scheduling_overhead是算法自身计算耗时用time.time()测不是调度后任务执行时间。很多初学者误把这列当延迟导致结论错误。4. 避坑指南95%新手会在前3小时踩中的5个致命问题4.1 现象运行DAGs_generator.py后报错ModuleNotFoundError: No module named networkx但已pip install networkx原因DAGs_generator.py使用了networkx2.6.3的特定API如nx.dag_longest_path_length()在2.8版本已弃用而你全局安装的是最新版。更隐蔽的是某些conda环境会同时存在多个networkx版本import networkx as nx成功但调用时方法不存在。解决强制指定版本并验证pip uninstall networkx -y pip install networkx2.6.3 python -c import networkx as nx; print(nx.__version__); print(hasattr(nx, dag_longest_path_length))输出应为2.6.3和True。4.2 现象PPO/DRLagent.py训练时loss为nanreward全为0原因状态向量中存在非法值。检查Env/cloud_env.py的_get_state()函数——当Ready_task不足10个时补-1逻辑若写成state[4:34] [-1]*30错误应是[-1]*10会导致30维全-1后续归一化时除零或remaining_cpu为负数资源超卖未校验。解决在_get_state()末尾加断言# Env/cloud_env.py line ~150 state np.array(state) assert not np.isnan(state).any(), fState contains NaN at {np.where(np.isnan(state))} assert np.all(state[1:3] 0), fNegative resources: CPU{state[1]}, Mem{state[2]}4.3 现象gym.make(CloudWorkflow-v0)报AttributeError: CloudWorkflowEnv object has no attribute action_space原因CloudWorkflowEnv.__init__()中忘记初始化self.action_space和self.observation_space。该资源原始代码有此bug__init__里只写了super().__init__()没设space。解决在Env/cloud_env.py的__init__末尾添加self.action_space spaces.Discrete(len(self.machines) * len(self.ready_tasks)) # 动作任务索引×机器索引展平为一维离散空间 self.observation_space spaces.Box( low-1.0, high1000.0, shape(98,), dtypenp.float32 ) # 98维状态-1为padding1000为资源上限4.4 现象TensorBoard打开logs/目录但无scalar图表只有graph和histograms原因DRLagent.py中SummaryWriter写入路径错误。原代码用log_dir./logs/但PPO训练时创建的是./logs/runs/...子目录而TensorBoard默认读./logs/下一级。解决启动TensorBoard时指定正确路径tensorboard --logdirPPO/logs/runs --bind_all或修改DRLagent.py中SummaryWriter(log_dirPPO/logs/runs)。4.5 现象MonteCarloTreeSearch.py运行极慢单次DAG调度耗时10分钟原因MCTS的rollout步数n_rollout20在大DAG上触发深度递归且未缓存子图状态。networkx的subgraph()操作在每次rollout时重建O(n²)复杂度。解决在MonteCarloTreeSearch.py的Node类中添加状态缓存class Node: def __init__(self, state): self.state state self._subgraph_cache None # 新增缓存属性 property def subgraph(self): if self._subgraph_cache is None: self._subgraph_cache self._build_subgraph() # 只构建一次 return self._subgraph_cache5. 训练日志分析与效果验证从events.out.tfevents到调度延迟热力图5.1 解析TensorFlow事件文件不用TensorBoard也能看训练曲线资源包里的events.out.tfevents.*文件是TensorBoard原生格式但你未必想开Web服务。用tensorflow自带工具直接提取# parse_events.py from tensorflow.python.summary.summary_iterator import summary_iterator def extract_scalars(log_path): scalars {step: [], reward: [], loss: []} for event in summary_iterator(log_path): for value in event.summary.value: if value.tag charts/reward: scalars[step].append(event.step) scalars[reward].append(value.simple_value) elif value.tag losses/total_loss: scalars[loss].append(value.simple_value) return scalars # 用法log_file PPO/logs/runs/.../events.out.tfevents.1648025256.bogon.20133.0 scalars extract_scalars(log_file)关键看三点①reward是否在2000步后稳定15说明学会基础调度②loss是否单调下降无突刺突刺意味着梯度爆炸需调小learning_rate③step间隔是否均匀若跳变说明n_steps设置不当导致batch不均。5.2 调度效果量化makespan、resource_utilization、scheduling_overhead三指标解读baseline_tableau.py输出的CSV需这样读algorithmdag_sizemakespanresource_utilizationscheduling_overheadPPO50124.30.870.012HEFT50138.90.790.008FCFS50152.10.650.001makespan调度跨度从第一个任务开始到最后一个结束的总时间越小越好。PPO比HEFT低10.5%证明DRL学到动态资源抢占resource_utilization资源利用率所有机器CPU/Mem平均占用率0.87表示87%时间在干活而非空转。FCFS仅0.65因盲目分配导致碎片化scheduling_overhead调度开销算法自身计算耗时单位秒。PPO的0.012s包含神经网络前向推理动作选择比HEFT的0.008s略高但换来10% makespan降低性价比合理。提示scheduling_overhead在PPO中是常数模型推理在MCTS中随DAG规模指数增长。所以表格里MCTS的overhead列要单独画log-scale图否则会被PPO/HEFT压扁。5.3 可视化调度过程用Matplotlib绘制任务-机器-时间热力图PPO/DRLtest.py输出test_results.pkl含每次调度的(task_id, machine_id, start_time, duration)。用以下代码生成热力图import matplotlib.pyplot as plt import numpy as np # 加载测试结果 with open(test_results.pkl, rb) as f: results pickle.load(f) # list of dict # 构建热力图矩阵行机器id列time slot值task_id max_time int(max(r[start_time] r[duration] for r in results)) n_machines len(set(r[machine_id] for r in results)) heatmap np.full((n_machines, max_time), np.nan) for r in results: machine_idx r[machine_id] for t in range(int(r[start_time]), int(r[start_time] r[duration])): if t max_time: heatmap[machine_idx, t] r[task_id] # 绘图 plt.figure(figsize(12, 6)) plt.imshow(heatmap, cmaptab20, aspectauto, interpolationnone) plt.colorbar(ticksnp.arange(0, max([r[task_id] for r in results])1, 5)) plt.xlabel(Time Slot) plt.ylabel(Machine ID) plt.title(Task Scheduling Heatmap (PPO)) plt.savefig(ppo_schedule_heatmap.png, dpi300, bbox_inchestight)图中每行是一台机器颜色深浅代表任务ID。理想模式是色块连续、无大片空白资源闲置或重叠冲突。我跑出来的图显示PPO在机器0上密集排布短任务机器3专跑长链DAG体现负载均衡能力。6. 进阶技巧如何把这套DRL调度框架迁移到真实Kubernetes集群6.1 状态空间改造从模拟资源到K8s API实时指标原98维状态基于模拟环境迁移到K8s需替换底层数据源剩余CPU/Mem不再用self.remaining_cpu改为调用kubernetes.client.CoreV1Api().list_node()解析node.status.allocatableReady_task列表原self.ready_tasks是内存对象现需监听kubernetes.client.BatchV1Api().list_namespaced_job()过滤status.conditions[0].typeReady的任务DAG结构特征max_path_length等仍可由networkx计算但DAG数据源从本地.pkl变为K8s CRDCustomResourceDefinition中存储的YAML。关键改造点在Env/cloud_env.py中新增K8sStateProvider类实现统一接口class K8sStateProvider: def get_remaining_resources(self) - Tuple[float, float]: # 调K8s API返回(CPU_core, Mem_GB) pass def get_ready_tasks(self) - List[Dict]: # 返回[{task_id, cpu_req, mem_req, duration_est}]列表 pass # Env/cloud_env.py 中替换 self.state_provider K8sStateProvider() if self.use_k8s else SimulatedStateProvider()6.2 动作空间映射从“选任务机器”到K8s Pod调度指令原动作空间是离散的(task_idx, machine_idx)K8s中需转换为kubectl apply -f pod.yamltask_idx→ 从get_ready_tasks()返回列表中取第i个任务的task_idmachine_idx→ 映射为K8s Node name通过list_node()获取items[].metadata.name最终生成Pod YAML关键字段spec: nodeName: node-003 # 机器映射 containers: - name: task-123 image: my-workflow:latest resources: requests: cpu: 500m # 从task.cpu_req来 memory: 1Gi # 从task.mem_req来step()函数中执行subprocess.run([kubectl, apply, -f, pod.yaml])并捕获kubectl get pod -o json判断是否调度成功。6.3 安全熔断机制防止DRL agent把集群搞崩线上环境不能让agent瞎试。在step()中加入三重熔断资源超限熔断若get_remaining_resources()返回CPU0.1 core或Mem100Mi则拒绝本次动作reward-100调度失败熔断kubectl apply返回非0码或Pod 30秒内未进入Running状态则回滚kubectl delete podreward-50异常频率熔断连续3次reward-20触发self.safety_mode True后续动作强制走HEFT策略直到reward连续10次0才退出安全模式。从那以后我每次把DRL项目从仿真推到生产都强制走一遍这三重熔断的单元测试——先mock K8s API返回各种异常响应验证熔断逻辑是否生效。没有这步线上集群可能因一个buggy episode就雪崩。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

AI全彩夜视+边缘计算+云平台:2026安防监控夜视方案全链路解析

AI全彩夜视+边缘计算+云平台:2026安防监控夜视方案全链路解析

1. 夜视方案到底难在哪:从“看得见”到“看得清”的鸿沟做安防监控这行十来年,我最大的感受就是:白天监控拼的是清晰度,晚上拼的是命。白天光线充足,传感器随便跑跑都能出好画面,可一到夜里,尤其…

2026/10/14 15:03:37 阅读更多 →
LinkedIn员工数据爬虫:从公司名单到线索表的实现思路

LinkedIn员工数据爬虫:从公司名单到线索表的实现思路

简介:LinkedIn员工信息采集爬虫项目,面向需要批量获取指定公司公开员工资料的研究人员、数据分析师与招聘从业者。项目以公司名称为检索入口,通过Python脚本完成搜索、页面解析、详情抓取与数据落盘,并提供应对反爬机制的实现思路…

2026/10/14 15:03:37 阅读更多 →
用 ai-agent-skills 搭建你自己的技能库:init-library 工作区模式完整教程

用 ai-agent-skills 搭建你自己的技能库:init-library 工作区模式完整教程

AI 技能开发工具人工智能 【免费下载链接】ai-agent-skills Universal skill installer and package manager for AI coding agents. One command, 12 runtimes. npx ai-agent-skills 项目地址: https://gitcode.com/gh_mirrors/ai/ai-agent-skills 点击查看 免费下…

2026/10/14 15:03:37 阅读更多 →

最新新闻

Sybase多行转一行实战:临时表+自连接实现行转列

Sybase多行转一行实战:临时表+自连接实现行转列

1. 项目概述:Sybase中多行转一行的实战需求与本质理解在某金融系统报表模块的日常维护中,我接手了一个典型的“宽表生成”需求:原始交易明细表里,同一笔订单号(order_id)可能对应多条商品记录,每…

2026/10/14 15:35:29 阅读更多 →
QDMA中断机制全解析:从硬件配置到驱动调试实战

QDMA中断机制全解析:从硬件配置到驱动调试实战

做FPGA加速卡的人,很少有人没跟QDMA中断打过交道。行列传输的带宽指标很容易刷得漂亮,但真正让整个系统稳定跑起来的,往往是中断这条“最后一公里”。QDMA(Queue Direct Memory Access)这类基于队列的DMA引擎&#xff…

2026/10/14 15:35:29 阅读更多 →
Python招聘数据爬虫到可视化全流程实战解析

Python招聘数据爬虫到可视化全流程实战解析

简介:基于Python实现的北京市大数据岗位招聘数据分析与可视化项目,面向计算机、通信、人工智能、自动化等专业学生及数据分析从业者,既可作为毕业设计与期末大作业的完整参考,也适合Python初学者借助真实场景掌握爬虫、数据处理和…

2026/10/14 15:35:29 阅读更多 →
Kubernetes Secret可选性真相:不是Secret设optional,而是Pod用Secret时设

Kubernetes Secret可选性真相:不是Secret设optional,而是Pod用Secret时设

1. Kubernetes Secret 的“可选性”本质:它根本不是字段,而是使用方式很多人第一次看到这个标题时会下意识去翻 Kubernetes 官方文档的Secret对象定义,试图在spec或data字段里找一个叫optional: true的开关。我当年也是这么干的——花了整整一…

2026/10/14 15:35:29 阅读更多 →
Java Web考勤系统开发实战:SSM+JSP+layui+MySQL详解

Java Web考勤系统开发实战:SSM+JSP+layui+MySQL详解

简介:这是一套基于SSMJSPlayuiMysql的学生课堂考勤管理系统完整源码包,面向JavaWeb初学者及毕业设计者,覆盖辅导员、管理员、教师、学生四种角色,包含辅导员的学生管理、请假审批、签到列表,管理员的班级/辅导员/教师管…

2026/10/14 15:35:29 阅读更多 →
2026跨境电商新规落地后,这5个隐藏坑千万别踩,有人已亏光全年利润

2026跨境电商新规落地后,这5个隐藏坑千万别踩,有人已亏光全年利润

新规实施后的第一个完整季度,不少卖家发现账面利润和预期出现了明显偏差。有人归因于流量成本,有人怀疑汇率波动,但真正的问题往往藏在合规细节里。以下五个容易被忽略的环节,正在悄悄侵蚀利润空间。 一、低申报的“惯性操作”已进…

2026/10/14 15:34:27 阅读更多 →

日新闻

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/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/14 7:53:34 阅读更多 →