Petals分布式大语言模型:BitTorrent风格的低成本LLM本地运行方案
PetalsBitTorrent 风格的分布式大语言模型本地运行方案在人工智能快速发展的今天大语言模型LLMs已经成为技术领域的热点。然而运行这些模型通常需要昂贵的GPU资源和专业的基础设施这对个人开发者和小型团队构成了不小的门槛。Petals项目应运而生它借鉴了BitTorrent的分布式思想让用户能够在家用计算机上协作运行大型语言模型。本文将详细介绍Petals的工作原理、环境搭建方法、核心配置要点以及实际应用案例。无论你是AI爱好者、学生还是专业开发者都能通过本文掌握在普通硬件上运行大语言模型的实用技能。1. Petals 核心概念与技术原理1.1 什么是 PetalsPetals是一个开源分布式系统允许用户将大型语言模型如BLOOM、GPT等分割成多个块并在不同的计算机上分布式运行。它的核心思想类似于BitTorrent的文件共享协议但应用于模型推理和训练领域。与传统集中式模型服务不同Petals采用去中心化架构。每个参与者只需运行模型的一小部分通过协作完成整个模型的推理过程。这种方式显著降低了个体用户的硬件要求使更多人能够接触和使用先进的大语言模型技术。1.2 Petals 与 BitTorrent 的相似性Petals借鉴了BitTorrent的多个核心概念分布式存储如同BitTorrent将文件分割成多个块分布在不同的节点上Petals将大模型参数分布在不同参与者的设备中P2P通信节点之间直接通信无需中心服务器协调整个推理过程资源共享每个参与者既消费模型服务又为网络贡献计算资源容错机制单个节点故障不会导致整个系统瘫痪其他节点可以接管其工作负载1.3 Petals 的技术架构Petals系统由以下几个核心组件构成客户端Client向网络提交推理请求的终端用户服务器节点Server Nodes托管模型块并提供计算资源的参与者路由层Routing Layer管理节点发现、负载均衡和请求路由模型块管理器Model Block Manager负责模型分割、分布和一致性维护2. 环境准备与安装配置2.1 硬件与软件要求在开始使用Petals之前需要确保系统满足以下基本要求硬件要求CPU支持AVX指令集的现代处理器Intel Haswell或AMD Excavator及以上内存至少8GB RAM建议16GB以上存储10GB可用磁盘空间用于模型缓存网络稳定的互联网连接上传带宽至少5Mbps软件要求操作系统LinuxUbuntu 18.04、Windows 10或macOS 10.15Python3.8或更高版本CUDA可选如使用NVIDIA GPU需要CUDA 11.02.2 安装 Petals 客户端通过pip安装Petals是最简单的方式# 安装基础版本仅CPU支持 pip install petals # 如使用GPU加速安装GPU版本 pip install petals[gpu] # 安装开发版本包含最新功能 pip install githttps://github.com/bigscience-workshop/petals2.3 验证安装安装完成后可以通过简单的Python脚本来验证安装是否成功# 验证安装脚本check_installation.py import petals import torch print(fPetals版本: {petals.__version__}) print(fPyTorch版本: {torch.__version__}) print(fCUDA可用: {torch.cuda.is_available()}) if torch.cuda.is_available(): print(fGPU设备: {torch.cuda.get_device_name(0)}) print(fGPU内存: {torch.cuda.get_device_properties(0).total_memory / 1024**3:.1f} GB) # 测试基本功能 try: from petals import DistributedBloomForCausalLM print(Petals核心模块导入成功) except ImportError as e: print(f导入错误: {e})3. 核心配置与模型加载3.1 选择适合的模型Petals支持多种主流大语言模型选择时需考虑模型大小和硬件能力# 可用模型列表示例 MODEL_CONFIGS { bloom-560m: { name: bigscience/bloom-560m, size_gb: 1.1, min_ram_gb: 4, recommended_ram_gb: 8 }, bloom-1b7: { name: bigscience/bloom-1b7, size_gb: 3.4, min_ram_gb: 8, recommended_ram_gb: 16 }, bloom-7b1: { name: bigscience/bloom-7b1, size_gb: 14.2, min_ram_gb: 16, recommended_ram_gb: 32 } } def select_model(hardware_capabilities): 根据硬件能力选择合适模型 available_models [] for model_id, config in MODEL_CONFIGS.items(): if hardware_capabilities[ram_gb] config[min_ram_gb]: available_models.append((model_id, config)) # 按推荐度排序 available_models.sort(keylambda x: x[1][recommended_ram_gb]) return available_models[0] if available_models else None3.2 基础模型加载配置正确配置模型加载参数对性能至关重要from petals import DistributedBloomForCausalLM from transformers import BloomTokenizerFast class PetalsModelLoader: def __init__(self, model_namebigscience/bloom-7b1): self.model_name model_name self.tokenizer None self.model None def load_model(self, **kwargs): 加载分布式模型 # 默认配置参数 default_config { torch_dtype: torch.float32, max_retries: 3, timeout: 60, prefetch: True # 预加载下一个块以提高性能 } # 合并用户配置 config {**default_config, **kwargs} try: # 加载tokenizer self.tokenizer BloomTokenizerFast.from_pretrained(self.model_name) # 加载分布式模型 self.model DistributedBloomForCausalLM.from_pretrained( self.model_name, **config ) print(f模型 {self.model_name} 加载成功) return True except Exception as e: print(f模型加载失败: {e}) return False def get_model_info(self): 获取模型信息 if not self.model: return 模型未加载 info { model_name: self.model_name, device: str(self.model.device), dtype: str(self.model.dtype), num_parameters: sum(p.numel() for p in self.model.parameters()) } return info4. 完整实战案例构建分布式聊天机器人4.1 项目结构设计首先创建清晰的项目目录结构petals-chatbot/ ├── config/ │ ├── model_config.yaml │ └── network_config.yaml ├── src/ │ ├── __init__.py │ ├── model_manager.py │ ├── chat_engine.py │ └── utils.py ├── tests/ │ └── test_chat.py ├── requirements.txt └── main.py4.2 核心模型管理类实现# src/model_manager.py import torch import yaml from pathlib import Path from petals import DistributedBloomForCausalLM from transformers import BloomTokenizerFast class PetalsModelManager: def __init__(self, config_pathconfig/model_config.yaml): self.config self._load_config(config_path) self.model None self.tokenizer None self.is_initialized False def _load_config(self, config_path): 加载配置文件 with open(config_path, r, encodingutf-8) as f: return yaml.safe_load(f) def initialize_model(self): 初始化模型和tokenizer try: model_name self.config[model][name] # 加载tokenizer self.tokenizer BloomTokenizerFast.from_pretrained(model_name) # 配置模型参数 model_kwargs { torch_dtype: getattr(torch, self.config[model].get(dtype, float32)), max_retries: self.config[network].get(max_retries, 3), timeout: self.config[network].get(timeout, 60), prefetch: self.config[model].get(prefetch, True) } # 加载分布式模型 self.model DistributedBloomForCausalLM.from_pretrained( model_name, **model_kwargs ) self.is_initialized True print(模型初始化成功) return True except Exception as e: print(f模型初始化失败: {e}) return False def generate_text(self, prompt, max_length100, temperature0.7): 生成文本 if not self.is_initialized: raise RuntimeError(模型未初始化) # 编码输入 inputs self.tokenizer.encode(prompt, return_tensorspt) # 生成配置 generation_config { max_length: max_length, temperature: temperature, do_sample: True, pad_token_id: self.tokenizer.eos_token_id } # 生成文本 with torch.no_grad(): outputs self.model.generate(inputs, **generation_config) # 解码结果 generated_text self.tokenizer.decode(outputs[0], skip_special_tokensTrue) return generated_text4.3 聊天引擎实现# src/chat_engine.py import re from typing import List, Dict class ChatEngine: def __init__(self, model_manager): self.model_manager model_manager self.conversation_history [] def format_prompt(self, user_input: str, history: List[Dict]) - str: 格式化对话提示 prompt 以下是一段对话记录\n for turn in history[-5:]: # 保留最近5轮对话 role 用户 if turn[role] user else 助手 prompt f{role}: {turn[content]}\n prompt f用户: {user_input}\n助手: return prompt def clean_response(self, response: str) - str: 清理模型响应 # 移除可能的重复内容 response re.sub(r助手:.*?(?用户:|$), , response, flagsre.DOTALL) response response.strip() # 限制响应长度 if len(response) 500: sentences response.split(。) response 。.join(sentences[:3]) 。 return response def chat(self, user_input: str) - str: 处理用户输入并返回响应 # 添加到历史记录 self.conversation_history.append({ role: user, content: user_input }) # 格式化提示 prompt self.format_prompt(user_input, self.conversation_history) # 生成响应 raw_response self.model_manager.generate_text( prompt, max_length200, temperature0.8 ) # 清理响应 cleaned_response self.clean_response(raw_response) # 添加到历史记录 self.conversation_history.append({ role: assistant, content: cleaned_response }) return cleaned_response def reset_conversation(self): 重置对话历史 self.conversation_history []4.4 配置文件示例# config/model_config.yaml model: name: bigscience/bloom-3b # 根据硬件选择合适模型 dtype: float32 # 精度设置float32, float16, bfloat16 prefetch: true # 是否预加载下一个块 network: max_retries: 5 # 最大重试次数 timeout: 120 # 超时时间秒 max_workers: 10 # 最大工作线程数 generation: max_length: 150 # 生成最大长度 temperature: 0.7 # 创造性程度 top_p: 0.9 # 核采样参数4.5 主程序实现# main.py import sys from pathlib import Path # 添加src目录到Python路径 sys.path.append(str(Path(__file__).parent / src)) from model_manager import PetalsModelManager from chat_engine import ChatEngine def main(): print( Petals 分布式聊天机器人 ) # 初始化模型管理器 print(正在初始化模型...) model_manager PetalsModelManager() if not model_manager.initialize_model(): print(模型初始化失败请检查配置和网络连接) return # 创建聊天引擎 chat_engine ChatEngine(model_manager) print(聊天机器人已就绪输入 退出 结束对话输入 重置 清空历史) print(- * 50) # 主对话循环 while True: try: user_input input(你: ).strip() if user_input.lower() in [退出, exit, quit]: print(再见) break elif user_input.lower() in [重置, reset]: chat_engine.reset_conversation() print(对话历史已重置) continue elif not user_input: continue # 获取响应 response chat_engine.chat(user_input) print(f助手: {response}) print(- * 30) except KeyboardInterrupt: print(\n程序被用户中断) break except Exception as e: print(f发生错误: {e}) continue if __name__ __main__: main()5. 性能优化与高级配置5.1 网络优化策略在分布式环境中网络性能直接影响用户体验# src/network_optimizer.py import time import threading from concurrent.futures import ThreadPoolExecutor class NetworkOptimizer: def __init__(self, model_manager): self.model_manager model_manager self.latency_cache {} self.optimization_thread None self.running False def measure_latency(self, sample_textHello, world): 测量网络延迟 start_time time.time() try: # 执行简单的推理测试 self.model_manager.generate_text(sample_text, max_length10) latency time.time() - start_time return latency except Exception: return float(inf) def optimize_network_params(self): 根据网络状况优化参数 latency self.measure_latency() optimized_config { timeout: max(30, min(300, int(latency * 10))), max_retries: 3 if latency 5 else 5, prefetch: latency 2 # 高延迟时关闭预加载 } return optimized_config def start_continuous_optimization(self, interval60): 启动持续优化 self.running True def optimization_loop(): while self.running: try: optimized_params self.optimize_network_params() self.apply_optimizations(optimized_params) time.sleep(interval) except Exception as e: print(f优化过程中出错: {e}) time.sleep(interval) self.optimization_thread threading.Thread(targetoptimization_loop) self.optimization_thread.daemon True self.optimization_thread.start() def apply_optimizations(self, params): 应用优化参数 # 这里可以实现参数动态调整逻辑 print(f应用网络优化参数: {params})5.2 内存管理优化对于资源受限的环境内存管理至关重要# src/memory_manager.py import psutil import gc import torch class MemoryManager: def __init__(self, memory_threshold0.8): self.memory_threshold memory_threshold self.conversation_cache {} self.cache_size_limit 10 # 最大缓存对话数 def get_memory_usage(self): 获取内存使用情况 process psutil.Process() memory_info process.memory_info() system_memory psutil.virtual_memory() return { process_rss_mb: memory_info.rss / 1024 / 1024, system_used_percent: system_memory.percent, system_available_mb: system_memory.available / 1024 / 1024 } def should_clear_cache(self): 判断是否需要清理缓存 memory_info self.get_memory_usage() return (memory_info[system_used_percent] self.memory_threshold * 100 or memory_info[process_rss_mb] 1024) # 进程使用超过1GB def manage_memory(self): 内存管理主函数 if self.should_clear_cache(): self.clear_caches() gc.collect() if torch.cuda.is_available(): torch.cuda.empty_cache() print(内存清理完成) def clear_caches(self): 清理各种缓存 # 清理对话缓存保留最近3个 if len(self.conversation_cache) 3: oldest_keys sorted(self.conversation_cache.keys())[:-3] for key in oldest_keys: del self.conversation_cache[key]6. 常见问题与解决方案6.1 连接与网络问题问题现象可能原因解决方案模型加载超时网络连接不稳定增加timeout参数检查防火墙设置频繁重连节点可用性差调整max_retries尝试不同时间段下载速度慢网络带宽不足选择较小的模型优化网络配置6.2 性能相关问题# 性能诊断工具 class PerformanceDiagnoser: def __init__(self, model_manager): self.model_manager model_manager self.performance_log [] def diagnose_performance(self, test_prompt测试性能): 全面性能诊断 diagnostics {} # 测试推理速度 start_time time.time() response self.model_manager.generate_text(test_prompt, max_length50) diagnostics[inference_time] time.time() - start_time # 检查内存使用 memory_info psutil.virtual_memory() diagnostics[memory_usage] memory_info.percent # 检查网络延迟 diagnostics[network_latency] self.test_network_latency() # 评估响应质量 diagnostics[response_quality] self.evaluate_response_quality(response) self.performance_log.append(diagnostics) return diagnostics def generate_performance_report(self): 生成性能报告 if not self.performance_log: return 无性能数据 avg_inference_time sum(log[inference_time] for log in self.performance_log) / len(self.performance_log) avg_memory_usage sum(log[memory_usage] for log in self.performance_log) / len(self.performance_log) report f 性能诊断报告: - 平均推理时间: {avg_inference_time:.2f}秒 - 平均内存使用: {avg_memory_usage:.1f}% - 总测试次数: {len(self.performance_log)} return report6.3 模型选择建议根据硬件配置选择合适的模型低配置设备8GB RAM以下: 推荐使用bloom-560m或bloom-1b7模型中等配置8-16GB RAM: 可以使用bloom-3b模型高配置设备16GB RAM以上: 适合bloom-7b1等更大模型7. 生产环境最佳实践7.1 安全考虑在部署Petals应用时需要注意以下安全事项# src/security_manager.py import re from typing import List class SecurityManager: def __init__(self): self.sensitive_patterns [ r\b(密码|密码|secret|password)\b, r\b(身份证|身份证号|id card)\b, r\b(银行卡|信用卡|bank card)\b, # 添加更多敏感信息模式 ] self.inappropriate_patterns [ r\b(暴力|暴力内容)\b, r\b(仇恨言论|hate speech)\b, # 添加更多不当内容模式 ] def sanitize_input(self, user_input: str) - str: 清理用户输入 # 移除可能的安全风险字符 sanitized re.sub(r[\], , user_input) # 检查敏感信息 for pattern in self.sensitive_patterns: if re.search(pattern, sanitized, re.IGNORECASE): raise ValueError(输入包含敏感信息) return sanitized.strip() def validate_output(self, model_output: str) - bool: 验证模型输出安全性 for pattern in self.inappropriate_patterns: if re.search(pattern, model_output, re.IGNORECASE): return False return True7.2 监控与日志建立完善的监控体系# src/monitoring.py import logging import json from datetime import datetime class MonitoringSystem: def __init__(self, log_filepetals_monitor.log): # 配置日志 logging.basicConfig( levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s, handlers[ logging.FileHandler(log_file), logging.StreamHandler() ] ) self.logger logging.getLogger(__name__) self.metrics { requests_processed: 0, average_response_time: 0, error_count: 0 } def log_request(self, user_input: str, response: str, processing_time: float): 记录请求日志 log_entry { timestamp: datetime.now().isoformat(), user_input: user_input[:100], # 限制长度保护隐私 response_length: len(response), processing_time: processing_time, success: True } self.logger.info(json.dumps(log_entry)) self.update_metrics(processing_time, successTrue) def log_error(self, error_message: str, user_input: str ): 记录错误日志 log_entry { timestamp: datetime.now().isoformat(), error: error_message, user_input: user_input[:100], success: False } self.logger.error(json.dumps(log_entry)) self.update_metrics(0, successFalse) def update_metrics(self, processing_time: float, success: bool): 更新性能指标 self.metrics[requests_processed] 1 if success: # 更新平均响应时间移动平均 old_avg self.metrics[average_response_time] count self.metrics[requests_processed] - self.metrics[error_count] self.metrics[average_response_time] ( old_avg * (count - 1) processing_time ) / count else: self.metrics[error_count] 1 def get_metrics_report(self) - dict: 获取指标报告 return self.metrics.copy()7.3 扩展性设计为应对未来需求变化设计应具备良好的扩展性# src/extensible_design.py from abc import ABC, abstractmethod from typing import Any, Dict class ModelProvider(ABC): 模型提供者抽象基类 abstractmethod def generate_text(self, prompt: str, **kwargs) - str: pass abstractmethod def get_model_info(self) - Dict[str, Any]: pass class PetalsProvider(ModelProvider): Petals模型提供者实现 def __init__(self, model_name: str): self.model_name model_name # 初始化Petals相关组件 def generate_text(self, prompt: str, **kwargs) - str: # 实现Petals特定的文本生成逻辑 pass def get_model_info(self) - Dict[str, Any]: # 返回模型信息 pass class ModelFactory: 模型工厂类 staticmethod def create_provider(provider_type: str, **kwargs) - ModelProvider: if provider_type petals: return PetalsProvider(**kwargs) # 可以轻松添加新的模型提供者 # elif provider_type openai: # return OpenAIProvider(**kwargs) else: raise ValueError(f不支持的提供者类型: {provider_type})通过本文的完整介绍你应该已经掌握了使用Petals在普通硬件上运行大语言模型的核心技术。这种分布式方法大大降低了AI技术的使用门槛为个人开发者和研究

