从LLM论文到生产系统:推理延迟优化的量化实验方法
从LLM论文到生产系统推理延迟优化的量化实验方法一、论文里的3秒生产环境的15秒——学术基准与真实场景的鸿沟LLM 推理延迟是产品体验的致命指标。在学术论文中最优模型的推理延迟通常被报告在 1-3 秒的区间。但当同样的模型被部署到生产环境实际延迟可能飙升至 10-15 秒。这个差距来自哪里学术基准测试通常有一个标准假设单次推理、标准化的输入长度、预留的 GPU 资源、无并发请求。而生产环境的真实情况完全不同请求并发数不可预测、输入输出长度差异巨大、共享 GPU 资源池中不同的请求互相竞争显存和算力、KV Cache 在长对话中持续膨胀。这不是一个选更好的模型就能解决的问题。推理延迟的优化需要通过量化的实验方法来系统性地识别瓶颈、评估方案、验证收益。这篇文章将从方法论层面提供一套可复现的延迟优化实验框架。二、延迟的解剖——从端到端到逐层分解2.1 延迟的三段式分解flowchart LR subgraph T1[T1: 预处理延迟] A1[Tokenization] A2[Embedding 查找] A3[prompt 编码] end subgraph T2[T2: 模型推理延迟] B1[Attention 计算] B2[FFN 前馈网络] B3[KV Cache 读写] end subgraph T3[T3: 后处理延迟] C1[Logits → Token] C2[采样/Beam Search] C3[解码与截断] C4[安全审核] end A3 -- B1 B3 -- C1 C3 -- D[TTFT: 首Token时间] C4 -- E[TPOT: 跨Token间隔时间] style T1 fill:#e3f2fd style T2 fill:#fff3e0 style T3 fill:#e8f5e9延迟优化需要两个关键指标来指导TTFTTime To First Token首个 Token 生成时间和 TPOTTime Per Output Token每个输出 Token 的平均生成时间。两者的优化策略完全不同。TTFT 的瓶颈主要在 prompt 编码阶段。长 prompt如带有大量 Few-shot 示例或 RAG 检索结果的上下文需要在 Attention 层对历史 Token 做全量计算。优化方向是KV Cache 预填充优化、prompt 压缩和剪枝。TPOT 的瓶颈在自回归解码阶段。每个 Token 都需要一次完整的前向传播且依赖前一个 Token 的 KV Cache 状态。这个阶段无法并行化。优化方向是Speculative Decoding推测解码、KV Cache 量化、模型量化INT8/INT4、批处理调度优化。2.2 测量的方法论为什么 99 分位比平均值重要得多在多用户并发的推理服务中平均延迟是极具欺骗性的指标。100 个请求中有 95 个在 1 秒内返回剩余的 5 个花了 10 秒——平均延迟只有 1.45 秒看起来可以接受。但对那 5 个用户而言他们的等待体验是 10 秒。推理延迟必须使用多分位值来度量P50中位延迟、P9595% 用户的延迟、P9999% 用户的延迟。其中 P99 通常被称为长尾延迟是在线推理服务最重要的可靠性指标之一。同时需要区分冷启动延迟和热启动延迟。当推理服务在一段时间无流量后被 scale to zero下次第一个请求的延迟会显著偏高需要加载模型权重、初始化 KV Cache 池。在面向用户的场景中必须通过 keep-warm 机制或预热请求来消除冷启动影响。三、将论文方案转化为可量化的生产实验3.1 推理延迟基准测试框架#!/usr/bin/env python3 LLM 推理延迟基准测试与量化分析框架 设计目标 1. 模拟真实生产流量模式非均匀单一请求 2. 采集多维度延迟指标TTFT, TPOT, P50/P95/P99 3. 对比不同优化策略的效果量化、批处理、KV Cache 4. 生成可复现的实验报告 import time import json import asyncio import logging import random from typing import List, Dict, Optional, Tuple from dataclasses import dataclass, field from collections import defaultdict from enum import Enum logging.basicConfig(levellogging.INFO) logger logging.getLogger(__name__) class OptimizationStrategy(Enum): 优化策略枚举 BASELINE baseline # 基线无优化 KV_CACHE_QUANT kv_cache_quant # KV Cache 量化 INT8_QUANT int8_quant # INT8 模型量化 SPECULATIVE_DECODE speculative_decode # 推测解码 CONTINUOUS_BATCHING continuous_batching # 连续批处理 PREFIX_CACHING prefix_caching # 前缀缓存 dataclass class RequestProfile: 推理请求特征定义 生产环境的请求不是均匀分布的使用正态分布 幂律分布的组合来模拟真实流量。 prompt_tokens: int # 输入 token 数 max_output_tokens: int # 期望最大输出 token 数 temperature: float 0.7 timestamp: float field(default_factorytime.time) dataclass class InferenceMetrics: 单次推理的完整指标 request_id: str strategy: OptimizationStrategy ttft_ms: float # 首个 Token 生成时间 (ms) tpot_ms: float # 每 Token 平均生成时间 (ms) total_latency_ms: float # 端到端总延迟 (ms) prompt_tokens: int # 实际输入 Token 数 output_tokens: int # 实际输出 Token 数 gpu_memory_used_mb: float # GPU 显存使用量 success: bool # 请求是否成功 error_message: str additional_metrics: Dict field(default_factorydict) class RequestGenerator: 生产流量模拟生成器 模拟的真实场景70% 的请求是短 prompt200 token 20% 是中等长度200-1000 token10% 是长 prompt1000 token。 这种分布反映了典型对话式 AI 产品的请求特征——大部分用户提问简短。 # 三种流量模型的参数配置 TRAFFIC_MODELS { chat: { # 对话场景短 prompt 为主 prompt_short: (50, 200), # (min, max) tokens prompt_medium: (200, 1000), prompt_long: (1000, 4000), weights: [0.70, 0.20, 0.10], # 三类 prompt 的分布权重 output_range: (50, 500), # 输出 token 数范围 }, rag: { # RAG 场景普遍较长 prompt prompt_short: (200, 500), prompt_medium: (500, 2000), prompt_long: (2000, 8000), weights: [0.20, 0.40, 0.40], output_range: (100, 800), }, code: { # 代码生成输出 token 较多 prompt_short: (100, 300), prompt_medium: (300, 1500), prompt_long: (1500, 6000), weights: [0.30, 0.40, 0.30], output_range: (200, 2000), }, } def __init__(self, model: str chat, seed: int 42): if model not in self.TRAFFIC_MODELS: raise ValueError(f未知流量模型: {model}可选: {list(self.TRAFFIC_MODELS.keys())}) self.config self.TRAFFIC_MODELS[model] random.seed(seed) def generate_requests(self, count: int) - List[RequestProfile]: 生成指定数量的模拟请求 每个请求的特征prompt 长度、输出长度随机采样于配置的范围内 requests [] for i in range(count): # 根据权重选择 prompt 长度分类 category random.choices( [short, medium, long], weightsself.config[weights], k1 )[0] # 在对应分类范围内随机生成 token 数 min_tokens, max_tokens self.config[fprompt_{category}] prompt_tokens random.randint(min_tokens, max_tokens) # 生成输出 token 限制 out_min, out_max self.config[output_range] max_output random.randint(out_min, out_max) requests.append(RequestProfile( prompt_tokensprompt_tokens, max_output_tokensmax_output, )) return requests class MockInferenceEngine: 模拟推理引擎 在真实环境中这里的逻辑应替换为对 vLLM、TGI 或 Triton 的实际调用。 这里使用基于 token 数的时间估算模型来模拟延迟特征。 时间估算模型考虑了 1. prompt 编码时间 (约 0.5-2ms/token随 prompt 增长而递增) 2. 自回归解码时间 (约 10-50ms/token) 3. 并发拥塞因子 (并发数越高每个请求分到的算力越少) def __init__(self): self._concurrent_requests 0 async def infer( self, request: RequestProfile, strategy: OptimizationStrategy, ) - InferenceMetrics: 模拟推理并返回指标 在真实环境中需要: 1. 调用推理服务的 gRPC/HTTP 接口 2. 使用 streaming 模式记录 TTFT 3. 统计 GPU 显存使用情况 self._concurrent_requests 1 request_id freq_{int(time.time() * 1000)}_{random.randint(1000, 9999)} try: # 阶段 1: 预处理 (Tokenization Embedding) # 预处理时间与 prompt token 数成线性关系 preprocess_ms request.prompt_tokens * random.uniform(0.3, 0.8) # 阶段 2: 模型推理 # 不同的优化策略影响推理速度的系数不同 speedup_factors { OptimizationStrategy.BASELINE: 1.0, OptimizationStrategy.KV_CACHE_QUANT: 1.2, OptimizationStrategy.INT8_QUANT: 1.5, OptimizationStrategy.SPECULATIVE_DECODE: 1.8, OptimizationStrategy.CONTINUOUS_BATCHING: 1.3, OptimizationStrategy.PREFIX_CACHING: 1.1, } factor speedup_factors.get(strategy, 1.0) # 推理时间 token 处理时间 / 加速比 × 并发拥塞 base_decode_ms 25.0 # 每个 token 的基础解码时间 (ms) concurrency_penalty 1.0 (self._concurrent_requests - 1) * 0.15 # prompt 编码时间 (TTFT 的瓶颈) prompt_encode_ms request.prompt_tokens * 1.5 / factor # 生成输出 token 数 (允许早停) output_tokens min( request.max_output_tokens, random.randint( int(request.max_output_tokens * 0.5), request.max_output_tokens ) ) # 自回归解码时间 (TPOT 的瓶颈) decode_ms output_tokens * base_decode_ms / factor * concurrency_penalty ttft preprocess_ms prompt_encode_ms tpot decode_ms / output_tokens if output_tokens 0 else 0 total ttft decode_ms # GPU 显存估算 gpu_memory_mb ( request.prompt_tokens * 0.02 # 权重占用 output_tokens * 0.015 # KV Cache 占用 random.uniform(500, 2000) # 基础开销 ) # 模拟随机故障约 0.5% 概率用于测试错误处理 if random.random() 0.005: raise RuntimeError(模拟 GPU OOM 错误) return InferenceMetrics( request_idrequest_id, strategystrategy, ttft_msround(ttft, 2), tpot_msround(tpot, 2), total_latency_msround(total, 2), prompt_tokensrequest.prompt_tokens, output_tokensoutput_tokens, gpu_memory_used_mbround(gpu_memory_mb, 2), successTrue, ) except Exception as e: logger.error(f推理失败 [{request_id}]: {e}) return InferenceMetrics( request_idrequest_id, strategystrategy, ttft_ms0, tpot_ms0, total_latency_ms0, prompt_tokensrequest.prompt_tokens, output_tokens0, gpu_memory_used_mb0, successFalse, error_messagestr(e), ) finally: self._concurrent_requests - 1 class BenchmarkRunner: 基准测试执行器 按策略 × 流量模型 × 请求数量三维矩阵执行测试 生成可对比的实验报告。 def __init__(self, max_concurrency: int 8): self.engine MockInferenceEngine() # 使用信号量控制并发数避免模拟环境资源耗尽 self._semaphore asyncio.Semaphore(max_concurrency) self.max_concurrency max_concurrency async def _run_single( self, request: RequestProfile, strategy: OptimizationStrategy, ) - InferenceMetrics: 执行单次推理受信号量控制的并发安全包装 async with self._semaphore: return await self.engine.infer(request, strategy) async def run_benchmark( self, traffic_model: str, strategies: List[OptimizationStrategy], request_count: int 500, ) - Dict: 运行完整的基准测试 Args: traffic_model: 流量模式 (chat/rag/code) strategies: 要对比的优化策略列表 request_count: 每个策略的请求数量 Returns: 完整测试报告包含统计摘要和原始数据 generator RequestGenerator(modeltraffic_model) requests generator.generate_requests(request_count) results: Dict[str, List[InferenceMetrics]] {} for strategy in strategies: logger.info(f测试策略: {strategy.value}, 流量模式: {traffic_model}) # 创建并发任务 tasks [ self._run_single(req, strategy) for req in requests ] # 并发执行控制最大并发数 metrics_list await asyncio.gather(*tasks) results[strategy.value] list(metrics_list) # 统计成功率 success_count sum(1 for m in metrics_list if m.success) logger.info( f {strategy.value}: {success_count}/{request_count} 成功 f({success_count/request_count*100:.1f}%) ) return self._generate_report(results, traffic_model) def _generate_report( self, results: Dict[str, List[InferenceMetrics]], traffic_model: str, ) - Dict: 生成对比报告 报告包含以下维度的对比 1. 延迟分位值 (P50, P95, P99) 2. TTFT/TPOT 对比 3. 成功率 4. GPU 显存使用 report { traffic_model: traffic_model, timestamp: time.time(), summary: {}, } for strategy_name, metrics_list in results.items(): successful [m for m in metrics_list if m.success] if not successful: report[summary][strategy_name] {error: 所有请求均失败} continue # 提取延迟数据并排序 total_latencies sorted([m.total_latency_ms for m in successful]) ttft_latencies sorted([m.ttft_ms for m in successful]) tpot_values sorted([m.tpot_ms for m in successful]) gpu_memory [m.gpu_memory_used_mb for m in successful] def percentile(sorted_data, p): 计算分位值 if not sorted_data: return 0 idx int(len(sorted_data) * p / 100) idx min(idx, len(sorted_data) - 1) return sorted_data[idx] report[summary][strategy_name] { success_rate: round(len(successful) / len(metrics_list) * 100, 2), total_latency: { P50: round(percentile(total_latencies, 50), 1), P95: round(percentile(total_latencies, 95), 1), P99: round(percentile(total_latencies, 99), 1), avg: round(sum(total_latencies) / len(total_latencies), 1), max: round(total_latencies[-1], 1), }, ttft: { P50: round(percentile(ttft_latencies, 50), 1), P95: round(percentile(ttft_latencies, 95), 1), P99: round(percentile(ttft_latencies, 99), 1), }, tpot: { P50: round(percentile(tpot_values, 50), 1), P95: round(percentile(tpot_values, 95), 1), }, gpu_memory: { avg_mb: round(sum(gpu_memory) / len(gpu_memory), 1), max_mb: round(max(gpu_memory), 1), }, } # 计算相对加速比与基线对比 baseline report[summary].get(baseline, {}) if baseline and error not in baseline: for strategy_name in report[summary]: if strategy_name baseline: continue summary report[summary][strategy_name] if error in summary: continue baseline_p99 baseline[total_latency][P99] strategy_p99 summary[total_latency][P99] if baseline_p99 0: speedup baseline_p99 / strategy_p99 summary[speedup_vs_baseline] round(speedup, 2) return report # 使用示例 async def main(): 运行完整对比实验 runner BenchmarkRunner(max_concurrency8) strategies_to_test [ OptimizationStrategy.BASELINE, OptimizationStrategy.INT8_QUANT, OptimizationStrategy.SPECULATIVE_DECODE, ] # 测试对话场景 print( * 60) print(流量模型: chat (对话场景)) print( * 60) report await runner.run_benchmark( traffic_modelchat, strategiesstrategies_to_test, request_count300, ) print(\n对比报告:) print(json.dumps(report[summary], ensure_asciiFalse, indent2)) # 打印关键结论 print(\n 关键结论 ) for strategy, data in report[summary].items(): if error in data: continue p99 data[total_latency][P99] speedup data.get(speedup_vs_baseline, 1.0) print( f{strategy}: P99{p99}ms, fTTFT P99{data[ttft][P99]}ms, f加速比{speedup}x ) if __name__ __main__: try: asyncio.run(main()) except KeyboardInterrupt: logger.info(基准测试被用户中断) except Exception as e: logger.critical(f基准测试异常: {e})3.2 实验报告解读指南执行上述基准测试后关注三个关键信号第一P99 延迟是否在可接受范围内。对于对话式 AI 产品TTFT 的 P99 应控制在 3 秒以内总延迟的 P99 应控制在 10 秒以内。超过这个阈值用户会感知到明显的卡顿并可能放弃等待。第二不同策略的加速比是否与论文报告一致。如果论文声称 INT8 量化带来 1.5-2x 加速但你的实验只获得了 1.1x需要检查模型架构是否支持量化、是否有瓶颈在其他环节如网络 I/O 或 CPU 预处理。第三不同流量模式下不同策略的效果差异。前缀缓存在 RAG 场景中效果显著因为多个请求共享相同的 prompt 前缀但在对话场景中收益有限每个用户的会话上下文不同。四、实验结果的欺骗性——避免自欺欺人的数字4.1 基准测试常见的自欺行为使用理想化输入。用固定 128 个 token 长度的 prompt 和 64 个 token 的目标输出做基准测试然后声称推理延迟 200ms。但真实用户的 prompt 长度可能是 2000 token输出可能是 500 token。必须使用真实流量分布进行测试。忽略首次推理的冷启动。在模型已经预热、KV Cache 已经初始化的状态下跑测试记录下来的延迟不包括模型加载和预热时间。必须单独测试冷启动延迟。无视并发竞争。单请求串行测试得到的延迟与 50 个并发请求下的延迟不是线性的。GPU 显存带宽和 SMs 的竞争会导致显著的性能退化。必须在多并发条件下测试。4.2 优化策略的选择权衡优化策略加速效果质量损失实施复杂度适用场景INT8 量化1.3-1.8x1-3% 精度损失低框架原生支持通用场景首选INT4 量化2-3x3-8% 精度损失低对精度不敏感的任务推测解码1.5-2.5x无高需单独训练草稿模型高吞吐场景KV Cache 量化1.2-1.5x忽略不计低长上下文场景前缀缓存取决于前缀命中率无中RAG、Few-shot4.3 不要优化的场景某些场景下延迟优化不是最高优先级的问题。如果用户本身期望的等待时间在 10 秒以上如长篇报告生成将优化资源投入到吞吐量提升批处理而非延迟降低ROI 更高。同样如果模型质量未达标优先提升模型的回答质量而不是让一个回答得很快但质量差的模型变得更快。五、总结从论文指标到生产环境的表现LLM 推理延迟的优化需要系统化的实验方法论。核心结论可以归纳为三个要点。第一分解延迟分别优化。TTFT 的瓶颈在 prompt 编码TPOT 的瓶颈在自回归解码。两者使用完全不同的优化策略不可混为一谈。第二用真实流量做基准测试。使用单一长度的理想化输入得到的延迟数据几乎没有参考价值。必须模拟生产流量分布长短 prompt 混合、并发竞争、不同业务场景才能获得可指导决策的实验结论。第三量化对比数据驱动选型。每种优化策略都有其加速效果、质量损失、实施复杂度的权衡。通过基准测试框架产出量化的对比报告基于数据而非直觉做出技术选型决策。基准测试框架应作为 CI/CD 流水线的一部分持续运行确保每次模型或框架升级后延迟指标不会意外退化。

