当前位置: 首页 > article >正文

从理论到实践:百川2-13B模型权重加载与推理过程代码解读

从理论到实践百川2-13B模型权重加载与推理过程代码解读你是不是也遇到过这种情况好不容易找到一个开源大模型比如百川2-13B兴冲冲地下载下来结果面对那一堆模型权重文件和复杂的代码瞬间就懵了不知道怎么把它加载到内存里更不清楚输入一句话后模型内部到底是怎么一步步算出答案的。今天咱们就来把这个黑盒子彻底拆开看看。我不讲那些空洞的理论就带着你一行行地读代码看看怎么用Hugging Face Transformers这个“瑞士军刀”库把百川2-13B的模型权重特别是现在流行的4bits量化版本给加载起来然后一步步跟踪看它怎么完成一次完整的推理。搞懂了这个你再想自己改模型结构、加新功能或者只是单纯想调试为什么输出不对心里就有底了。1. 环境准备与模型权重的“打开方式”工欲善其事必先利其器。在开始“解剖”模型之前咱们得先把手术台搭好。1.1 核心工具安装这里没太多花样主要就是Hugging Face的生态工具。建议你创建一个新的虚拟环境避免包版本冲突。pip install transformers torch accelerate bitsandbytes简单解释一下这几个包transformers: 今天的主角加载模型和分词器的核心库。torch: PyTorch深度学习框架模型运行的基石。accelerate: Hugging Face出的一个工具能简化混合精度训练、多GPU并行这些操作让代码更干净。bitsandbytes: 实现模型量化比如4bits、8bits的关键库。我们要加载4bits的模型全靠它。1.2 获取模型权重从Hugging Face Hub开始现在很少有人真的去手动下载几十GB的原始权重文件了。Hugging Face Hub就像一个模型“应用商店”我们直接用代码从上面拉取。百川2-13B的官方模型页面在Hub上。加载一个模型你需要知道它的model_id通常就是组织名加模型名比如baichuan-inc/Baichuan2-13B-Chat。这里有个关键选择你是加载原始的全精度FP16/BF16模型还是加载量化后的版本对于13B这种规模的模型全精度加载需要超过26GB的GPU显存这对大多数消费级显卡来说是难以承受的。因此4bits量化几乎是个人开发者本地运行的唯一选择。它能将显存占用降到7GB左右代价是精度有轻微损失。准备好了吗我们接下来就要用代码去“敲门”让这个庞大的模型在咱们的电脑上安家了。2. 核心步骤一加载4bits量化模型权重理论说再多不如一行代码。我们直接来看怎么把那个巨大的4bits量化模型权重加载到GPU里。2.1 初始化模型与分词器加载过程其实就集中在几行配置里。transformers库的设计很棒大部分复杂工作都隐藏在了简单的API后面。from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig import torch # 1. 定义模型ID这里以Chat版本为例 model_id baichuan-inc/Baichuan2-13B-Chat # 2. 配置4bits量化加载参数 quantization_config BitsAndBytesConfig( load_in_4bitTrue, # 核心启用4bits加载 bnb_4bit_compute_dtypetorch.float16, # 计算时使用float16兼顾速度和精度 bnb_4bit_use_double_quantTrue, # 使用双重量化进一步压缩 bnb_4bit_quant_typenf4, # 量化类型NF4是当前效果较好的选择 ) # 3. 加载分词器 tokenizer AutoTokenizer.from_pretrained(model_id, trust_remote_codeTrue) # 百川模型可能需要设置padding_side取决于你的使用场景 tokenizer.padding_side left # 4. 加载4bits量化模型 model AutoModelForCausalLM.from_pretrained( model_id, quantization_configquantization_config, # 传入量化配置 device_mapauto, # 自动分配模型层到可用GPU/CPU trust_remote_codeTrue, # 信任并运行模型自带的定制代码 torch_dtypetorch.float16, # 模型内部统一用float16 )运行上面这段代码你会看到控制台开始输出加载信息。device_map”auto”这个参数特别有用如果你有多块GPU或者GPU显存不够它会自动把模型的不同层分配到不同的设备上甚至把不常用的层放到CPU内存里用的时候再换入GPUoffload。这里发生了什么当from_pretrained被调用时transformers库会根据model_id从Hub下载模型配置文件config.json和分词器文件。读取配置文件创建对应的模型结构百川2-13B的Transformer层、注意力头数等。开始下载巨大的模型权重文件.safetensors或.bin文件。对于4bits量化版本Hub上存储的已经是量化后的权重。bitsandbytes库介入将这些4bits的权重加载到GPU显存中并在运行时动态地反量化为bnb_4bit_compute_dtype指定的精度这里是我们设的float16进行计算。2.2 理解量化配置你可能对BitsAndBytesConfig里的参数感到好奇我简单说说load_in_4bitTrue: 这是总开关。bnb_4bit_compute_dtype: 权重在参与矩阵乘法等计算前会被临时反量化到这个精度。float16是平衡速度和精度的好选择。bnb_4bit_use_double_quant: 对第一次量化产生的常量再进行一次量化能省更多空间。bnb_4bit_quant_type: “nf4”是一种信息损失更小的4bits量化方法效果通常比标准的“fp4”要好。模型加载成功后你可以用model.hf_device_map看看它被分配到了哪些设备上。现在模型已经“活”在内存里了等着我们给它输入。3. 核心步骤二分词器如何将文字变成数字模型看不懂“你好世界”它只认识数字。分词器Tokenizer就是负责翻译的。3.1 从字符串到Token ID我们写一句提示词让分词器处理一下。prompt 解释一下量子计算 # 使用分词器进行编码 inputs tokenizer(prompt, return_tensorspt) # return_tensors”pt” 返回PyTorch张量 print(inputs) # 输出大概会是{‘input_ids’: tensor([[xxx, yyy, zzz, …]]), ‘attention_mask’: tensor([[1, 1, 1, …]])}input_ids就是转换后的Token ID序列每个数字对应词汇表里的一个词或子词。attention_mask是注意力掩码1表示这个位置是有效Token0表示是填充位Padding。百川用的是基于SentencePiece的Tokenizer它会将中文、英文、数字都切分成子词。你可以用tokenizer.decode([xxx])反向查看某个ID代表什么词。3.2 准备模型输入格式对于百川这类自回归生成模型我们通常会把input_ids和attention_mask直接传给模型。# 将输入数据移动到模型所在的设备比如GPU input_ids inputs.input_ids.to(model.device) attention_mask inputs.attention_mask.to(model.device)关键点来了model.device会自动指向模型权重所在的设备可能是cuda:0。我们必须把输入数据也放到同一个设备上否则PyTorch会报错。4. 深入核心模型前向推理流程代码解读这是最硬核的部分我们要跟着数据的脚步在模型的神经网络里走一遍。虽然我们不会手动重写整个forward函数但理解它的关键步骤至关重要。4.1 入口model.generate 与 model.forward通常我们调用model.generate()来生成文本但它内部会多次调用model.forward()。forward函数是单步推理输入当前所有的token预测下一个token的概率。我们可以先看看一次前向传播的调用和结果with torch.no_grad(): # 推理阶段不计算梯度节省内存 outputs model(input_idsinput_ids, attention_maskattention_mask) logits outputs.logits # 形状通常是 (batch_size, sequence_length, vocab_size) print(logits.shape)logits就是模型对词汇表中每个词token的“原始打分”。它的形状中vocab_size就是词汇表的大小百川2-13B大约是几万量级。最后一个位置sequence_length - 1的logits就对应着模型对“下一个词”的预测。4.2 拆解Forward内部的关键步骤虽然我们看不到百川模型forward函数的每一行源码它被封装在C或混合代码里但基于Transformer架构它的计算流程是清晰的。我们可以用伪代码来理解1. 输入嵌入Input Embedding: - input_ids (形状: [batch, seq_len]) 通过一个巨大的查找表Embedding Matrix转换为向量。 - 输出: hidden_states [batch, seq_len, hidden_size] (hidden_size5120 for 13B)。 2. 多层Transformer解码器共40层: for 每一层 in 模型.layers: a. 层归一化Pre-Norm b. 自注意力机制Self-Attention: - 将hidden_states投影成Query, Key, Value。 - 计算注意力分数Attention softmax((Q * K^T) / sqrt(d_k)) * V。 - 这里涉及旋转位置编码RoPE百川2使用了它来给Token注入位置信息。 - 得到当前层的注意力输出。 c. 残差连接Add: hidden_states hidden_states 注意力输出 d. 层归一化 e. 前馈神经网络Feed-Forward Network, FFN: - 一个多层感知机通常包含激活函数如SiLU。 - 百川2使用了SwiGLU等结构来增强非线性能力。 f. 残差连接: hidden_states hidden_states FFN输出 3. 最终层归一化Final LayerNorm 4. 输出投影Output Projection: - 将最后的hidden_states [batch, seq_len, hidden_size] 投影到词汇表空间。 - 通过一个线性层Linear权重矩阵形状为 [hidden_size, vocab_size]。 - 输出: logits [batch, seq_len, vocab_size]。关于注意力计算的细节 在每一步生成比如生成第N个token时模型会使用“键值缓存”KV Cache。这意味着之前所有token的Key和Value向量都被计算并缓存起来。当预测新token时只需要计算当前token的Query然后去和缓存里所有的Key做注意力计算。这避免了重复计算是生成式推理能够高效进行的关键。4.3 从Logits到生成下一个Token模型输出了logits我们怎么得到下一个词呢# 取最后一个token位置的logits next_token_logits logits[:, -1, :] # 形状 [batch, vocab_size] # 1. 采样策略温度调节Temperature Scaling temperature 0.8 scaled_logits next_token_logits / temperature # 2. 可选Top-p核采样 from torch.nn import functional as F probs F.softmax(scaled_logits, dim-1) sorted_probs, sorted_indices torch.sort(probs, descendingTrue) cumulative_probs torch.cumsum(sorted_probs, dim-1) # 移除累积概率超过top_p例如0.9的token sorted_indices_to_remove cumulative_probs 0.9 # ... 一系列操作得到最终的下一个token id # 3. 最简单的方式贪婪采样直接取概率最大的 next_token_id torch.argmax(next_token_logits, dim-1, keepdimTrue) print(f”下一个token ID: {next_token_id.item()}”) print(f”对应的词: {tokenizer.decode(next_token_id[0])}”)model.generate()方法帮我们封装了所有这些步骤温度、top-p、top-k、重复惩罚等并循环调用forward直到生成结束标记EOS token或达到最大长度。5. 完整推理示例与调试技巧让我们把上面的所有步骤串起来跑一个完整的例子并看看如何调试可能出现的问题。5.1 一个端到端的生成示例prompt “中国的首都是哪里” inputs tokenizer(prompt, return_tensors”pt”).to(model.device) # 设置生成参数 generation_config { “max_new_tokens”: 50, # 最多生成50个新token “do_sample”: True, # 使用采样而不是贪婪解码 “temperature”: 0.7, # 创造力程度 “top_p”: 0.9, # 核采样参数 “repetition_penalty”: 1.1, # 重复惩罚避免循环 } with torch.no_grad(): generated_ids model.generate( **inputs, **generation_config, eos_token_idtokenizer.eos_token_id, ) # 解码并打印结果 # 注意跳过输入部分只打印新生成的内容 new_tokens generated_ids[0, inputs.input_ids.shape[1]:] response tokenizer.decode(new_tokens, skip_special_tokensTrue) print(f”问{prompt}”) print(f”答{response}”)5.2 常见问题与调试思路如果你发现输出不对、乱码或者程序崩溃可以按以下思路排查显存溢出OOM症状CUDA out of memory。排查检查model.hf_device_map看是否所有层都成功加载到了GPU。尝试减小max_new_tokens或batch_size。对于超长文本可以启用transformers的use_cacheFalse但会变慢或者使用流式加载。输出无意义或重复症状生成的内容逻辑混乱或者不断重复同一句话。排查检查temperature参数太低接近0会导致确定性高、可能重复太高会导致随机性大、胡言乱语。0.7-0.9是常用范围。调整repetition_penalty适当增大如1.2可以抑制重复。检查输入格式。百川Chat模型可能期望特定的对话模板如human: ... assistant: ...请查阅官方文档。加载失败症状from_pretrained时报错提示找不到文件或配置不对。排查确认model_id拼写正确。确认网络能访问Hugging Face Hub。如果是本地权重确保文件路径正确且包含config.json,model.safetensors等必要文件。推理速度慢症状生成每个token都耗时很久。排查确认使用了torch.no_grad()。检查GPU利用率用nvidia-smi确认计算主要在GPU上进行。对于4bits量化确保bnb_4bit_compute_dtype设置成了torch.float16而不是torch.float32后者在GPU上计算更慢。6. 总结走完这一趟我们再回头看加载和推理一个像百川2-13B这样的大模型是不是感觉清晰多了整个过程其实可以概括为三步配置好量化参数把模型“请进门”用分词器把问题“翻译”成模型语言然后看着数据在Transformer的层层计算中流动最终变成一个答案。理解权重加载让你知道怎么在有限的资源下让大模型跑起来理解前向推理流程就像是拿到了模型的电路图无论是想优化性能、修改结构还是单纯想搞清楚“它为什么这么回答”你都知道该从哪个点去测量、去修改。代码和理论最大的不同就在于它的确定性。今天我们一起看的这些代码片段你完全可以复制到自己的环境里运行、修改、打断点观察。下次再遇到新的模型这套方法依然适用——无非是model_id换一下生成参数调一调。希望这篇解读能帮你捅破那层窗户纸更自信地去探索和运用这些强大的AI模型。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