相关新闻

Docker容器化技术:从入门到实战部署

Docker容器化技术:从入门到实战部署

1. 为什么每个开发者都需要Docker第一次接触Docker是在2015年的一次项目部署中。当时团队花了整整三天时间在服务器上配置环境,各种依赖冲突、版本不匹配的问题层出不穷。直到有位同事提议:"要不试试Docker?" 结果只用了一个docker…

2026/10/12 19:18:49 阅读更多 →
软件测试简历撰写全攻略:从核心要素到实战技巧

软件测试简历撰写全攻略:从核心要素到实战技巧

软件测试面试简历是求职过程中的第一道门槛,也是决定能否获得面试机会的关键因素。一份优秀的软件测试简历不仅要展示技术能力,还要体现项目经验、问题解决能力和职业素养。在当前竞争激烈的就业环境下,如何让简历在众多求职者中脱颖而出&…

2026/10/7 3:18:54 阅读更多 →
Linux进程内存管理机制与优化实践

Linux进程内存管理机制与优化实践

1. Linux进程内存管理概述在Linux系统中,进程内存管理是操作系统最核心的功能之一。作为一名长期从事Linux系统开发的工程师,我经常需要深入理解进程如何分配、使用和释放内存。不同于Windows等商业操作系统,Linux采用了一套独特而高效的内存…

