用Python调预训练模型:Transformers库加载与推理实战指南
发布时间:2026/10/1 13:45:01来源:尧图网络
不用急着搭一套几百亿参数的私有化大模型也不用到网上去抄那些动不动就几十行的高深代码。先搞懂一件事用 Python 调用预训练大模型本质上就是“下载一个现成的模型文件然后在一个叫 Transformers 的库里面写几行代码把它加载进来再对一句话做推理”。这也是今天这篇博文的核心。无论你是想快速跑通一个文本生成 demo还是要给公司内部做智能问答、内容摘要、代码补全这套流程都绕不开。这篇内容适合刚接触大模型、想用 Python 实际动手跑模型的开发者也适合已经在用 PyTorch/TensorFlow、但一直没系统理清 Transformers 这个库到底封装了什么的人。我会从环境准备开始把模型加载、分词器、推理参数、显存优化到常见报错排查全部过一遍尽量不废话全部按实际能跑通的方式来写。1. 环境准备与安装先把地基打好很多人上来就 pip install transformers结果一跑就报了一堆依赖错误或者装完直接和系统的 PyTorch 版本冲突。这里必须先说明一个容易踩坑的地方Transformers 本身是一个“模型加载与推理框架”它需要依赖 PyTorch或者 TensorFlow、JAX 才能驱动模型计算所以正确的安装顺序是先装深度学习框架再装 Transformers。1.1 Python 版本与虚拟环境我个人强烈建议用 Python 3.9 到 3.11 之间的版本最好是 3.10 或 3.11。Transformers 对 Python 3.8 的兼容已经逐渐变弱某些新版模型比如较新的量化模块在 3.8 上会有隐性问题而 Python 3.12 刚推出时和不少依赖库的兼容也有坑虽然现在情况好转了但如果你不想在环境上折腾3.10/3.11 是实测最稳的选择。千万不要直接拿系统全局 Python 来装这些库。我见过太多人在系统环境里 pip 了一堆包后来因为某个依赖冲突只能重装系统解释器。用虚拟环境是唯一推荐的做法python -m venv llm_env source llm_env/bin/activate # Windows 下是 llm_env\Scripts\activate如果你更偏爱 conda也可以conda create -n llm_env python3.10 -y conda activate llm_env这一步看起来简单但它的意义不只是“隔离环境”而是让你后续在调试 GPU 版本 PyTorch 时不至于破坏其他项目。1.2 安装 PyTorch 与 Transformers先确认自己的 GPU 型号和 CUDA 支持情况。如果你没有 NVIDIA GPU也没关系CPU 同样能跑小模型只是速度慢些具体推理时的显存和速度问题我会在第 4 章专门展开。安装 PyTorch 的时候千万不要直接用pip install torch因为默认会安装 CPU 版本除非你已经配置了对应的源这样既占空间又浪费 GPU 驱动。正确做法是去 PyTorch 官网选版本或者直接按 CUDA 版本安装# 以 CUDA 12.1 为例 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121装完 PyTorch 后验证一下 GPU 是否被正确识别import torch print(torch.__version__) print(torch.cuda.is_available()) # 输出 True 才是真正用上了 GPU接着安装 Transformers 库。这里还有一个选择是用稳定版还是每日开发版我的建议是初学者和绝大多数实际项目都用稳定版pip install transformers如果你需要跑一些次日的新模型架构比如最新的量化方法或新的模型类可以装 from source 的版本pip install githttps://github.com/huggingface/transformers.git但要注意每日开发版偶尔会引入不稳定的 API 变动不是必要情况不要碰它。另外想顺手做可视化推理的话可以加装accelerate、datasets、safetensors这几个常用配套库pip install accelerate datasets safetensors这里多说一句safetensors是一个很关键的安全加载格式。旧版 PyTorch 直接用 pickle 反序列化模型权重存在恶意构造权重文件执行代码的风险safetensors 设计的目的就是避免这个问题。Transformers 加载模型时默认优先读取 safetensors 格式的权重所以一定要装。1.3 国内网络环境下的模型下载加速下载模型权重时默认会从 Hugging Face Hub 拉取国内网络经常连接超时。常见的解决办法有几种设置镜像环境变量export HF_ENDPOINThttps://hf-mirror.com后再执行 Python 脚本Transformers 会自动走镜像下载。先手动下载到本地再用from_pretrained的local_files_onlyTrue参数加载。用huggingface_hub库的snapshot_download函数支持断点续传。from huggingface_hub import snapshot_download snapshot_download(repo_idgpt2, local_dir./models/gpt2)这个方法很实用。特别是你要部署到内网机器时事先在一台联网机器上把模型权重拷全再拷贝过去比每次都在线下载省心得多。2. Transformers 核心概念拆解它到底帮你做了什么如果你直接去看 Transformers 的源码会觉得自己被一堆PreTrainedModel、GenerationMixin、ModelOutput的抽象类包围了。但实际使用中你只需要弄明白三件事Pipeline流程封装、AutoModel模型加载器、AutoTokenizer分词器。这三个东西搞明白了大模型调用的核心就算拿下了。2.1 pipeline最简单的推理入口pipeline是 Transformers 提供的最上层封装它把“分词 → 模型推理 → 结果后处理”整个流程串成了一个函数。如果你只想快速试一下某个模型的效果用它最合适from transformers import pipeline generator pipeline(text-generation, modelgpt2) result generator(我今天想写一篇关于, max_new_tokens50) print(result[0][generated_text])在底层pipeline自动完成了三件事下载并加载模型、加载对应的分词器、封装预处理和后处理逻辑。对于新手来说这意味着不需要关心input_ids和attention_mask是怎么生成的只要给出文本就能拿回结果。但pipeline也有明显的短板它隐藏了太多细节一旦要自定义解码参数、批量推理、或者对中间过程做操作就会觉得拐手。我的建议是把它当作“验证工具”用实际写项目时还是要掌握下面的 AutoModel 用法。2.2 AutoModel 与 AutoTokenizer灵活调用的核心AutoModel是一个“按需加载”的类。你只需要告诉它一个模型名它会自动判断模型的类型GPT2、BERT、LLaMA、ChatGLM 等然后加载对应的模型结构权重。注意from_pretrained这个方法的第一个参数既可以是 Hugging Face 上的模型仓库 ID例如gpt2、THUDM/chatglm-6b也可以是本地路径。from transformers import AutoTokenizer, AutoModelForCausalLM model_name gpt2 tokenizer AutoTokenizer.from_pretrained(model_name) model AutoModelForCausalLM.from_pretrained(model_name)这里有几个很容易被忽略的细节分词器Tokenizer和模型不能随便搭配。BERT 的 WordPiece 词表和 GPT-2 的 BPE 词表是两套完全不同的体系混用会导致 token 完全错乱推理结果就是一堆乱码。AutoModel不是一个具体的模型类它是一个入口真正加载的时候库内部会根据模型的 config 自动选择是 GPT2LMHeadModel 还是 BertForMaskedLM 等具体结构。所以不要尝试用AutoModel去“适配”所有的任务类型文本生成要用AutoModelForCausalLM句向量抽取要用AutoModel序列分类要用AutoModelForSequenceClassification。如果只做“填充句子”类的任务用AutoModelForCausalLM就对了。它比AutoModel多了一个语言模型头LM Head也就是把最后一层隐藏状态映射成词表概率分布的输出层。没有这个输出头你拿到的只是“理解”不是“生成”。2.3 CausalLM 和 MaskedLM 到底啥区别很多教程都不讲这两者的差异导致新手完全摸不着头脑。这里我直接说人话CausalLM因果语言模型训练的时候只允许模型看到当前位置左侧的 token也就是所谓的自回归。GPT 系列用的就是这种结构生成文本时是一个 token 一个 token 蹦出来的。你要写对话、续写、代码补全统统走它。MaskedLM掩码语言模型训练的时候随机把一部分 token 遮住让模型根据上下文去猜被遮住的词。BERT 就是这种思路但它不适合“自由生成”更适合做分类、匹配、抽取类任务。写代码的时候怎么判断用哪个类很简单——如果你的目标是从左往右生成长长的文本那就选AutoModelForCausalLM如果只是做文本分类、语义相似度、实体识别这类需要“理解”的任务那就选对应的任务类。硬要把 BERT 当成生成模型来用效果会非常尴尬。2.4 model.generate() 与关键推理参数详解当模型加载完最核心的推理函数是model.generate()。很多新手以为生成文本就是把model(text)一行跑完其实不对——直接调用模型只会输出最后一层 logits而不是直接的文本内容要做文本生成必须走generate()方法。inputs tokenizer(你好世界。, return_tensorspt) outputs model.generate( inputs.input_ids, max_new_tokens50, do_sampleTrue, temperature0.8, top_p0.9, repetition_penalty1.2, ) print(tokenizer.decode(outputs[0], skip_special_tokensTrue))这里几个参数我逐个讲一遍因为它们直接决定生成效果好坏max_new_tokens新生成的 token 数量上限。注意它和max_length的区别max_length是输入加输出的总长度max_new_tokens只看输出。新手经常把max_length设成和输入长度差不多导致生成一两句话就被截断了。建议优先使用max_new_tokens。do_sample是否进行随机采样。设为False时就是贪心解码每次都选概率最大的 token结果稳定但容易重复设为True时会按概率分布随机抽样生成的文本更有多样性。实际做聊天机器人推荐True。temperature控制随机性。值越低越保守越确定值越高越跳跃越大越容易胡言乱语。一般在 0.7 ~ 0.9 之间调。但注意 temperature 对于top_k或top_p有联动效果不要单独拍脑袋调。top_p核采样。从概率累积超过top_p的最小 token 集合里采样既保留了多样性又砍掉了尾部大量低概率噪声。推荐 0.8 ~ 0.95。repetition_penalty重复惩罚。像 1.2 这种数值表示遇到重复 token 时在概率上打折扣能减少句子无限循环的现象。但如果设置得太大比如 2.0生成结果会变得生硬、不自然。这些参数之间没有一套万能配方不同模型的最优值不一样。我的习惯是先用贪心解码跑一版看看基线效果再逐步放开do_sampleTrue配合 temperature 和 top_p 慢慢调。3. 完整实操从加载模型到生成第一句话环境装好、概念理清之后下面来一个完整的可复现案例。为了让更多人能跑得动我选一个参数量较小的模型作为起步——GPT-2它只有约 1.24 亿参数CPU 也能勉强跑动。如果你想直接上中文可以用uer/gpt2-chinese-cluecorpussmall参数量也不算大但如果下载不了先拿 GPT-2 练手逻辑完全一致。3.1 最小可运行示例文本续写先建一个工作目录mkdir gpt_demo cd gpt_demo然后写一个 Python 文件generate_demo.pyfrom transformers import AutoModelForCausalLM, AutoTokenizer model_name gpt2 tokenizer AutoTokenizer.from_pretrained(model_name) model AutoModelForCausalLM.from_pretrained(model_name) # 如果不传 pad_token生成时容易报错统一用 eos_token 兜底 tokenizer.pad_token tokenizer.eos_token model.config.pad_token_id tokenizer.eos_token_id prompt Once upon a time inputs tokenizer(prompt, return_tensorspt) outputs model.generate( **inputs, max_new_tokens40, do_sampleTrue, temperature0.8, top_p0.9, repetition_penalty1.1, ) result tokenizer.decode(outputs[0], skip_special_tokensTrue) print(result)执行python generate_demo.py顺利的话你会在控制台看到一段以“Once upon a time”开头的英文续写。第一次运行会下载模型权重到本地缓存目录类 Unix 系统一般在~/.cache/huggingfaceWindows 在C:\Users\用户名\.cache\huggingface所以第一次耗时会比较长后续再跑就是秒开。这里我要强调一个经验如果你没有设置tokenizer.pad_token当输入是“不定长 batch”时比如一次给多条不同长度的文本Tokenize 过程中对短句补 padding 时会找不到 pad token 而报错。我这个示例里只传了一条文本看起来没影响但只要你下一步尝试批量生成这个坑马上就排队等着你。3.2 用中文模型跑一个聊天版骨架中文场景下我建议用THUDM/chatglm-6b这类对话模型但它体积太大需要差不多 12GB 显存入门不建议一上来就跑。先试试uer/gpt2-chinese-cluecorpussmall约 96MB体验一下中文生成效果from transformers import AutoModelForCausalLM, AutoTokenizer model_name uer/gpt2-chinese-cluecorpussmall tokenizer AutoTokenizer.from_pretrained(model_name) model AutoModelForCausalLM.from_pretrained(model_name) prompt 中国的首都是 inputs tokenizer(prompt, return_tensorspt) outputs model.generate( **inputs, max_new_tokens20, do_sampleTrue, top_p0.9, temperature0.85, ) print(tokenizer.decode(outputs[0], skip_special_tokensTrue))这个模型的生成质量其实一般毕竟参数量太小而且它是纯文本生成模型不是做问答的。跑它的意义在于验证中文 tokenizerBPE 处理中文字符的方式和英文有没有区别以及让你掌握“换模型只改model_name一个变量”这种方式的高度可移植性。等你有 GPU 了想体验真正的对话效果可以把model_name换成THUDM/chatglm-6b或者bigscience/bloomz-7b1-mt代码结构几乎不变只是推理时显存需求暴涨。这就是 Transformers 库最让人舒服的地方——模型架构千差万别但调用接口统一。3.3 用不加载模型的“又快又省”技巧加载本地模型实际项目中我强烈建议先把模型权重下载到本地然后直接用本地路径加载。这样做有几个好处一是避免每次启动时联网检查更新版本二是方便离线部署三是模型路径可控不会被缓存清理误删。# 第一次运行时下载到本地 from huggingface_hub import snapshot_download snapshot_download(repo_idgpt2, local_dir./local_models/gpt2) # 后续引用直接用本地路径 model_name ./local_models/gpt2 tokenizer AutoTokenizer.from_pretrained(model_name) model AutoModelForCausalLM.from_pretrained(model_name)注意local_dir参数会把整个仓库的 snapshot包括权重、config.json、tokenizer 文件等完整拉下来。你只要把整个文件夹拷到另一台机器保持目录结构完整就能离线加载。千万不要只拷.bin权重文件少了config.jsonfrom_pretrained会直接报错说缺少配置文件。4. 推理性能优化跑得快、显存省的几个关键配置跑通模型只是第一步真正放到生产环境或者你本地有限的显存下性能优化是绕不开的话题。这里我只讲几个实际有效的手段不铺开讲那些华而不实的技巧。4.1 半精度推理fp16如果你的 GPU 是 NVIDIA 架构Volta 及以上也就是 Tesla V100、RTX 20 系以后可以开启半精度浮点 fp16 推理。半精度能让显存占用减半同时推理速度显著提升。model AutoModelForCausalLM.from_pretrained( model_name, torch_dtypetorch.float16, device_mapauto, )这里有几个坑必须先说明老一些的显卡比如 GTX 10 系虽然支持 fp16 存储但计算速度反而不如 fp32开启后纯粹是负优化。某些算子如 softmax 的中间状态在 fp16 下可能出现精度误差如果生成结果突然变差可以试试保留torch_dtypetorch.float32。在没有 GPU 的 CPU 上不要开 fp16CPU 上的 fp16 支持不完整反而更慢。4.2 模型量化从 12GB 降到 3GB 的魔法如果显存不够跑完整的 fp32 模型最常见的办法是“量化”。简单说就是把原本用 32 位浮点数表示的权重压缩到 8 位整数甚至 4 位代价是精度损失。对大模型任务来说量化后的输出质量和原版差距不大但显存能省 70% 以上。Transformers 配合bitsandbytes库能做非常方便的低比特加载pip install bitsandbytesfrom transformers import AutoModelForCausalLM, BitsAndBytesConfig bnb_config BitsAndBytesConfig( load_in_8bitTrue, llm_int8_threshold6.0, ) model AutoModelForCausalLM.from_pretrained( bigscience/bloomz-7b1-mt, quantization_configbnb_config, device_mapauto, )你也可以用load_in_4bitTrue进一步压显存。但注意量化后的模型在generate()时有些参数还是尽量保持默认比如不要在 4bit 模型上强行开do_sampleTrue的大量随机采样字节某些激活值在低比特下更容易溢出。我实测下来8bit 量化下配合temperature0.7, top_p0.9的效果还算稳定但 4bit 就需要更保守的采样参数。友情提示bitsandbytes在 Windows 上的安装偶尔会出兼容问题建议优先使用 Linux 环境如果你实在要用 Windows可以去找对应的 pre-built wheel。4.3 指定device_map与批处理加速如果你有多个 GPU或者 GPU 显存不够但内存很大Transformers 可以自动把模型的不同层分配到不同的设备上model AutoModelForCausalLM.from_pretrained(model_name, device_mapauto)device_mapauto的做法非常值得理解库会检查一下你所有可见的 GPU 和 CPU 内存然后把模型层按预算切分。这样即使是 70B 的大模型也能在 4 张 A100 上并行跑起来。不过对单张显卡来说device_map 的主要作用只是省去手动调.to(cuda)的麻烦并不会解决显存不足问题。推理时如果需要同时给多条输入生成可以把多条 prompt 组成一个 batch 传入。比如prompts [你好, 讲个笑话, 解释一下量子力学] inputs tokenizer(prompts, return_tensorspt, paddingTrue, truncationTrue) outputs model.generate(**inputs, max_new_tokens50)这里有个细节不同长度的句子拼 batch 时必须 padding 到相同长度而 padding 用的 token 会影响注意力计算所以你会看到很多代码会设置attention_mask。如果我们不传attention_mask模型会在 padding 位置也做计算导致 padding token 被当成正常文本参与出来。上面那段代码中因为 tokenizer 返回了attention_mask并通过**inputs传给了generate()所以模型能正确忽略 padding 区域。4.4 CPU 推理的保命配置没有 GPU 时小模型跑 CPU 是可行的但要稍作调整以省时间设置环境变量OMP_NUM_THREADS充分利用多核 CPUexport OMP_NUM_THREADS8尽量使用max_new_tokens限制输出长度。开启model.generation_config.cache_implementation static如果模型支持可以省去重复 KV cache 分配的开销。换用更小的模型比如distilgpt2、sshleifer/tiny-gpt2。这些模型精度略降但推理速度能翻倍。CPU 上跑大模型超过 10B 参数的体验通常很煎熬不是技术上不行而是速度慢到没有实用价值。所以如果真的是做大模型业务老老实实筹备 GPU或者用云厂商的推理 API。5. 新手最容易踩的坑问题排查与避坑实录这一章是真正的经验部分。我在群里见过太多新手反复问同一个问题归根结底都是几个典型步骤没做好。下面直接整理成清单按我的真实排查顺序写5.1 “CUDA out of memory” 显存不足这个报错最常见。首先要区分两种情况模型本身太大想办法量化8bit/4bit或者换小模型或者用更小的max_new_tokens。批量太大batch_size或一次传入的 prompt 数量太多导致 activation 爆了。先试batch_size1再逐步往上加。显存碎片化PyTorch 在某些长时间运行后会残留 cache可以在每次推理前执行torch.cuda.empty_cache()。但这只是清空了缓存块不是清空占用真正的解决方式还是减小负载。最后再看一眼自己是不是还开着好几个 Jupyter notebook 占着显存没释放。这种情况我遇到太多次排查半天发现是另一个 kernel 挂着模型没释放。5.2 加载模型时报 “KeyError: config” 或缺少文件用了本地路径时最容易踩本地文件夹里缺少config.json。from_pretrained的第一步就是读取该文件没有它所有后续都免谈。解决方法是使用snapshot_download或手动检查文件夹里是否有这些核心文件config.json model.safetensors / pytorch_model.bin tokenizer.json / vocab.txt / merges.txt generation_config.json可选但建议有如果文件名是pytorch_model.bin.index.json说明权重被分片成了多个文件一定要保持所有分片在同一目录缺一不可。5.3 生成结果全是重复内容生成结果无限循环例如 “I like to play play play play...”的最常见原因是贪心解码do_sampleFalse配了较小的max_new_tokens。模型一旦陷入概率最大的 token 循环没有随机性打断就很难出来。解决办法是开启do_sampleTrue让随机采样打破循环。调高repetition_penalty比如 1.3。调低top_p比如 0.85把低概率的噪声 token 过滤掉。5.4 输入中文却输出乱码第一反应是分词器选错了。GPT-2 原生 tokenizer 是英文 BPE直接拿它处理中文模型根本没有对应的向量映射。这时候换成中文预训练模型的同时必须用该模型配套的中文 tokenizer绝对不要混搭。另外还有一种情况模型本身支持中文但你的 PyTorch 版本太老部分中文字符编码处理出错。保证transformers4.30、torch2.0基本可以避免。5.5 冻结整个推理阶段时报 “The model size exceeds the VRAM limit”这个报错往往出现在旧卡或显存本身就很小的场景。除了量化还有一个思路是模型卸载offload到 CPU 内存model AutoModelForCausalLM.from_pretrained(model_name, device_mapauto)device_map 会自动把放不下 GPU 的层放到 CPU 上代价是速度降低。但总比直接 OOM 强特别在调试阶段非常有用。5.6 下载速度过慢或连接超时除了前面提到的HF_ENDPOINT镜像外另一个稳妥方案是使用hf_transfer库加速下载pip install hf_transfer export HF_HUB_ENABLE_HF_TRANSFER1这个库用了 Rust 实现的多线程下载策略大文件下载速度提升很明显。但注意它要求稳定的网络连接断点续传支持一般。5.7 模型名称与任务不匹配导致推理结果毫无意义用bert-base-uncased做生成生成不了它没有 LM Head。用gpt2做中文问答乱码或答非所问。用t5-small直接当对话模型效果比随机还差因为 T5 是填槽式生成模型不是聊天模型。这些基本都是模型任务类型不匹配的问题。第一步永远是明确任务类型——你是要做续写、总结、对话还是分类然后选对应架构的模型。6. 从 demo 到生产几个容易被忽略的扩展点如果你打算把代码从“本地跑通”变成“真正服务别人”有几个扩展点无比重要。6.1 把推理包装成 HTTP 服务最简单的方式是用 FastAPI 包一层from fastapi import FastAPI from pydantic import BaseModel app FastAPI() class GenerateRequest(BaseModel): prompt: str max_new_tokens: int 50 temperature: float 0.8 app.post(/generate) def generate(request: GenerateRequest): inputs tokenizer(request.prompt, return_tensorspt).to(model.device) outputs model.generate( **inputs, max_new_tokensrequest.max_new_tokens, temperaturerequest.temperature, do_sampleTrue, ) return {text: tokenizer.decode(outputs[0], skip_special_tokensTrue)}注意model.to(model.device)这里有点取巧其实在初始化模型后你应该显式把模型放到指定 GPU比如model.to(cuda)。如果用了device_mapauto模型内部已经分层放置直接使用inputs时也需要确保输入张量和模型第一层设备一致。经验做法是加载模型后先检查model.device再决定要不要把 inputs 搬过去。6.2 并发推理的取舍同一个模型服务多线程并发请求时如果直接把model.generate()放在每个线程里会发现 GPU 利用率不高还容易因为并发导致 OOM。更规范的做法是用请求队列加单线程推理或者用 vLLM 这类专门为 LLM 推理做过连续批处理continuous batching的服务框架。对于入门阶段我的建议是先用队列控制并发不要过早引入复杂框架。import queue import threading req_queue queue.Queue() result_dict {} def worker(): while True: req_id, prompt req_queue.get() # 在这里调用 model.generate() result_dict[req_id] result req_queue.task_done()这种“单消费进程 队列”的模式简单可靠还容易加显存保护逻辑比盲目上多线程靠谱得多。6.3 模型持续升级与 rollback使用 Transformers 时候尽量把模型名称或模型版本记录在配置里比如config.json的_name_or_path字段。我遇到过升级 transformers 版本后老模型加载行为发生变化导致输出完全不同的案例。所以线上部署时最好把 transformers 版本、模型仓库 ID、权重 hash 都钉死换个版本就重新测试一轮不要默认为“往前兼容”。7. 结尾我个人在实操中的体会最后分享一个我自己的真实心得调用预训练大模型这门技术真正的门槛从来不是“会 import transformers”而是你是否理解模型和文本之间的数据流向。从字符串到 token ids从 token ids 到 logits从 logits 到采样——这个链条只要在心里清晰了后面换模型、调参、做优化都是水到渠成。另外还有一个很琐碎但很关键的点tokenizer 和模型永远要配对使用。这听起来像是废话但我见过好几个人用中文模型配了一个英文 tokenizer输出直接崩得不成样子。遇到生成乱码先检查分词器再检查模型路径这个顺序能帮你省下大量排查时间。入门阶段资源有限是正常的不用一上来就追求 7B、13B 甚至更大。用 GPT-2 这类小模型把流程跑通把generate()的参数、量化加载、本地部署这几件事都摸熟再去挑战大模型你会发现自己几乎不需要再学新东西——因为接口和流程是高度统一的。如果你后面打算做真实的对话机器人产品建议尽早把推理服务化FastAPI 队列和模型版本管理纳入考虑这两个点在实际生产中比“调出一个更流畅的 prompt”重要得多。这篇东西写下来基本覆盖了我从零开始上手预训练大模型的完整路径。按这个顺序走你大概率能避开我踩过的大部分坑。
网站建设高端定制企业官网