SkyRL:首个现实环境、长周期LLM Agent的端到端RL流水线框架

/uploads/wechat_images/wechat_47429f8bfad090866fa04a75fac58ada.jpg


如今众多的AI Agent智能体正在超越静态基准,进入需要长期规划、多步骤工具使用和环境反馈的现实世界任务。此前大多数现有的RL强化学习框架都针对涉及短期无状态交互的任务进行了优化,例如搜索增强推理或简单的代码执行。相比之下,现实世界中的任务(例如 SWE-Bench 中所示的任务)则受益于在有状态的动态环境中进行长期规划。这给基础设施和训练算法都带来了新的挑战。/uploads/wechat_images/wechat_559e4b3d08ece256607a09e3a5409788.jpg


在这种背景下,为了有效地训练这些Agent,我们推出了SkyRL,这是我们针对Multi-Turn多轮工具使用 LLM 的 RL 训练流程,它针对 SWE-Bench 等长期真实环境任务进行了优化,建立在VeRL和OpenHands之上。使用 SkyRL,我们能够使用大约 300 个训练数据样本,在各个模型线上的SWE-Bench-Verified上取得令人满意的结果!
  • SkyRL-Agent-7B-v0:11.0% → 14.6%

  • SkyRL-Agent-8B-v0:3.6% → 9.4%

  • SkyRL-Agent-14B-v0:18.0% → 21.6%

图 1:SkyRL 构建于 VeRL 之上,继承了 VeRL 对学习算法的丰富支持。SkyRL 通过引入Agent层扩展了 VeRL,使其具备以下优势:(1) 高效的异步多Rollout;(2) 通用工具的使用;以及 (3) 通用且可扩展的环境执行。

概述

强化学习的最新进展使语言模型能够成为主动Agent。近期的开源框架,例如 Search-R1 和 ToRL(基于 VeRL 构建),在这方面取得了令人瞩目的进展,实现了多轮强化学习,并能够交叉使用单一工具(例如搜索或代码执行)。这些系统为工具增强推理奠定了重要的基础。然而,诸如 SWE-Bench、WebDev 和 Web 浏览等复杂的现实世界任务需要高级Agent能力,其中模型需要调用多个工具、编写和运行测试、响应环境反馈并执行长期规划。图 2:使用 CodeAct Agent 解决 SWE-Bench 问题的示例工作流程。

虽然这些更先进的Agent智能体标志着令人兴奋的进化,但在它们上运行在线强化学习却极具挑战性。首先,高效的训练框架需要快速的环境执行和高效的环境交互Rollout。其次,高效的训练需要强大的长周期算法(这不是本文的重点)。总而言之,这使得问题比训练先前的工具增强推理法学硕士(LLM)复杂得多。

为了填补这一空白,我们推出了SkyRL——我们的强化学习训练流水线,用于在复杂环境中执行多轮工具使用LLM的长周期任务,包括SWE-Bench,它基于VeRL和OpenHands构建

SkyRL 功能

- 支持训练执行具有复杂环境交互的多步骤计划的LLM智能体。

- 通过异步并行Rollout操作,在轨迹上重叠计算密集型阶段和环境交互密集型阶段,实现更高吞吐量的生成(比基线实现加速 4-5 倍)。

- 预填充(并扩展)强化学习算法,方便快速启动。

在 v0 版本中,我们支持 SWE-Bench 的端到端在线强化学习训练流程。接下来计划支持其他长周期任务,例如 WebArena 和 WebDev。本文章的其余部分将讨论我们在基础设施方面面临的挑战和经验教训,以及我们的初步模型结果。系统设计

在 SkyRL-v0 中,我们主要致力于解决环境扩展和低效Rollout阶段的挑战。我们集成了OpenHands项目中的CodeAct抽象作为Agent循环部分,并采用远程沙盒服务器实现可扩展的环境Rollout。

挑战 1:环境扩展 - 远程沙盒服务器

在许多实际的Agent训练任务中,例如 SWE-Bench,每次Rollout都必须在隔离且有状态的环境中运行,通常通过 Docker 容器进行配置。这些环境通常都是资源密集型,每个环境消耗1 个以上的 CPU 和约 7GB 的存储空间。即使是中等配置(例如,批次大小为 16,Rollout 8 次)也可能需要 100 多个 CPU 和接近 1TB 的磁盘空间。