相关文章:

从理论到实践:百川2-13B模型权重加载与推理过程代码解读

从理论到实践:百川2-13B模型权重加载与推理过程代码解读 你是不是也遇到过这种情况:好不容易找到一个开源大模型,比如百川2-13B,兴冲冲地下载下来,结果面对那一堆模型权重文件和复杂的代码,瞬间就懵了&…...

QT6 + CMake + QML开发:你的图片和QML文件加载不出来?可能是.qrc没配对

QT6 CMake QML开发:资源加载失败的终极排查指南 当你花了几个小时精心设计了QML界面,却在运行时看到一片空白或"找不到文件"的错误提示时,那种挫败感每个QT开发者都深有体会。特别是在QT6和CMake的现代开发环境中,资源…...

intv_ai_mk11企业应用指南:将AI对话能力嵌入CRM系统提升客服响应效率

intv_ai_mk11企业应用指南:将AI对话能力嵌入CRM系统提升客服响应效率 1. 企业客服面临的挑战与AI解决方案 现代企业客服系统普遍面临三大痛点:响应速度慢、人力成本高、服务质量不稳定。传统CRM系统虽然能记录客户信息,但在实时交互环节仍需…...

保姆级教程:用C# WinForm给STM32写个Modbus固件升级工具(附完整源码)