相关新闻

STM32与MAX77654电源管理实战:低功耗设计要点

STM32与MAX77654电源管理实战:低功耗设计要点

1. 项目背景与核心需求在嵌入式系统设计中,电源管理始终是决定产品可靠性和续航能力的关键因素。我最近为一个工业物联网终端设备设计的电源系统,需要同时满足以下严苛要求:主控采用STM32L151ZD低功耗MCU外围传感器包含3.3V和5V两种供电需求系…

2026/7/10 6:33:53 阅读更多 →
Python 3.12 内置异常深度解析:从FileNotFoundError到OSError的10+子类实战

Python 3.12 内置异常深度解析:从FileNotFoundError到OSError的10+子类实战

Python 3.12 文件操作异常全指南:从基础捕获到精准处理1. Python异常处理的核心逻辑Python的异常处理机制远不止简单的try-except块。理解异常处理的完整逻辑流程,才能真正写出健壮的代码。当异常发生时,Python解释器会按照以下顺序处理&…

2026/7/10 6:33:53 阅读更多 →
Unity URP-PSX插件:用现代管线精准复刻PS1复古图形风格

Unity URP-PSX插件:用现代管线精准复刻PS1复古图形风格

1. 项目概述:当现代管线邂逅复古灵魂最近在独立游戏开发圈里,复古风潮又刮回来了,而且这次刮得有点“硬核”。大家不再满足于简单的像素风滤镜,而是开始追求那种90年代末期PlayStation 1(PSX)游戏特有的、带…