将环境执行与训练共置会导致隔离受限,并且扩展并行运行环境数量的灵活性不足,这可能导致LLM 推理引擎的请求速率不足,最终导致GPU 资源利用率低下。为了解决这个问题,我们实现了一个可扩展的远程沙盒服务器将环境执行与训练分离。这种分离式设计支持独立扩展环境Worker,以保持较高的环境交互速率,从而确保在Rollout阶段实现较高的 GPU 利用率。

图 3:远程沙盒服务器的 Kubernetes Deployment。

我们将服务器部署在 Kubernetes 上,利用存储优化的实例来缓存容器镜像并实现快速启动。为了高效处理并发请求,我们利用aidocker和crun容器运行时,它提供轻量级且高性能的容器执行。我们的设置支持在 16 CPU 节点上每个副本运行大约 80-100 个容器,而不会遇到稳定性问题。虽然仍有很大的优化空间,但我们目前的实现简单、高效且公开可用。我们将服务器代码和Deployment配置开源,以支持有意自行托管强化学习训练所需的可扩展远程沙盒环境的研究人员。

挑战 2:费用昂贵的生成阶段

在基于Agent的强化学习训练中,Rollout阶段需要Agent与环境进行多轮交互。近期在多轮强化学习 (MDRL) 领域取得的进展,例如 RAGEN、Search-R1 和 ReTool,通常每个轨迹仅涉及有限数量的交互步骤。相比之下,像 SWE-bench 这样的任务通常需要 20 到 50 个轮次(甚至更多)才能让智能体使用 OpenHands 框架完成整个流程,这通常涉及识别相关文件、编写测试用例以重现问题、应用代码编辑以及通过测试验证修复。此外,每个步骤的环境执行时间在不同轨迹之间可能存在显著差异,具体取决于智能体操作的性质。例如,列出文件通常很快,而执行 Python 脚本进行单元测试则可能要耗费更多时间。

图 4 不同 rollout 实现方式的可视化。我们的异步 Rollout + 3 阶段生产者-消费者流水线有效加速了 rollout 的生成。

如图 4 上半部分所示,单轮强化学习中常见的 rollout 实现(例如 VeRL和 OpenRLHF对于Agent式推理工作负载而言效率低下。这种低效源于每个 LLM 生成步骤的同步障碍,而同步障碍是由于依赖离线批量生成造成的。因此,系统无法利用现代 LLM 服务引擎支持的连续批量优化,导致资源利用率低下和吞吐量降低。

为了解决这个问题,我们采用了两项优化措施,与原始基线实现相比,总共实现了4-5 倍的加速

1. 异步Rollout – 依赖现代 LLM 服务引擎(例如SGLang和 vLLM)的 `async_generate` 方法,每条轨迹可以独立推进,从而避开全局同步点,如上图 4 中间部分所示。

2.三阶段生产者-消费者流水线 – 此外,为了减少 GPU 空闲时间,我们可以将 (i) 运行时初始化(例如构建镜像、启动和连接容器)、(ii) 轨迹生成和 (iii) 奖励计算(例如发送补丁、运行测试)这几个阶段解耦并重叠,以最大化并行性和系统吞吐量,如上图 4 底部所示。

  • a. 我们通过三个队列实现此流水线:`init queue`、`run queue` 和 `eval queue`。每个阶段都充当下一个阶段的生产者:`init queue`从`init_queue` 中拉取数据,准备环境,然后推送至 `run_queue`;Agent Runner从 `run_queue` 中拉取已初始化的实例,执行多轮Rollout,并将完成的轨迹推送至 `eval_queue`;然后,`eval queue`从 `eval_queue` 中拉取数据来计算最终奖励。

  • b. 我们使用 `asyncio` 任务,并根据队列占用情况和剩余工作动态生成任务。每个任务都异步地将其结果推送至下一阶段,使用有Bounded的队列可以提供自然的反压机制(back-pressure),防止过载并确保跨阶段的负载平衡。这种流水线执行通过将计算和环境交互密集型阶段重叠在许多轨迹上,显著提高了系统吞吐量

早期训练探索

我们采用Openhands中的CodeAct 框架和OpenHands 脚手架来生成 rollout,并利用基于规则的奖励来执行策略更新。

Rollout 生成

我们利用 OpenHands 脚手架在软件工程任务环境中迭代地提示模型。在每个回合中,模型都会编写代码并执行函数调用作为操作。该模型提供三种类型的操作:(1) `execute_bash`:在终端中执行 bash 命令;(2) `finish`:在任务完成或助手无法继续执行任务时结束交互;(3) `str_replace_editor`:用于查看、创建和编辑文件的自定义编辑工具。

具体来说,Rollout操作通过以下流程生成:

Input: Model M, Environment E, Task description P, a set of available actions A. # OpenHands manage the history of interaction, # initialized with the task description.history = P 
while not done:    # The CodeAct framework prompt the model with the history and     # the available tool. The model generates an action in the form    # of execuatble code, e.g., view_file(file_path).    action = M(history, A)    # The action is then sent to the environment for execution    # and gets an environment observation.    # e.g. the content of a view_file action.    # The loop terminates if the action is a termination action.     done, observation = E(action)    # OpenHands then tracks the history by appending the action    # and the observation in this turn.    history.append(action)    history.append(observation)
# Returns a git patch written by the model in the history of interactionpatch = E.get_patch()return patch

奖励设计

我们使用一种简单的基于结果的奖励机制。在Agent完成交互后,我们会从环境中获取 Git 补丁。然后,我们将该补丁应用到原始代码库,并针对目标 GitHub 问题运行测试套件。如果测试通过且问题得到解决,我们将奖励 1;否则,奖励为 0。尽管简单,但这种信号有效地指导了模型,从而提高了问题解决率(参见结果部分)。我们还跟踪了两种常见的故障模式

- 陷入循环:模型连续三轮重复相同的操作。

- 未完成操作:模型未能在规定的轮次预算内输出完成操作。

我们的实验表明,这种奖励方案可以减少循环并鼓励及时完成。我们目前正在探索更丰富的多轮强化学习奖励设计

数据选择

我们从SWE-Gym中选择问题,该数据集包含 2,438 个真实的 Python 任务实例。然而,这些任务极具挑战性——即使是 GPT-4o 的成功率也只有 4.55% 到 9.13%(详情请参阅 SWE-Gym 论文中的表 10)。因此,性能较弱的模型(例如 70 亿规模的模型)通常无法完成一次成功的Rollout,导致在 GRPO 和 PPO 等算法下没有学习信号,训练崩溃。为了缓解这个问题,我们构建了三个经过筛选的数据子集,并以模型生成成功率作为选择标准:

方案与结果

在此版本中,我们开源了三个不同规模、使用不同算法训练的模型,以满足社区的需求:

  • SkyRL-Agent-7B-v0(基于 OpenHands-7B-Agent 训练,基础模型 Qwen2.5-Coder-7B-Instruct)、

  • SkyRL-Agent-8B-v0(基于 Qwen3-8B 训练,非推理模式)

  •  SkyRL-Agent-14B-v0(基于 Qwen3-14B 训练,推理模式)。

评估设置

我们使用 OpenHands 脚手架和 CodeAct Agent 评估我们的模型,并使用相同的操作集:bash_execute、finish 和 str_replace_editor。我们在 SWE-Bench Verified 基准上进行评估,最大轮次预算为 50,最大序列长度为 32k。评估说明可在以下位置找到:

[SkyRL-OpenHands](https://github.com/NovaSky-AI/SkyGym-OpenHands/tree/main/evaluation/benchmarks/swe_bench)

- SkyRL-Agent-7B-v0

SkyRL-Agent-7B-v0基于OpenHands-7B-Agent模型进行训练,该模型是 Qwen2.5-Coder-Instruct模型的监督微调版本。我们采用基于结果的强化学习,分两阶段进行训练,批次大小为 16,每个实例 8 次 rollout。训练时,学习率为 1e-6,KL 系数为 1e-3,rollout 温度为 0.5,最大轮次为 25 次,并采用 GRPO 算法。

- 使用 SkyRL-v0-80-data 进行 15 步训练(3 个 epoch,在 8xH100 GPU 上耗时 7 小时)

- 使用 SkyRL-v0-220-data 进行 15 步训练(1 个 epoch,在 8xH100 GPU 上耗时 8.5 小时)

我们按照 SWE-Gym 论文中的建议,将训练温度设为 0,并与基线一起对模型进行了测量。我们发现,在 8xH100 GPU 上训练 15.5 小时后。该模型在 SWE-Bench-Verified 数据集上解决的问题数量提高了 3.6%

- SkyRL-Agent-8B-v0(非思考模式)

SkyRL-Agent-8B-v0 在 Qwen3-8B 上进行训练,未启用思考模式(通过在`apply_chat_template` 中设置 `enable_thinking=False`)。我们使用一个基于结果的强化学习阶段进行训练,批次大小为 32,每个实例的 rollout 数量为 8。训练时学习率为 1e-6,KL 系数为 1e-3,rollout 温度为 0.6。该模型在 SWE-Bench-Verified 数据集上解决的问题数量提高了5.8%

- 使用 SWEGym-293-data 进行 47 步训练(4.7 个 epoch,在 8xH200 上训练 27 小时)。

- SkyRL-Agent-14B-v0(思考模式)

使用思考模式进行多轮训练很容易超出上下文长度,尤其是对于较小的模型,它们更容易陷入推理阶段。因此,对于思考模式,我们尝试使用 Qwen3-14B作为基础模型。

SkyRL-Agent-14B-v0 在 Qwen3-14B的基础上使用 PPO 进行训练。我们采用基于结果的强化学习进行单阶段训练,批次大小为 32,每个实例的 rollout 为 8。我们训练时,学习率为 1e-6,KL 系数为 1e-3,rollout 温度为 0.6,裁剪提升率 (clip higher ratio) 为 0.28,以鼓励探索。我们使用Qwen3-14B本身作为基础评价模型。该模型在 SWE-Bench-Verified 数据集上解决的问题数量提高了3.1%

- 使用 SkyRL-v0-293-data 进行 25 步训练(2.7 个 epoch,在 8xH200 GPU 上耗时 20 小时)。


展望未来:构建社区平台


SkyRL 尚处于早期阶段,但其构建着眼于长远目标:


1. 多环境支持:超越 SWE-Bench——可扩展至各种长周期智能体任务。

2. 可扩展性:轻松集成新环境、智能体、工具、奖励函数和任务。

3. 高效性:高效的生成和优化的执行流水线,最大限度地减少缓慢环境带来的开销。


SkyRL 是迈向高效长远智能体强化学习训练的一步。我们诚邀社区成员试用并与我们共同构建!


文链接:https://novasky-ai.notion.site/skyrl-v0/uploads/wechat_images/wechat_fdc68a472484086726e930b4d98e382a.jpg


0 个评论

要回复文章请先登录注册

Debug messages:

Template: default


Session:

Session type: db

[tlu__Anwsion] Array ( [permission] => [client_info] => [human_valid] => )


Plugins:


Loaded Class:

core_config: /data/aiquanzi/system/core/config.php

core_db: /data/aiquanzi/system/core/db.php

Zend_Db: /data/aiquanzi/system/Zend/Db.php

Zend_Db_Adapter_Abstract: /data/aiquanzi/system/Zend/Db/Adapter/Abstract.php

Zend_Db_Adapter_Mysqli: /data/aiquanzi/system/Zend/Db/Adapter/Mysqli.php

Zend_Db_Profiler: /data/aiquanzi/system/Zend/Db/Profiler.php

Zend_Db_Statement_Interface: /data/aiquanzi/system/Zend/Db/Statement/Interface.php

Zend_Db_Statement: /data/aiquanzi/system/Zend/Db/Statement.php

Zend_Db_Statement_Mysqli: /data/aiquanzi/system/Zend/Db/Statement/Mysqli.php

Zend_Registry: /data/aiquanzi/system/Zend/Registry.php

Zend_Cache: /data/aiquanzi/system/Zend/Cache.php

Zend_Cache_Backend: /data/aiquanzi/system/Zend/Cache/Backend.php

Zend_Cache_Backend_Interface: /data/aiquanzi/system/Zend/Cache/Backend/Interface.php

Zend_Cache_Backend_ExtendedInterface: /data/aiquanzi/system/Zend/Cache/Backend/ExtendedInterface.php

Zend_Db_Table_Abstract: /data/aiquanzi/system/Zend/Db/Table/Abstract.php

core_plugins: /data/aiquanzi/system/core/plugins.php

setting_class: /data/aiquanzi/models/setting.php

Zend_Db_Select: /data/aiquanzi/system/Zend/Db/Select.php

Zend_Db_Expr: /data/aiquanzi/system/Zend/Db/Expr.php

Zend_Session_Abstract: /data/aiquanzi/system/Zend/Session/Abstract.php

Zend_Session: /data/aiquanzi/system/Zend/Session.php

Zend_Session_SaveHandler_Interface: /data/aiquanzi/system/Zend/Session/SaveHandler/Interface.php

Zend_Session_SaveHandler_DbTable: /data/aiquanzi/system/Zend/Session/SaveHandler/DbTable.php

Zend_Exception: /data/aiquanzi/system/Zend/Exception.php

Zend_Session_Exception: /data/aiquanzi/system/Zend/Session/Exception.php

Zend_Db_Table_Select: /data/aiquanzi/system/Zend/Db/Table/Select.php

Zend_Db_Table_Rowset_Abstract: /data/aiquanzi/system/Zend/Db/Table/Rowset/Abstract.php

Zend_Db_Table_Rowset: /data/aiquanzi/system/Zend/Db/Table/Rowset.php

Zend_Db_Table_Row_Abstract: /data/aiquanzi/system/Zend/Db/Table/Row/Abstract.php

Zend_Db_Table_Row: /data/aiquanzi/system/Zend/Db/Table/Row.php

Zend_Session_Namespace: /data/aiquanzi/system/Zend/Session/Namespace.php

core_cache: /data/aiquanzi/system/core/cache.php

core_uri: /data/aiquanzi/system/core/uri.php

banip_class: /data/aiquanzi/models/banip.php

Zend_Validate_Interface: /data/aiquanzi/system/Zend/Validate/Interface.php

Zend_Validate: /data/aiquanzi/system/Zend/Validate.php

Zend_Loader: /data/aiquanzi/system/Zend/Loader.php

Zend_Validate_Abstract: /data/aiquanzi/system/Zend/Validate/Abstract.php

core_user: /data/aiquanzi/system/core/user.php

admin_class: /data/aiquanzi/models/admin.php

TPL: /data/aiquanzi/system/class/cls_template.inc.php

Savant3: /data/aiquanzi/system/Savant3.php

account_class: /data/aiquanzi/models/account.php

HTTP: /data/aiquanzi/system/class/cls_http.inc.php

hook_class: /data/aiquanzi/models/hook.php

plugin_class: /data/aiquanzi/models/plugin.php

PLUTPL: /data/aiquanzi/system/class/cls_plugins.inc.php

article_class: /data/aiquanzi/models/article.php

Zend_Filter_Interface: /data/aiquanzi/system/Zend/Filter/Interface.php

Zend_Filter_Digits: /data/aiquanzi/system/Zend/Filter/Digits.php

FORMAT: /data/aiquanzi/system/class/cls_format.inc.php

Services_BBCode: /data/aiquanzi/system/Services/BBCode.php

topic_class: /data/aiquanzi/models/topic.php

people_class: /data/aiquanzi/models/people.php

reputation_class: /data/aiquanzi/models/reputation.php

question_class: /data/aiquanzi/models/question.php

system_class: /data/aiquanzi/models/system.php

Services_Phpanalysis_Phpanalysis: /data/aiquanzi/system/Services/Phpanalysis/Phpanalysis.php

search_fulltext_class: /data/aiquanzi/models/search/fulltext.php

core_pagination: /data/aiquanzi/system/core/pagination.php

posts_class: /data/aiquanzi/models/posts.php

file_down_class: /data/aiquanzi/plugins/wc_file_down/file_down_model.php

sham_views_class: /data/aiquanzi/plugins/wc_sham_views/sham_views_model.php

article_download_class: /data/aiquanzi/plugins/wc_article_download/article_download_model.php

core_lang: /data/aiquanzi/system/core/lang.php


Database

[ Log time: 1756323771.5874 ] [ Expend time: 0.0047659873962402 ] Connect Master DB

[ Log time: 1756323771.5935 ] [ Expend time: 0.0018808841705322 ] SELECT `wecenter_system_setting`.* FROM `wecenter_system_setting`

[ Log time: 1756323771.6 ] [ Expend time: 0.0012400150299072 ] SELECT `wecenter_nav`.`url` FROM `wecenter_nav` WHERE (is_index=1 AND status='Y') LIMIT 1

[ Log time: 1756323771.6027 ] [ Expend time: 0.001101016998291 ] SELECT `wecenter_ban_ip`.`id` FROM `wecenter_ban_ip` WHERE (ip='216.73.216.42') LIMIT 1

[ Log time: 1756323771.6045 ] [ Expend time: 0.001201868057251 ] SELECT `wecenter_nav`.* FROM `wecenter_nav` WHERE (status='Y') ORDER BY `sort` desc

[ Log time: 1756323771.6076 ] [ Expend time: 0.00087404251098633 ] SELECT `wecenter_users_group`.* FROM `wecenter_users_group` WHERE (group_id = 99) LIMIT 1

[ Log time: 1756323771.6105 ] [ Expend time: 0.0015199184417725 ] SELECT `wecenter_hook_plugins`.`hook`, `wecenter_hook_plugins`.`plugins` FROM `wecenter_hook_plugins` WHERE (status = 1) ORDER BY `sort` DESC

[ Log time: 1756323771.6139 ] [ Expend time: 0.0024101734161377 ] SELECT `wecenter_plugins`.* FROM `wecenter_plugins` WHERE (state = 1)

[ Log time: 1756323771.6318 ] [ Expend time: 0.0026209354400635 ] SELECT `wecenter_article`.* FROM `wecenter_article` WHERE (id = 87) LIMIT 1

[ Log time: 1756323771.6333 ] [ Expend time: 0.0013961791992188 ] SELECT `wecenter_users`.* FROM `wecenter_users` WHERE (is_del = 0 AND uid = 38) LIMIT 1

[ Log time: 1756323771.6345 ] [ Expend time: 0.0010559558868408 ] SELECT `wecenter_users_attrib`.* FROM `wecenter_users_attrib` WHERE (uid = 38) LIMIT 1

[ Log time: 1756323771.6398 ] [ Expend time: 0.0013961791992188 ] SELECT `wecenter_article_vote`.* FROM `wecenter_article_vote` WHERE (`type` = 'article' AND item_id = 87 AND rating = 1)

[ Log time: 1756323771.6429 ] [ Expend time: 0.0013160705566406 ] SELECT `wecenter_topic_relation`.* FROM `wecenter_topic_relation` WHERE (item_id IN(87) AND `type` = 'article')

[ Log time: 1756323771.6443 ] [ Expend time: 0.0012860298156738 ] SELECT `wecenter_topic`.* FROM `wecenter_topic` WHERE (topic_id IN(13,14))

[ Log time: 1756323771.6464 ] [ Expend time: 0.0012850761413574 ] SELECT `wecenter_reputation_topic`.* FROM `wecenter_reputation_topic` WHERE (uid IN(38)) ORDER BY `topic_count` DESC

[ Log time: 1756323771.6477 ] [ Expend time: 0.0012350082397461 ] SELECT `wecenter_article_comments`.* FROM `wecenter_article_comments` WHERE (is_del = 0 and article_id = 87) ORDER BY `add_time` ASC LIMIT 100

[ Log time: 1756323771.6487 ] [ Expend time: 0.00088095664978027 ] SELECT COUNT(*) AS `n` FROM `wecenter_article_comments` WHERE (is_del = 0 and article_id = 87)

[ Log time: 1756323771.6556 ] [ Expend time: 0.00148606300354 ] SELECT *, MATCH(question_content_fulltext) AGAINST('' IN BOOLEAN MODE) AS score FROM wecenter_question WHERE MATCH(question_content_fulltext) AGAINST('' IN BOOLEAN MODE) LIMIT 2000

[ Log time: 1756323771.6589 ] [ Expend time: 0.0010621547698975 ] SELECT `wecenter_topic`.* FROM `wecenter_topic` WHERE (topic_id = 13) LIMIT 1

[ Log time: 1756323771.6601 ] [ Expend time: 0.0011651515960693 ] SELECT item_id FROM wecenter_topic_relation WHERE topic_id IN(13) AND `type` = '10'

[ Log time: 1756323771.6613 ] [ Expend time: 0.0012128353118896 ] SELECT topic_id FROM wecenter_topic WHERE parent_id = 13

[ Log time: 1756323771.6626 ] [ Expend time: 0.0011630058288574 ] SELECT `wecenter_topic_merge`.* FROM `wecenter_topic_merge` WHERE (target_id = 13)

[ Log time: 1756323771.6637 ] [ Expend time: 0.0010199546813965 ] SELECT `wecenter_topic`.* FROM `wecenter_topic` WHERE (topic_id = 14) LIMIT 1

[ Log time: 1756323771.6649 ] [ Expend time: 0.0011470317840576 ] SELECT item_id FROM wecenter_topic_relation WHERE topic_id IN(14) AND `type` = '10'

[ Log time: 1756323771.6661 ] [ Expend time: 0.0011429786682129 ] SELECT topic_id FROM wecenter_topic WHERE parent_id = 14

[ Log time: 1756323771.6674 ] [ Expend time: 0.0012059211730957 ] SELECT `wecenter_topic_merge`.* FROM `wecenter_topic_merge` WHERE (target_id = 14)

[ Log time: 1756323771.6688 ] [ Expend time: 0.0013680458068848 ] SELECT `item_id`, `type` FROM wecenter_topic_relation WHERE `topic_id` IN(13,14)

[ Log time: 1756323771.6706 ] [ Expend time: 0.0016469955444336 ] SELECT `wecenter_posts_index`.* FROM `wecenter_posts_index` WHERE (((post_id IN (64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,87,88,89,90,91,92) AND post_type = 'article')) AND is_recommend = 1 AND is_del = 0) ORDER BY `add_time` DESC LIMIT 10

[ Log time: 1756323771.6719 ] [ Expend time: 0.0011141300201416 ] SELECT COUNT(*) AS `n` FROM `wecenter_posts_index` WHERE (((post_id IN (64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,87,88,89,90,91,92) AND post_type = 'article')) AND is_recommend = 1 AND is_del = 0)

[ Log time: 1756323771.6745 ] [ Expend time: 0.0012581348419189 ] SELECT `wecenter_article_download`.* FROM `wecenter_article_download` WHERE (article_id = 87) LIMIT 1

[ Log time: 1756323771.6961 ] [ Expend time: 0.0011301040649414 ] SELECT `wecenter_users`.`avatar_file` FROM `wecenter_users` WHERE (uid=38) LIMIT 1


Cache

[ Log time: 1756323771.5982 ] Backend: File

[ Log time: 1756323771.5982 ] [ Expend time: 0.000021 ] Get Cache: crond, result type: boolean

[ Log time: 1756323771.6067 ] [ Expend time: 0.000064 ] Get Cache: user_group_99, result type: boolean

[ Log time: 1756323771.6079 ] [ Expend time: 0.000034 ] Get Cache: users_group, result type: boolean

[ Log time: 1756323771.6081 ] [ Expend time: 0.000173 ] Save Cache: fkfvhvabwekgrlw_group_users_group, result type: array

[ Log time: 1756323771.6081 ] [ Expend time: 0.000473 ] Save Cache: user_group_99, result type: array

[ Log time: 1756323771.6478 ] [ Expend time: 0.000039 ] Get Cache: db_rows_cache_f7a6523e1fe23a105ca19ec6c8736e6d, result type: boolean

[ Log time: 1756323771.6511 ] [ Expend time: 0.000094 ] Get Cache: question_related_list_03d6212b84c2f905f6acc1f6e4778bf7_10, result type: boolean

[ Log time: 1756323771.6558 ] [ Expend time: 0.000215 ] Save Cache: question_related_list_03d6212b84c2f905f6acc1f6e4778bf7_10, result type: boolean

[ Log time: 1756323771.6559 ] [ Expend time: 0.000017 ] Get Cache: update_views_article_60a99c169301af27fef93432ff9afa31_87, result type: boolean

[ Log time: 1756323771.656 ] [ Expend time: 0.000159 ] Save Cache: update_views_article_60a99c169301af27fef93432ff9afa31_87, result type: integer

[ Log time: 1756323771.6689 ] [ Expend time: 0.000023 ] Get Cache: posts_list_by_topic_ids_d47ea5d848e6dd133349707cb0c4c4cb, result type: boolean

[ Log time: 1756323771.6707 ] [ Expend time: 0.000021 ] Get Cache: db_rows_cache_69074feb9217cf5d82867ae480dc50e7, result type: boolean

[ Log time: 1756323771.6719 ] [ Expend time: 0.000019 ] Get Cache: posts_list_by_topic_ids_found_rows_6183541815abf0f417f32392b4e698a5, result type: boolean


Escape time: 0.40526103973389, 31 queries, PHP Memory usage: 6842.46875 KB, Server time: 2025-08-28 03:42:51