从零构建STM32固件升级工具:C# WinForm与Modbus协议深度实践 1. 开发环境与项目初始化 在Visual Studio 2022中新建Windows窗体应用项目时,建议选择.NET Framework 4.7.2或更高版本以获得最佳兼容性。项目创建后,首先需要配置NuGet包管理器安…...

BilibiliDown:基于Java的B站视频下载技术方案与实现解析

BilibiliDown:基于Java的B站视频下载技术方案与实现解析 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors…...

Marked.js 终极指南:为什么这是现代 Web 开发中最快的 Markdown 解析器?

Marked.js 终极指南:为什么这是现代 Web 开发中最快的 Markdown 解析器? 【免费下载链接】marked A markdown parser and compiler. Built for speed. 项目地址: https://gitcode.com/gh_mirrors/ma/marked 在当今内容驱动的 Web 开发世界中&…...

[TI板]MSPM0G3507开发全攻略:从环境搭建到实战应用

1. 环境配置:从零搭建MSPM0G3507开发环境 第一次接触TI的MSPM0G3507开发板时,最头疼的就是环境搭建。我花了整整两天时间踩遍了所有坑,现在把最顺滑的配置流程分享给你。这个芯片支持Keil、IAR和CCS三大主流IDE,但实测下来Keil的兼…...