2026/7/10 6:31:52 阅读更多 →

最新新闻

N沟道与P沟道MOSFET对比:5个关键参数选型指南与电路实例

N沟道与P沟道MOSFET对比:5个关键参数选型指南与电路实例

N沟道与P沟道MOSFET对比:5个关键参数选型指南与电路实例在电力电子和开关电路设计中,MOSFET的选择往往决定了整个系统的效率和可靠性。面对市面上琳琅满目的N沟道和P沟道MOSFET,工程师该如何做出明智的选择?本文将深入剖析两种类型…

2026/7/10 7:12:06 阅读更多 →
2026年工业船型开关网上采购,认准这些靠谱厂家

2026年工业船型开关网上采购,认准这些靠谱厂家

在2026年,随着工业自动化、智能家居和消费电子市场的持续扩张,船型开关作为控制组件中的核心部件,其采购需求呈现出爆发式增长。但网上采购环境鱼龙混杂,不少采购经理因为选错供应商导致项目延期、甚至产品召回。如何在海量供应商…

2026/7/10 7:10:06 阅读更多 →
在信创环境下,哪款国产Agent的兼容性最好?——2026主流企业级Agent生态适配与架构路径深度拆解

在信创环境下,哪款国产Agent的兼容性最好?——2026主流企业级Agent生态适配与架构路径深度拆解

