在上一篇中,我们深入了解了分词器是如何将文本转化为数字的。
语言模型基础:本地部署开源大模型实战
本文介绍了如何在本地私有化部署开源大语言模型,以解决敏感数据处理及成本控制需求。通过 Hugging Face Transformers 库,演示了环境配置、模型加载(Qwen1.5-0.5B)、对话模板构建及文本生成的完整流程。此外,还分析了闭源与开源模型的选型策略,涵盖性能、成本、速度、上下文窗口等八个关键考量维度,帮助开发者根据实际场景选择合适的模型方案。

本文介绍了如何在本地私有化部署开源大语言模型,以解决敏感数据处理及成本控制需求。通过 Hugging Face Transformers 库,演示了环境配置、模型加载(Qwen1.5-0.5B)、对话模板构建及文本生成的完整流程。此外,还分析了闭源与开源模型的选型策略,涵盖性能、成本、速度、上下文窗口等八个关键考量维度,帮助开发者根据实际场景选择合适的模型方案。

在上一篇中,我们深入了解了分词器是如何将文本转化为数字的。
到现在为止,我们已经掌握了理论,也通过 API 体验了云端大模型。但在处理敏感数据、需要离线运行或精细控制成本的场景下,将大模型私有化部署到本地电脑是 Agent 开发者的必备技能。 本篇将带你动手,使用 Hugging Face 库在自己的电脑上运行一个真实的开源大模型。
在第一章中,我们通过 API 来驱动智能体。这是一种快速、便捷的方式,但并非唯一。对于许多企业级应用,将大语言模型直接部署在本地就显得至关重要。
我们将使用 Hugging Face Transformers,这是一个强大的开源库,提供了标准化的接口来加载和使用数以万计的预训练模型。
为了让大多数读者都能在个人电脑上顺利运行,我们特意选择了一个小规模但功能强大的模型:Qwen/Qwen1.5-0.5B-Chat。
首先,请确保你已经安装了必要的库:
pip install transformers torch
在 transformers 库中,我们通常使用两个核心类:
AutoModelForCausalLM:自动加载与模型匹配的因果语言模型权重。AutoTokenizer:自动加载对应的分词器。以下代码会自动从 Hugging Face Hub 下载所需文件(取决于网速,可能需要一些时间):
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
# 指定模型 ID
model_id = "Qwen/Qwen1.5-0.5B-Chat"
# 设置设备,优先使用 GPU (CUDA),否则使用 CPU
device = "cuda" if torch.cuda.is_available() else "cpu"
print(f"Using device: {device}")
# 加载分词器
tokenizer = AutoTokenizer.from_pretrained(model_id)
# 加载模型,并将其移动到指定设备
model = AutoModelForCausalLM.from_pretrained(model_id).to(device)
print("模型和分词器加载完成!")
Qwen1.5-Chat 模型遵循特定的对话模板。我们需要构建一个包含 system(系统设定)和 user(用户指令)的消息列表,然后使用分词器的 apply_chat_template 方法将其格式化。
# 准备对话输入
messages = [{"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "你好,请介绍你自己。"}]
# 使用分词器的模板格式化输入
# tokenize=False 表示我们先只获取格式化后的文本字符串,方便观察
# add_generation_prompt=True 表示添加模型开始生成的引导符
text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
# 编码输入文本,转换为 Tensor 并移动到设备
model_inputs = tokenizer([text], return_tensors="pt").to(device)
print("编码后的输入文本 (Token IDs):")
print(model_inputs)
💡 注解:
apply_chat_template是 Hugging Face 新版极其重要的功能。不同模型(Llama, Qwen, Mistral)对对话格式的要求(如[INST],<|im_start|>等特殊标记)各不相同。这个函数能自动适配,帮你省去了手动拼接字符串的繁琐和易错风险。
现在,我们可以调用模型的 generate() 方法来生成回答了。最后,使用 batch_decode 将生成的数字 ID 翻译回人类可读的文本。
# 使用模型生成回答
# max_new_tokens 控制了模型最多能生成多少个新的 Token
generated_ids = model.generate(model_inputs.input_ids, max_new_tokens=512)
# 将生成的 Token ID 截取掉输入部分
# 这样我们只解码模型新生成的部分,不包含我们发给它的问题
generated_ids = [output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)]
# 解码生成的 Token ID
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print("\n模型的回答:")
print(response)
预期输出(示例):
我叫通义千问,是由阿里云研发的预训练语言模型…
恭喜!你已经成功在本地运行了一个大模型。这意味着你拥有了一个完全受控、隐私安全且无 API 调用成本的智能大脑。
现在又引出了一个关键问题:市面上有成百上千个模型(GPT-4, Llama 3, Claude 3…),我们该如何为自己的智能体选择最合适的那一个?
选择语言模型并非简单地追求'最大、最强',而是一个在性能、成本、速度和部署方式之间进行权衡的决策过程。
在做决定时,请对着这份清单进行评估:
闭源模型通常代表业界最强性能,提供'开箱即用'的 API 服务。
开源模型赋予开发者最高程度的灵活性、透明度和自主权。
💡 选型总结:闭源模型提供了开箱即用的便捷,适合快速验证和追求极致性能。开源模型赋予了随心所欲的定制自由,适合数据敏感、成本控制或需要深度改造的场景。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online