保姆级教程:用Nordic NRF52832搞定SIF一线通协议收发(附完整代码)

Nordic NRF52832实战:SIF一线通协议全双工通信开发指南 在物联网设备开发中,单线通信协议因其布线简单、成本低廉而广受欢迎。SIF(Single Interface)作为一种轻量级一线通协议,特别适合传感器与控制器之间的短距离数据…...

一骑红尘妃子笑,CodeBuddy 运荔枝

一骑红尘妃子笑,CodeBuddy 运荔枝故事背景:适逢荔枝盛产季节,圣人(唐玄宗)为博美人(杨贵妃)一笑,钦点"荔枝使",负责将荔枝从"岭南"(今广…...

EcomGPT-7B镜像免配置实操:Docker Compose一键编排(含Redis缓存服务)

EcomGPT-7B镜像免配置实操:Docker Compose一键编排(含Redis缓存服务) 你是不是也遇到过这样的烦恼?想试试最新的AI电商大模型,结果光是环境配置就折腾了大半天。各种Python版本、PyTorch版本、依赖库冲突,…...

Cloudflare Tunnel零基础教程:5分钟搞定内网穿透(附移动网络解决方案)

Cloudflare Tunnel零基础实战指南:从内网穿透到移动网络优化 在数字化办公与远程协作成为常态的今天,如何安全高效地访问内网资源成为许多技术爱好者和小型企业IT人员的刚需。传统的内网穿透方案往往需要复杂的端口映射、动态DNS配置,甚至面临…...

2026届必备的十大AI辅助写作助手实测分析

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 人工智能于学术写作领域的介入,先是在简单的语法校对、文献检索方面,…...

如何突破语言壁垒?Translumo带来的实时翻译新体验

如何突破语言壁垒?Translumo带来的实时翻译新体验 【免费下载链接】Translumo Advanced real-time screen translator for games, hardcoded subtitles in videos, static text and etc. 项目地址: https://gitcode.com/gh_mirrors/tr/Translumo 在全球化的数…...

PyTorch 2.8 GPU算力优化部署教程:RTX 4090D显存利用率提升至92%

PyTorch 2.8 GPU算力优化部署教程:RTX 4090D显存利用率提升至92% 1. 环境准备与快速验证 在开始深度学习项目前,确保你的硬件配置符合以下要求: 显卡:NVIDIA RTX 4090D 24GB显存驱动版本:550.90.07或更高系统内存&a…...

3大核心价值:Path of Building离线构建规划工具全解析

3大核心价值:Path of Building离线构建规划工具全解析 【免费下载链接】PathOfBuilding Offline build planner for Path of Exile. 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding Path of Building(简称PoB)是《…...

SRS+WebRTC直播搭建实录:用安卓手机做推流器的5个关键步骤

SRSWebRTC直播搭建实录:用安卓手机做推流器的5个关键步骤 移动直播的轻量化趋势正在重塑内容创作生态。当专业摄像机与PC推流设备显得笨重时,一台随身携带的安卓手机配合SRSWebRTC技术栈,就能实现低于500ms延迟的直播推流方案。本文将拆解从设…...

CMB2前端集成教程:将元框和表单带到网站前台

CMB2前端集成教程:将元框和表单带到网站前台 【免费下载链接】CMB2 CMB2 is a developers toolkit for building metaboxes, custom fields, and forms for WordPress that will blow your mind. 项目地址: https://gitcode.com/gh_mirrors/cm/CMB2 想要在Wo…...

烽火HG680-MC全分区TTL救砖指南:从黑屏到流畅运行的完整解决方案

1. 烽火HG680-MC救砖前的准备工作 遇到黑屏、卡LOGO的烽火HG680-MC盒子别急着扔,TTL线刷能救回90%的"砖机"。我经手过上百台同型号设备,先说说你手头要准备的"救命工具包": 硬件三件套:CH340G芯片的TTL转USB模…...

数字孪生:从制造到城市,虚拟照进现实的系统工程

数字孪生已从概念走向规模化落地,其核心价值在于“以虚控实”。对软件测试从业者而言,这不仅是新场景的拓展,更是一场测试范式的革命——测试对象从单一软件系统,升级为“物理实体数字模型数据流控制闭环”的复杂异构系统。本文将…...

5分钟掌握B站评论区智能成分检测:免费高效的互动神器

5分钟掌握B站评论区智能成分检测:免费高效的互动神器 【免费下载链接】bilibili-comment-checker B站评论区自动标注成分,支持动态和关注识别以及手动输入 UID 识别 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-comment-checker B站成…...

Ostrakon-VL扫描终端部署案例:单卡A10G跑通全任务链(上传→推理→终端输出)

Ostrakon-VL扫描终端部署案例:单卡A10G跑通全任务链(上传→推理→终端输出) 1. 项目背景与价值 在零售与餐饮行业,每天需要处理大量商品识别、货架巡检等重复性视觉任务。传统方案通常面临两个痛点:一是专业级识别系…...

千问GEO生成式引擎优化技术方案

千问GEO生成式引擎优化技术方案 技术支持:拓世网络技术开发工作室 针对通义千问(Qwen)的生成式引擎优化(GEO)并非简单的关键词堆砌,而是一场关于“认知抢占”的技术战役。在2026年的当下,随着通…...

如何用Charticulator打破传统图表限制:数据可视化的革命性方法

如何用Charticulator打破传统图表限制:数据可视化的革命性方法 【免费下载链接】charticulator Interactive Layout-Aware Construction of Bespoke Charts 项目地址: https://gitcode.com/gh_mirrors/ch/charticulator 你是否曾为寻找合适的图表模板而烦恼&…...

Omni-Vision Sanctuary助力后端开发:设计高并发API接口的最佳实践

Omni-Vision Sanctuary助力后端开发:设计高并发API接口的最佳实践 1. 高并发API接口设计的挑战与机遇 想象一下这样的场景:你的电商平台刚刚上线了一个基于Omni-Vision Sanctuary的智能商品描述生成功能,突然涌入的用户请求让你的服务器不堪…...

c语言基础实战:通过快马ai生成银行账户管理系统练手项目

今天想和大家分享一个用C语言实现的银行账户管理系统小项目。这个项目非常适合用来巩固C语言的基础知识,特别是结构体、指针和文件操作这些核心概念。我自己在学习过程中发现,通过实际项目练习,能更好地理解这些抽象的概念。 项目需求分析 …...

高效管理Git仓库:彻底排除node_modules的实用指南

1. 为什么必须排除node_modules文件夹 每次新建Node.js项目时,npm或yarn都会自动生成node_modules目录来存放依赖包。这个文件夹通常包含成千上万个文件,比如一个基础Vue项目就可能超过200MB。我曾见过一个企业级项目的node_modules膨胀到1.2GB&#xff…...

《基于S7-1200PLC的全自动洗衣机控制系统设计》 一、设计任务书 1.任务描述

《基于S7-1200PLC的全自动洗衣机控制系统设计》 一、设计任务书 1.任务描述:洗衣机的进水和排水分别由进水电磁阀和排水电磁阀来执行 进水时,通过电控系统时进水阀打开,将水由外桶排到机外 洗涤正转、反转由洗涤电动机驱动波盘正、反转来实现…...

OpenClaw人人养虾:LiteLLM 统一网关

LiteLLM 是一个开源的 LLM API 统一网关(Unified Gateway),支持 100 模型提供商,提供统一的 OpenAI 兼容 API 格式。 安装 LiteLLM pip 安装 pip install litellm[proxy] Docker 安装 docker run -p 4000:4000 \-e OPENAI_AP…...

终极Illustrator脚本合集:10个免费工具彻底改变你的设计工作流

终极Illustrator脚本合集:10个免费工具彻底改变你的设计工作流 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 你是否曾经在Adobe Illustrator中花费数小时重复执行相同…...

2025届必备的十大降重复率工具实测分析

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 用于学术论文、科研报告以及各类文档,提供查重与改写服务的在线工具是降重网站。…...