随着信创(信息技术应用创新)产业步入深水区,企业对AI Agent的选型标准已从单纯的“大模型参数比拼”转向“生产级落地兼容性”的综合考量。在国产芯片、操作系统、数据库构成的异构生态下,Agent能否实现任务闭环,不仅取…

2026/7/10 7:08:03 阅读更多 →
压电报警器驱动设计与环境适应性优化

压电报警器驱动设计与环境适应性优化

1. 压电报警器选型与核心参数解析在工业控制、安防系统和智能家居领域,清晰可辨的警报声是保障安全的第一道防线。EPT-14A4005P压电陶瓷换能器与MKV42F64VLH16微控制器的组合,为各类环境提供了可靠的声学报警解决方案。这套方案特别适用于需要高频、高响…

2026/7/10 7:06:02 阅读更多 →
require 和 import的区别

require 和 import的区别

特性requireimport规范CommonJS 规范,Node.js 原生标准;浏览器原生不支持,打包工具(webpack/vite)兼容。ES Module(ESM),ES6 官方标准,浏览器、Node、Vite/Webpack 全部原…

2026/7/10 7:06:02 阅读更多 →
TB67H480FNG与PIC18F85J50电机控制方案详解

TB67H480FNG与PIC18F85J50电机控制方案详解

1. 为什么选择TB67H480FNG与PIC18F85J50组合在电机控制领域,选择合适的驱动芯片和微控制器是项目成功的关键。TB67H480FNG是东芝半导体推出的一款双通道有刷直流电机驱动IC,而PIC18F85J50则是Microchip公司生产的高性能8位微控制器。这对组合在工业自动化…