2026/10/9 11:29:13 阅读更多 →

最新新闻

3、MySQL索引优化实战二

3、MySQL索引优化实战二

1、分页查询优化详解 1.1、分页性能分析 示例表: CREATE TABLE employees (id int(11) NOT NULL AUTO_INCREMENT,name varchar(24) NOT NULL DEFAULT COMMENT 姓名,age int(11) NOT NULL DEFAULT 0 COMMENT 年龄,position varchar(20) NOT NULL DEFAULT COMMENT 职…

2026/10/13 10:18:48 阅读更多 →
小白也能看懂:年薪百万的FDE岗位究竟是什么?AI时代新风口等你来!

小白也能看懂:年薪百万的FDE岗位究竟是什么?AI时代新风口等你来!

FDE(前端部署工程师)岗位因AI技术兴起而火爆,年薪可达百万。该岗位需要结合产品经理与程序员能力,负责AI产品在客户现场的部署与落地。FDE需具备分析能力、耐心和技术深度,熟悉大模型技术原理,年薪从27万到…

2026/10/13 10:18:48 阅读更多 →
Transformer跑不动的BMS,Mamba用线性复杂度把长时序容量预测搬进来

Transformer跑不动的BMS,Mamba用线性复杂度把长时序容量预测搬进来

一句话结论: 想在BMS那个紧算力、小MCU的"石头缝"里做长期锂电容量/RUL预测,Transformer的 O(L) 二次方自注意力几乎跑不动;多分辨率Mamba(状态空间模型,SSM)用 O(L) 线性复杂度 把长时序建模搬进…

2026/10/13 10:18:48 阅读更多 →
CSS 动效基础

CSS 动效基础

7.1 CSS 动效基础CSS 动效是前端交互反馈与视觉体验的核心实现方式,基于浏览器合成线程原生渲染,具备 GPU 加速能力,性能远优于 JavaScript 动画。CSS 动效体系分为过渡动画与关键帧动画两大核心类型,配合原生动画事件实现动画生命…

2026/10/13 10:18:48 阅读更多 →
T3 Stack全栈开发实战:从零搭建类型安全的Next.js应用

T3 Stack全栈开发实战:从零搭建类型安全的Next.js应用

开篇先解释一下:t3code 是我最近从头到尾搭完的一个基于 T3 Stack 的全栈应用代码库,名字里的 T3 指的不是某个框架版本,而是这几年在前端圈子里很流行的一套技术组合——Next.js、TypeScript、tRPC、Prisma、Tailwind CSS 再加 NextAuth。很…

2026/10/13 10:18:48 阅读更多 →
Conda换源配置全攻略:解决下载慢与连接失败问题

Conda换源配置全攻略:解决下载慢与连接失败问题

1. 为什么conda换源这件事值得单独拿出来说如果你用Anaconda或者Miniconda管理过Python环境,大概率经历过这样的场景:敲下conda install numpy,终端里光标转了半天,进度条纹丝不动,最后甩给你一个CondaHTTPError: HTTP…

2026/10/13 10:17:47 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

2026/10/12 0:16:38 阅读更多 →
影刀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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →