跳到主要内容
大模型工程化与传统 AI 工程的核心差异解析 | 极客日志
Python AI 算法
大模型工程化与传统 AI 工程的核心差异解析 大模型工程化与传统 AI 工程的核心差异解析 !在这里插入图片描述 > **学习目标**:是基础入门部分,帮助读者建立大模型工程化的初步认知。通过学习,你将全面掌握'大模型工程化与传统 AI 工程:核心差异解析'这一核心主题。 --- 一、引言:为什么这个话题如此重要 在大模型技术快速发展的今天,大模型工程化与传统 AI 工程的核心差异解析已经成为每个 AI 工程师必须掌握的核心技能。…
星云 发布于 2026/4/6 更新于 2026/5/23 97K 浏览大模型工程化与传统 AI 工程的核心差异解析
本文学习目标 :本文是基础入门部分,帮助读者建立大模型工程化的初步认知。通过本文学习,你将全面掌握'大模型工程化与传统 AI 工程:核心差异解析'这一核心主题。
一、引言:为什么这个话题如此重要
在大模型技术快速发展的今天,大模型工程化与传统 AI 工程的核心差异解析已经成为每个 AI 工程师必须掌握的核心技能。大模型的工程化落地不仅需要理解模型原理,更需要掌握系统化的部署、优化和运维能力。
1.1 背景与意义
💡 核心认知 :大模型工程化是将研究模型转化为生产级服务的关键环节。一个优秀的模型如果缺乏良好的工程化支持,将难以在实际场景中发挥价值。
从 GPT-3 到 GPT-4,从 LLaMA 到 Qwen,大模型参数量从数十亿增长到数千亿。这种规模的增长带来了巨大的工程挑战:如何高效部署?如何优化推理速度?如何控制成本?这些问题都需要系统化的工程化能力来解决。
1.2 本文结构概览
为了帮助读者系统性地掌握本文内容,我将从以下几个维度展开:
📊 概念解析 → 技术原理 → 实现方法 → 实践案例 → 最佳实践 → 总结展望
二、核心概念解析
2.1 基本定义
让我们首先明确几个核心概念:
概念一:基础定义
大模型工程化与传统 AI 工程的核心差异解析是大模型工程化领域的核心主题,涉及模型部署、性能优化、系统架构等关键环节。
概念二:技术内涵
从技术角度看,这一概念包含以下几个层面:
维度 说明 重要程度 理论基础 算法原理与系统设计 ⭐⭐⭐⭐⭐ 工程实现 代码开发与系统集成 ⭐⭐⭐⭐⭐ 性能优化 效率提升与资源管理 ⭐⭐⭐⭐⭐ 运维保障 监控告警与故障处理 ⭐⭐⭐⭐
2.2 关键术语解释
⚠️ 注意 :以下术语是理解本文内容的基础,请务必掌握。
术语 1:核心概念
这是理解大模型工程化与传统 AI 工程核心差异的关键。在大模型工程化中,我们需要深入理解其背后的技术原理和实现细节。
术语 2:性能指标
在评估相关技术时,我们通常关注以下指标:
推理延迟 :单次请求的响应时间
吞吐量 :单位时间内处理的请求数
显存占用 :模型运行所需的 GPU 显存
资源利用率 :计算资源的有效使用程度
2.3 技术架构概览
💡 架构理解 :
┌─────────────────────────────────────────┐
│ 应用层 (Application) │
│ API 网关 / 负载均衡 / 限流熔断 │
├─────────────────────────────────────────┤
│ 服务层 (Service) │
│ 模型服务 / 推理引擎 / 批处理调度 │
├─────────────────────────────────────────┤
│ 引擎层 (Engine) │
│ TensorRT / ONNX Runtime / vLLM / DeepSpeed│
├─────────────────────────────────────────┤
│ 模型层 (Model) │
│ 量化模型 / 优化模型 / 原始模型 │
├─────────────────────────────────────────┤
│ 基础设施层 (Infrastructure) │
│ GPU 集群 / 容器编排 / 监控告警 │
└─────────────────────────────────────────┘
三、技术原理深入
3.1 核心技术原理 大模型工程化与传统 AI 工程的核心差异解析的核心实现涉及以下关键技术:
""" 大模型工程化核心代码示例 """
import torch
import torch.nn as nn
from transformers import AutoModelForCausalLM, AutoTokenizer
from typing import Optional , List , Dict , Any
import time
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class LLMEngine :
""" 大模型推理引擎基础类
提供模型加载、推理、优化等核心功能
"""
def __init__ (self, model_name: str , device: str = "cuda" , precision: str = "fp16" ):
""" 初始化推理引擎
Args:
model_name: 模型名称或路径
device: 运行设备
precision: 精度类型 (fp32/fp16/bf16)
"""
self .model_name = model_name
self .device = device
self .precision = precision
self .model = None
self .tokenizer = None
self ._load_model()
def _load_model (self ):
"""加载模型和分词器"""
logger.info(f"正在加载模型:{self.model_name} " )
self .tokenizer = AutoTokenizer.from_pretrained(
self .model_name, trust_remote_code=True
)
torch_dtype = {
"fp32" : torch.float32,
"fp16" : torch.float16,
"bf16" : torch.bfloat16
}.get(self .precision, torch.float16)
self .model = AutoModelForCausalLM.from_pretrained(
self .model_name,
torch_dtype=torch_dtype,
device_map="auto" ,
trust_remote_code=True
)
self .model.eval ()
logger.info("模型加载完成" )
def generate (self, prompt: str , max_new_tokens: int = 512 , temperature: float = 0.7 , top_p: float = 0.9 , **kwargs ) -> str :
""" 生成文本
Args:
prompt: 输入提示词
max_new_tokens: 最大生成 token 数
temperature: 温度参数
top_p: nucleus 采样参数
Returns:
生成的文本
"""
inputs = self .tokenizer(prompt, return_tensors="pt" )
inputs = {k: v.to(self .device) for k, v in inputs.items()}
with torch.no_grad():
outputs = self .model.generate(
**inputs,
max_new_tokens=max_new_tokens,
temperature=temperature,
top_p=top_p,
do_sample=True ,
pad_token_id=self .tokenizer.eos_token_id,
**kwargs
)
generated_text = self .tokenizer.decode(outputs[0 ], skip_special_tokens=True )
return generated_text
def benchmark (self, prompt: str = "你好" , num_runs: int = 10 ) -> Dict [str , float ]:
""" 性能基准测试
Args:
prompt: 测试提示词
num_runs: 运行次数
Returns:
性能指标字典
"""
latencies = []
for i in range (num_runs):
start_time = time.time()
_ = self .generate(prompt, max_new_tokens=50 )
end_time = time.time()
latencies.append(end_time - start_time)
return {
"avg_latency" : sum (latencies) / len (latencies),
"min_latency" : min (latencies),
"max_latency" : max (latencies),
"p50" : sorted (latencies)[len (latencies) // 2 ],
"p99" : sorted (latencies)[int (len (latencies) * 0.99 )]
}
def get_memory_usage (self ) -> Dict [str , float ]:
"""获取显存使用情况"""
if torch.cuda.is_available():
allocated = torch.cuda.memory_allocated() / 1024 ** 3
reserved = torch.cuda.memory_reserved() / 1024 ** 3
return {
"allocated_gb" : round (allocated, 2 ),
"reserved_gb" : round (reserved, 2 )
}
return {}
class OptimizedLLMEngine (LLMEngine ):
""" 优化后的大模型推理引擎
包含量化、缓存等优化技术
"""
def __init__ (self, model_name: str , device: str = "cuda" , precision: str = "fp16" , enable_kv_cache: bool = True ):
""" 初始化优化引擎
Args:
model_name: 模型名称
device: 运行设备
precision: 精度类型
enable_kv_cache: 是否启用 KV 缓存
"""
self .enable_kv_cache = enable_kv_cache
self .kv_cache = {}
super ().__init__(model_name, device, precision)
def generate_with_cache (self, prompt: str , session_id: Optional [str ] = None , **kwargs ) -> str :
""" 带缓存的生成
Args:
prompt: 输入提示词
session_id: 会话 ID,用于缓存管理
Returns:
生成的文本
"""
if session_id and session_id in self .kv_cache:
past_key_values = self .kv_cache[session_id]
else :
past_key_values = None
inputs = self .tokenizer(prompt, return_tensors="pt" )
inputs = {k: v.to(self .device) for k, v in inputs.items()}
with torch.no_grad():
outputs = self .model.generate(
**inputs,
past_key_values=past_key_values,
use_cache=self .enable_kv_cache,
**kwargs
)
if session_id and self .enable_kv_cache:
self .kv_cache[session_id] = outputs.past_key_values
return self .tokenizer.decode(outputs[0 ], skip_special_tokens=True )
def clear_cache (self, session_id: Optional [str ] = None ):
"""清除缓存"""
if session_id:
self .kv_cache.pop(session_id, None )
else :
self .kv_cache.clear()
if __name__ == "__main__" :
engine = LLMEngine(
model_name="Qwen/Qwen2-1.5B" ,
device="cuda" ,
precision="fp16"
)
response = engine.generate("请介绍一下大模型工程化" )
print (f"生成结果:{response} " )
metrics = engine.benchmark()
print (f"性能指标:{metrics} " )
memory = engine.get_memory_usage()
print (f"显存使用:{memory} " )
""" 大模型量化优化实现
支持 INT8/INT4 量化
"""
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from typing import Optional
import bitsandbytes as bnb
class QuantizedLLMEngine :
""" 量化大模型引擎
支持 INT8 和 INT4 量化,大幅降低显存占用
"""
def __init__ (self, model_name: str , quantization: str = "int8" , device_map: str = "auto" ):
""" 初始化量化引擎
Args:
model_name: 模型名称
quantization: 量化类型 (int8/int4/fp4/nf4)
device_map: 设备映射策略
"""
self .model_name = model_name
self .quantization = quantization
quantization_config = self ._get_quantization_config()
self .model = AutoModelForCausalLM.from_pretrained(
model_name,
quantization_config=quantization_config,
device_map=device_map,
trust_remote_code=True
)
self .tokenizer = AutoTokenizer.from_pretrained(model_name)
def _get_quantization_config (self ):
"""获取量化配置"""
from transformers import BitsAndBytesConfig
if self .quantization == "int8" :
return BitsAndBytesConfig(
load_in_8bit=True ,
llm_int8_threshold=6.0
)
elif self .quantization == "int4" :
return BitsAndBytesConfig(
load_in_4bit=True ,
bnb_4bit_compute_dtype=torch.float16,
bnb_4bit_use_double_quant=True ,
bnb_4bit_quant_type="nf4"
)
else :
return None
def generate (self, prompt: str , **kwargs ) -> str :
"""生成文本"""
inputs = self .tokenizer(prompt, return_tensors="pt" )
inputs = {k: v.cuda() for k, v in inputs.items()}
with torch.no_grad():
outputs = self .model.generate(**inputs, **kwargs)
return self .tokenizer.decode(outputs[0 ], skip_special_tokens=True )
def get_model_size (self ) -> Dict [str , float ]:
"""获取模型大小信息"""
param_count = sum (p.numel() for p in self .model.parameters())
if self .quantization == "int4" :
size_gb = param_count * 0.5 / 1024 ** 3
elif self .quantization == "int8" :
size_gb = param_count * 1.0 / 1024 ** 3
else :
size_gb = param_count * 2.0 / 1024 ** 3
return {
"param_count_billion" : round (param_count / 1e9 , 2 ),
"estimated_size_gb" : round (size_gb, 2 )
}
if __name__ == "__main__" :
engine_int8 = QuantizedLLMEngine(
model_name="Qwen/Qwen2-7B" ,
quantization="int8"
)
print (f"INT8 模型大小:{engine_int8.get_model_size()} " )
engine_int4 = QuantizedLLMEngine(
model_name="Qwen/Qwen2-7B" ,
quantization="int4"
)
print (f"INT4 模型大小:{engine_int4.get_model_size()} " )
3.2 推理优化技术 """ 大模型推理优化技术
包含批处理、并行等优化
"""
import torch
from typing import List , Optional
from dataclasses import dataclass
from queue import Queue
import threading
import time
@dataclass
class Request :
"""推理请求"""
request_id: str
prompt: str
max_tokens: int = 100
timestamp: float = time.time()
class DynamicBatcher :
""" 动态批处理器
自动将多个请求合并处理,提升吞吐量
"""
def __init__ (self, model, tokenizer, max_batch_size: int = 32 , max_wait_time: float = 0.1 ):
""" 初始化批处理器
Args:
model: 模型实例
tokenizer: 分词器
max_batch_size: 最大批量大小
max_wait_time: 最大等待时间
"""
self .model = model
self .tokenizer = tokenizer
self .max_batch_size = max_batch_size
self .max_wait_time = max_wait_time
self .request_queue = Queue()
self .results = {}
self .running = True
self .process_thread = threading.Thread(target=self ._process_loop)
self .process_thread.start()
def _process_loop (self ):
"""批处理循环"""
while self .running:
batch = []
start_time = time.time()
while len (batch) < self .max_batch_size:
if time.time() - start_time > self .max_wait_time:
break
try :
request = self .request_queue.get(timeout=0.01 )
batch.append(request)
except :
continue
if not batch:
continue
self ._process_batch(batch)
def _process_batch (self, batch: List [Request] ):
"""处理批量请求"""
prompts = [r.prompt for r in batch]
inputs = self .tokenizer(prompts, padding=True , return_tensors="pt" ).to(self .model.device)
with torch.no_grad():
outputs = self .model.generate(**inputs, max_new_tokens=max (r.max_tokens for r in batch))
for i, request in enumerate (batch):
result = self .tokenizer.decode(outputs[i], skip_special_tokens=True )
self .results[request.request_id] = result
def submit (self, request: Request ):
"""提交请求"""
self .request_queue.put(request)
def get_result (self, request_id: str , timeout: float = 30 ) -> Optional [str ]:
"""获取结果"""
start_time = time.time()
while time.time() - start_time < timeout:
if request_id in self .results:
return self .results.pop(request_id)
time.sleep(0.01 )
return None
class ModelParallel :
""" 模型并行推理
将大模型分割到多个 GPU 上运行
"""
def __init__ (self, model_name: str , num_gpus: int = 2 ):
""" 初始化模型并行
Args:
model_name: 模型名称
num_gpus: GPU 数量
"""
self .num_gpus = num_gpus
self .device_map = self ._create_device_map()
self .model = AutoModelForCausalLM.from_pretrained(
model_name,
device_map=self .device_map,
trust_remote_code=True
)
def _create_device_map (self ) -> Dict :
"""创建设备映射"""
return "auto"
def generate (self, prompt: str , **kwargs ) -> str :
"""生成文本"""
inputs = self .tokenizer(prompt, return_tensors="pt" )
inputs = {k: v.to("cuda:0" ) for k, v in inputs.items()}
with torch.no_grad():
outputs = self .model.generate(**inputs, **kwargs)
return self .tokenizer.decode(outputs[0 ], skip_special_tokens=True )
3.3 性能监控实现 """ 大模型性能监控系统 """
import time
import psutil
import torch
from dataclasses import dataclass, field
from typing import Dict , List
import json
from datetime import datetime
@dataclass
class PerformanceMetrics :
"""性能指标"""
timestamp: str
latency_ms: float
throughput_qps: float
gpu_memory_used_gb: float
gpu_memory_total_gb: float
gpu_utilization: float
cpu_utilization: float
request_count: int
def to_dict (self ) -> Dict :
return {
"timestamp" : self .timestamp,
"latency_ms" : self .latency_ms,
"throughput_qps" : self .throughput_qps,
"gpu_memory_used_gb" : self .gpu_memory_used_gb,
"gpu_memory_total_gb" : self .gpu_memory_total_gb,
"gpu_utilization" : self .gpu_utilization,
"cpu_utilization" : self .cpu_utilization,
"request_count" : self .request_count
}
class LLMPerformanceMonitor :
""" 大模型性能监控器
实时监控推理性能和资源使用
"""
def __init__ (self, collection_interval: float = 1.0 ):
""" 初始化监控器
Args:
collection_interval: 采集间隔(秒)
"""
self .collection_interval = collection_interval
self .metrics_history: List [PerformanceMetrics] = []
self .request_times: List [float ] = []
self .request_count = 0
self .running = False
def start (self ):
"""启动监控"""
self .running = True
def stop (self ):
"""停止监控"""
self .running = False
def record_request (self, latency: float ):
"""记录请求"""
self .request_times.append(latency)
self .request_count += 1
def collect_metrics (self ) -> PerformanceMetrics:
"""采集性能指标"""
if torch.cuda.is_available():
gpu_memory_used = torch.cuda.memory_allocated() / 1024 ** 3
gpu_memory_total = torch.cuda.get_device_properties(0 ).total_memory / 1024 ** 3
gpu_utilization = 0.0
else :
gpu_memory_used = 0
gpu_memory_total = 0
gpu_utilization = 0
cpu_utilization = psutil.cpu_percent()
if len (self .request_times) > 0 :
recent_requests = [t for t in self .request_times if time.time() - t < 60 ]
throughput = len (recent_requests) / 60.0
else :
throughput = 0
if self .request_times:
avg_latency = sum (self .request_times[-100 :]) / len (self .request_times[-100 :]) * 1000
else :
avg_latency = 0
metrics = PerformanceMetrics(
timestamp=datetime.now().isoformat(),
latency_ms=avg_latency,
throughput_qps=throughput,
gpu_memory_used_gb=gpu_memory_used,
gpu_memory_total_gb=gpu_memory_total,
gpu_utilization=gpu_utilization,
cpu_utilization=cpu_utilization,
request_count=self .request_count
)
self .metrics_history.append(metrics)
return metrics
def get_summary (self ) -> Dict :
"""获取性能摘要"""
if not self .metrics_history:
return {}
recent = self .metrics_history[-100 :]
return {
"avg_latency_ms" : sum (m.latency_ms for m in recent) / len (recent),
"max_latency_ms" : max (m.latency_ms for m in recent),
"min_latency_ms" : min (m.latency_ms for m in recent),
"avg_throughput_qps" : sum (m.throughput_qps for m in recent) / len (recent),
"avg_gpu_memory_gb" : sum (m.gpu_memory_used_gb for m in recent) / len (recent),
"total_requests" : self .request_count
}
def export_metrics (self, filepath: str ):
"""导出指标"""
data = [m.to_dict() for m in self .metrics_history]
with open (filepath, 'w' ) as f:
json.dump(data, f, indent=2 )
if __name__ == "__main__" :
monitor = LLMPerformanceMonitor()
monitor.start()
for i in range (100 ):
monitor.record_request(time.time())
metrics = monitor.collect_metrics()
print (f"指标:{metrics.to_dict()} " )
time.sleep(0.1 )
print (f"性能摘要:{monitor.get_summary()} " )
四、实践应用指南
4.1 应用场景分析 """ 在线推理服务实现 FastAPI + 大模型 """
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import Optional
import uvicorn
import asyncio
from concurrent.futures import ThreadPoolExecutor
app = FastAPI(title="LLM Inference API" )
class GenerateRequest (BaseModel ):
prompt: str
max_tokens: int = 512
temperature: float = 0.7
top_p: float = 0.9
class GenerateResponse (BaseModel ):
text: str
latency_ms: float
tokens_generated: int
engine = None
executor = ThreadPoolExecutor(max_workers=4 )
@app.on_event("startup" )
async def startup ():
"""启动时加载模型"""
global engine
engine = LLMEngine(
model_name="Qwen/Qwen2-1.5B" ,
precision="fp16"
)
@app.post("/generate" , response_model=GenerateResponse )
async def generate (request: GenerateRequest ):
"""生成接口"""
import time
start = time.time()
loop = asyncio.get_event_loop()
result = await loop.run_in_executor(
executor, engine.generate, request.prompt, request.max_tokens, request.temperature, request.top_p
)
latency = (time.time() - start) * 1000
return GenerateResponse(
text=result,
latency_ms=latency,
tokens_generated=len (result.split())
)
@app.get("/health" )
async def health ():
"""健康检查"""
return {"status" : "healthy" }
@app.get("/metrics" )
async def metrics ():
"""性能指标"""
return engine.get_memory_usage()
if __name__ == "__main__" :
uvicorn.run(app, host="0.0.0.0" , port=8000 )
应用领域 具体用途 优化重点 数据处理 批量文本生成 吞吐量优化 模型评估 大规模测试 并行处理 数据增强 合成数据生成 成本控制
4.2 实施步骤详解
pip install torch transformers accelerate
pip install bitsandbytes
pip install tensorrt
pip install onnx onnxruntime
python -c "import torch; print(torch.cuda.is_available())"
阶段 任务 输出 模型准备 下载、转换、量化 可部署模型 服务搭建 API 开发、负载均衡 推理服务 监控配置 日志、告警、仪表盘 监控系统 性能测试 压测、调优 性能报告
4.3 最佳实践分享
使用混合精度训练
启用梯度检查点
采用模型量化
优化批处理策略
使用 TensorRT/ONNX Runtime
实现动态批处理
启用 KV 缓存
模型并行部署
五、案例分析
5.1 成功案例 某公司的大模型推理服务响应慢、成本高,需要进行工程化优化。
class OptimizedService :
"""优化后的服务"""
def __init__ (self ):
self .model = QuantizedLLMEngine(
model_name="model" ,
quantization="int4"
)
self .batcher = DynamicBatcher(
self .model,
max_batch_size=16
)
self .monitor = LLMPerformanceMonitor()
def serve (self, request ):
"""服务请求"""
self .monitor.record_request(time.time())
return self .batcher.submit(request)
指标 优化前 优化后 提升幅度 推理延迟 500ms 150ms 70% 显存占用 28GB 8GB 71% 吞吐量 10 QPS 50 QPS 400% 成本 10000/月 3000/月 70%
5.2 失败教训
INT4 量化精度损失严重
模型剪枝过度
输出质量下降
优化前评估精度影响
设置合理的精度阈值
进行充分的测试验证
六、常见问题解答
6.1 技术问题 场景 推荐方案 精度损失 高精度要求 FP16 无 平衡方案 INT8 <1% 显存受限 INT4 1-3%
def optimize_memory ():
torch.cuda.empty_cache()
model.gradient_checkpointing_enable()
model = model.half()
model = AutoModelForCausalLM.from_pretrained(
model_name,
device_map="auto"
)
6.2 应用问题
使用 TensorRT 加速
启用 KV 缓存
实现批处理
模型量化
实现健康检查
配置自动扩缩容
设置请求超时
实现熔断降级
七、未来发展趋势
7.1 技术趋势 趋势 描述 预计时间 端侧部署 手机运行大模型 1-2 年 推理加速 专用 AI 芯片 持续推进 自动优化 AutoML for LLM 快速发展 多模态 统一推理引擎 主流趋势
7.2 应用趋势 未来 3-5 年,大模型工程化将在以下领域产生深远影响:
企业服务 :智能客服、知识管理
内容创作 :辅助写作、设计
科学研究 :文献分析、实验设计
教育培训 :个性化学习
7.3 职业发展 阶段 学习重点 时间投入 入门期 基础概念、工具使用 2-3 个月 进阶期 性能优化、架构设计 3-6 个月 专业期 大规模系统、创新优化 6-12 个月 专家期 架构创新、团队领导 1 年以上
八、本文小结
8.1 核心要点回顾
概念理解 :明确了大模型工程化的基本定义和核心概念
技术原理 :深入探讨了实现方法和核心技术
代码实现 :提供了完整的 Python 代码示例
实践应用 :分享了实战案例和最佳实践
问题解答 :解答了常见的技术和应用问题
趋势展望 :分析了未来发展方向
8.2 学习建议
理论与实践结合:在理解原理的基础上,动手实现
循序渐进:从简单优化开始,逐步深入
持续学习:技术发展迅速,保持学习热情
交流分享:加入社区,与同行交流
九、参考资料
9.1 推荐阅读
《大语言模型应用开发》
《深度学习系统设计》
《高性能机器学习》
9.2 在线资源
Hugging Face 课程
NVIDIA 深度学习学院
Fast.ai 课程
9.3 社区交流
GitHub 开源社区
Stack Overflow
知乎 AI 话题
微信技术群
📖 本文系统讲解了'大模型工程化与传统 AI 工程的核心差异解析',希望读者能够学以致用,在实践中不断深化理解。
相关免费在线工具 加密/解密文本 使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
RSA密钥对生成器 生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
Mermaid 预览与可视化编辑 基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
随机西班牙地址生成器 随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online
Gemini 图片去水印 基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online
curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online