2026/7/10 7:04:01 阅读更多 →

日新闻

STM32与LTC1864高精度ADC的SPI通信实现

STM32与LTC1864高精度ADC的SPI通信实现

1. 项目背景与核心需求在工业控制和嵌入式系统开发中,模拟信号与数字系统的无缝集成一直是工程师面临的关键挑战。LTC1864作为一款16位高精度ADC转换器,配合STM32F101ZG这类主流微控制器,能够构建高性能的模拟信号采集系统。这种组合特别适合…

2026/7/10 0:03:07 阅读更多 →
猫抓插件:浏览器资源嗅探与视频下载的终极解决方案

猫抓插件:浏览器资源嗅探与视频下载的终极解决方案

猫抓插件:浏览器资源嗅探与视频下载的终极解决方案 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 还在为网页视频无法下载而烦恼吗&am…

2026/7/10 0:05:09 阅读更多 →
直流有刷电机驱动方案:TC78H653FTG与MKV46F256VLH16应用

直流有刷电机驱动方案:TC78H653FTG与MKV46F256VLH16应用

1. 直流有刷电机驱动方案概述在工业自动化和消费电子领域,直流有刷电机因其结构简单、控制方便、成本低廉等优势,仍然是许多应用场景的首选驱动方案。TC78H653FTG作为东芝推出的新一代H桥驱动器,与MKV46F256VLH16微控制器配合使用&#xff0c…

2026/7/10 0:05:09 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/8 16:14:06 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/9 13:46:46 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/9 21:41:05 阅读更多 →

月新闻