生成式AI入门第19课:小型语言模型(SLM)与微软 Phi-3/3.5 家族实战指南
【免费下载链接】generative-ai-for-beginners21 Lessons, Get Started Building with Generative AI项目地址: https://gitcode.com/GitHub_Trending/ge/generative-ai-for-beginners
本篇文章取材于 generative-ai-for-beginners 课程仓库中的第 19 课(19-slm/README.md),系统讲解小型语言模型(SLM)的核心概念、与大型语言模型(LLM)的差异,并围绕微软 Phi-3 / Phi-3.5 家族展开从云端 API 到本地部署的完整推理实战。读完本文,你将掌握 SLM 的选型思路,并能通过 GitHub Models / Foundry、Azure AI Studio、NVIDIA NIM、Hugging Face Transformers、Ollama 与 ONNX Runtime GenAI 等六种主流途径,实际跑通 Instruct、Vision、MoE 三类模型的推理调用。
什么是小型语言模型(SLM)
生成式人工智能(Generative AI)是一个专注于让系统生成全新内容的人工智能领域,其产物可以是文本、图片、音乐,甚至是完整的虚拟环境。而在语言模型这个最引人注目的分支中,小型语言模型(Small Language Model, SLM)是相对于大型语言模型(LLM)的一类"缩小型"变体——它复用了 LLM 的大部分架构原理与训练技术,却把计算足迹(computational footprint)大幅压缩。
SLM 是语言模型的子集,专门用于生成接近人类水平的文本。与 GPT-4 这类庞然大物相比,SLM 更加紧凑、高效,非常适合计算资源受限的场景。尽管体积更小,它们仍然能够胜任多种自然语言处理(NLP)任务:
- 文本生成:生成连贯且上下文相关的句子或段落;
- 文本补全:根据给定提示预测并补全后续内容;
- 翻译:将文本从一种语言转换为另一种语言;
- 摘要:把长文本压缩成更易消化的简短总结。
当然,这一切以一定程度的性能或理解深度折中为代价。SLM 通常通过对 LLM 进行压缩或蒸馏(distill)构建而来,目标是在保留原始模型大部分功能与语言能力的同时,降低整体复杂度,使内存占用与计算需求都更为经济。
SLM 是如何工作的?
SLM 的训练过程与 LLM 一脉相承,都在海量文本数据上学习语言的模式与结构,从而生成语法正确、上下文恰当的文本。完整训练流程包含四个阶段:
- 数据收集(Data Collection):从多种来源汇集大规模文本数据集;
- 预处理(Preprocessing):清洗并组织数据,使其适合训练;
- 训练(Training):利用机器学习算法教会模型理解并生成文本;
- 微调(Fine-Tuning):针对特定任务调整模型,提升下游表现。
SLM 的发展与"资源受限环境部署"的需求高度契合——在移动设备、边缘计算平台等场景下,完整规模的 LLM 往往因资源需求过大而不可行。SLM 通过聚焦效率,在性能与可及性之间取得平衡,从而让 AI 应用能够覆盖更广泛的领域。
SLM 与 LLM 的五大核心差异
LLM 与 SLM 都建立在概率机器学习的基础原理之上,在架构设计、训练方法、数据生成流程与评估技术上遵循相近思路。但以下五个关键因素将二者显著区分开来:
| 维度 | LLM | SLM |
|---|---|---|
| 模型规模 | 参数可达万亿级(如 GPT-4 约 1.76 万亿参数) | 通常为数十亿参数(如 Mistral 7B 约 70 亿) |
| 理解能力 | 追求类人智能,跨多领域表现良好,通用性与适应性更强 | 面向特定领域优化,高度专精但泛化理解可能受限 |
| 计算资源 | 训练与部署极其消耗资源,往往需要大规模 GPU 集群 | 参数更少,可在具备中等 GPU 能力的本地机器上训练与运行 |
| 偏见倾向 | 依赖互联网原始数据,易引入代表性偏差、错误标注与语言偏见 | 数据集更受约束、更聚焦领域,天然对偏见不敏感(但并非免疫) |
| 推理速度 | 体积大、复杂度高,常需大量并行计算资源,并发用户多时响应变慢 | 体积小,可在本地硬件上高效推理,无需高强度并行处理 |
以架构为例:ChatGPT 采用编码器-解码器框架内的自注意力(self-attention)机制,而 Mistral 7B 使用滑动窗口注意力(sliding window attention),使得纯解码器(decoder-only)模型的训练更加高效——这种架构差异对模型的复杂度与性能影响深远。总而言之,LLM 更全能但更耗资源,SLM 则以更低的计算需求换取领域化的高效。
SLM 的典型应用场景
- 聊天机器人(Chatbot):提供客户支持,并以对话方式与用户互动;
- 内容创作(Content Creation):辅助写作者生成灵感,甚至草拟整篇文章;
- 教育(Education):帮助学生完成写作作业或学习新语言;
- 无障碍(Accessibility):为残障人士构建工具,如文本转语音系统。
注:本课程以Microsoft Phi-3 / Phi-3.5作为 SLM 的讲解范例,下文所有实操均围绕该模型家族展开。
认识 Phi-3 / Phi-3.5 模型家族
Phi-3 / Phi-3.5 家族主要覆盖三类应用场景:文本(Instruct)、视觉(Vision)与Agent / 混合专家(MoE)。课程文档将其形象地概括为:Instruct 模型是 Phi 的"理解力",而 Vision 则给了 Phi 一双"看懂世界的眼睛"。
Phi-3 / Phi-3.5 Instruct(文本方向)
主要面向文本生成、对话补全与内容信息抽取等任务。
- Phi-3-mini:3.8B 参数的语言模型,可在 Microsoft Foundry、Hugging Face 与 Ollama 上获取。根据课程文档引用的基准数字(数值越高越好),Phi-3 模型在关键基准上显著优于同尺寸甚至更大尺寸的语言模型:Phi-3-mini 超越两倍于其体量的模型;
- Phi-3-small / medium:仅 7B 参数的 Phi-3-small 在语言、推理、编程与数学等多项基准上超越了 GPT-3.5T;14B 参数的 Phi-3-medium 则延续这一趋势,在基准上超过了 Gemini 1.0 Pro;
- Phi-3.5-mini:可视为 Phi-3-mini 的升级版。参数规模不变,但能力增强——支持20+ 种语言(阿拉伯语、中文、捷克语、丹麦语、荷兰语、英语、芬兰语、法语、德语、希伯来语、匈牙利语、意大利语、日语、韩语、挪威语、波兰语、葡萄牙语、俄语、西班牙语、瑞典语、泰语、土耳其语、乌克兰语等),并对长上下文(long context)提供更强支持。3.8B 参数的 Phi-3.5-mini 超越同尺寸模型,与两倍尺寸的模型持平。
Phi-3 / Phi-3.5 Vision(视觉方向)
- Phi-3-Vision:仅 4.2B 参数,在通用视觉推理、OCR(光学字符识别)以及表格、图表理解等任务上,超越了 Claude-3 Haiku 与 Gemini 1.0 Pro V 等更大模型;
- Phi-3.5-Vision:Phi-3-Vision 的升级版,新增多图(multi-image)输入支持,不仅看得懂图片,还能处理视频(多帧输入、对多张输入图像进行推理)。在 OCR、表格与图表理解任务上优于 Claude-3.5 Sonnet 与 Gemini 1.5 Flash,在通用视觉知识推理上与之持平。
Phi-3.5-MoE(混合专家方向)
混合专家(Mixture of Experts, MoE)的核心思想是:以远低于稠密(dense)模型的计算量完成预训练,即用相同的计算预算大幅扩展模型或数据集规模;MoE 模型在预训练阶段应比其稠密对应物更快达到同等质量。
Phi-3.5-MoE 由16 × 3.8B 专家模块构成,仅 6.6B 激活参数(active parameters)就能在推理、语言理解与数学能力上达到与远大于它的模型相近的水平。
得益于这样的设计,与 LLM 不同,你完全可以把 Phi-3/3.5-mini 或 Phi-3/3.5-Vision 部署到**边缘设备(edge devices)**上。
如何调用 Phi-3 / Phi-3.5 家族:云端 API 路线
GitHub Models(最直接的云端方式)
GitHub Models 是上手最快的方式,通过模型目录即可快速访问 Phi-3/3.5-Instruct,配合 Azure AI Inference SDK 或 OpenAI SDK 用代码完成 API 调用,也可以在 Playground 中先行测试不同参数下的效果。
关于服务更替的说明:课程英文原版文档(19-slm/README.md)提示,GitHub Models 将于 2026 年 7 月底退役,Microsoft Foundry Models(Azure AI Foundry 的模型目录)是其直接替代品——你同样可以基于 OpenAI 兼容接口在代码中完成 Instruct 系列模型的调用。
课程中给出了一组直观的中文场景对比 Demo:在相同中文提问下比较 Phi-3-mini 与 Phi-3.5-mini 的回答差异(以下两张截图来自仓库 19-slm/img 目录,展示两种模型的真实输出效果):
观察这两张截图可以直观体会到:模型输出质量(尤其是多语言、地理知识类内容)会随版本迭代而变化,实际效果需要以你运行时的模型版本与温度为准确认。
Azure AI Studio / Microsoft Foundry
如果需要使用 Vision 与 MoE 模型,可以改用 Azure AI Studio(现整合进 Microsoft Foundry)完成调用。更详细的 Instruct、Vision、MoE 调用步骤可参考 Phi-3 Cookbook 中的 QuickStart 章节。
NVIDIA NIM(NVIDIA 推理微服务)
除云厂商模型目录外,还可以通过NVIDIA NIM(NVIDIA Inference Microservices)完成 Phi-3/3.5 家族的 API 调用。NIM 是一组加速推理微服务,帮助开发者在云、数据中心与工作站等多种环境中高效部署 AI 模型,其核心特性包括:
- 易于部署(Ease of Deployment):单条命令即可部署 AI 模型,易于集成进既有工作流;
- 性能优化(Optimized Performance):基于 NVIDIA 预优化推理引擎(TensorRT、TensorRT-LLM),保证低延迟、高吞吐;
- 可扩展性(Scalability):在 Kubernetes 上支持自动扩缩容,有效应对波动负载;
- 安全与控制(Security and Control):组织可在自管基础设施上自托管 NIM 微服务,保持对数据与应用的控制权;
- 标准 API(Standard APIs):提供行业标准 API,便于构建聊天机器人、AI 助手等应用。
NIM 隶属于 NVIDIA AI Enterprise,旨在简化 AI 模型的部署与运营,确保模型高效运行在 NVIDIA GPU 上。
仓库中提供了使用 NVIDIA NIM 调用 Phi-3.5-Vision API 的完整演示笔记本:19-slm/python/Phi-3-Vision-Nividia-NIM.ipynb。其核心调用逻辑为:
import requests, base64 invoke_url = "https://ai.api.nvidia.com/v1/vlm/microsoft/phi-3-vision-128k-instruct" # 读取图片并转为 base64 with open("./img/demo.png", "rb") as f: image_b64 = base64.b64encode(f.read()).decode() # 小于 180KB 的图片可直接内联在请求中 assert len(image_b64) < 180_000, \ "To upload larger images, use the assets API (see docs)" headers = { "Authorization": "Bearer Your Nvidia NIM API Key", "Accept": "application/json" } payload = { "messages": [ { "role": "user", "content": f'Please create Python code for image, and use plt to save the new picture under imgs/ and name it phi-3-vision.jpg. <img src="data:image/png;base64,{image_b64}" />' } ], "max_tokens": 1024, "temperature": 0.6, "top_p": 1.0, "stream": False } response = requests.post(invoke_url, headers=headers, json=payload)请求以 OpenAI 兼容的消息格式发送,图片以data:image/png;base64,...形式内嵌在用户消息中,模型返回的代码片段可通过提取```python与```之间的内容进一步解析复用。
在本地运行 Phi-3 / Phi-3.5
所谓推理(Inference),指的是模型根据输入生成响应或预测的过程:当你向 Phi-3 输入提示词或问题时,它利用训练好的神经网络,通过分析训练数据中学到的模式与关系,推断出最可能且最相关的回答。下面介绍几种主流的本地运行方式。
方式一:Hugging Face Transformers
Hugging Face Transformers 是专为 NLP 及其他机器学习任务设计的强大库,核心要点如下:
- 预训练模型:提供数千个开箱即用的预训练模型,覆盖文本分类、命名实体识别、问答、摘要、翻译与文本生成等任务;
- 框架互操作:支持 PyTorch、TensorFlow 与 JAX 等多种深度学习框架,可在一种框架中训练、在另一种框架中使用;
- 多模态能力:除 NLP 外还支持计算机视觉(图像分类、目标检测)与音频处理(语音识别、音频分类);
- 易用性:提供便捷 API 与工具下载、微调模型,对新手和专家同样友好;
- 社区与资源:拥有活跃社区与丰富的文档、教程和指南。
需要注意的是,这是最常用的方式,但通常需要 GPU 加速——Vision 与 MoE 场景计算量很大,若不做量化,在 CPU 上运行会非常缓慢。
仓库19-slm/python/目录下提供了三个配套 Demo 笔记本,完整可运行代码见:
- Instruct 演示:phi35-instruct-demo.ipynb——加载模型并构造聊天模板后完成中文对话:
import torch from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline torch.random.manual_seed(0) model = AutoModelForCausalLM.from_pretrained( "../phi-3-instruct", # 本地模型目录,也可以传 Hugging Face 模型 ID device_map="cuda", # 加载到 GPU torch_dtype="auto", # 自动选择精度 trust_remote_code=True, # 信任远程自定义代码(Phi 系列需要) ) tokenizer = AutoTokenizer.from_pretrained("../phi-3-instruct") # Phi 系列使用 <|system|> / <|user|> / <|assistant|> 与 <|end|> 标记构造消息 messages = "<|system|>\n 你是我的人工智能助手,协助我用中文解答问题.\n<|end|><|user|>\n 你知道长沙吗? \n<|end|><|assistant|>" pipe = pipeline("text-generation", model=model, tokenizer=tokenizer) generation_args = { "max_new_tokens": 1024, # 最多生成的新 token 数 "return_full_text": False, "temperature": 0.3, "do_sample": False, # 关闭采样,使用贪心解码 } output = pipe(messages, **generation_args) print(output[0]['generated_text'])- Vision 演示:phi35-vision-demo.ipynb——演示了多帧视觉推理的完整链路:先用 OpenCV 从视频中按直方图相似度(阈值
< 0.9)抽取关键帧,再用PIL读取为图片列表,并构造<|image_1|>、<|image_2|>等占位符:
from transformers import AutoModelForCausalLM, AutoProcessor model_id = "../Phi3Vision" model = AutoModelForCausalLM.from_pretrained( model_id, device_map="cuda", trust_remote_code=True, torch_dtype="auto", _attn_implementation='flash_attention_2' ) processor = AutoProcessor.from_pretrained(model_id, trust_remote_code=True, num_crops=4) # 21 帧关键帧 + 占位符构成多帧输入 messages = [{"role": "user", "content": placeholder + "Summarize the video."}] prompt = processor.tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True) inputs = processor(prompt, images, return_tensors="pt").to("cuda:0") generation_args = {"max_new_tokens": 1000, "temperature": 0.0, "do_sample": False} generate_ids = model.generate(**inputs, eos_token_id=processor.tokenizer.eos_token_id, **generation_args) generate_ids = generate_ids[:, inputs['input_ids'].shape[1]:] # 去掉输入部分 response = processor.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]- MoE 演示:phi35_moe_demo.ipynb——从笔记本输出的模型结构可以看到 MoE 架构的源码级细节:
PhiMoEForCausalLM包含 32 层PhiMoEDecoderLayer,其中block_sparse_moe模块由一个输出维度为 16 的gate门控层和16 个PhiMoEBlockSparseTop2MLP专家组成(每个专家含 w1/w2/w3 三个 Linear 与 SiLU 激活,维度 4096→6400→4096)。加载与调用示例如下:
from torch import bfloat16 import transformers model_id = "../Phi3MOE" model = transformers.AutoModelForCausalLM.from_pretrained( model_id, trust_remote_code=True, torch_dtype=bfloat16, device_map='auto', # 自动分配设备(GPU/CPU offload) ) model.eval() tokenizer = transformers.AutoTokenizer.from_pretrained(model_id) # 以 Agent 风格构造指令,要求模型输出 JSON 格式的工具调用 def instruction_format(sys_message: str, query: str): return f'<|system|> {sys_message} <|end|>\n<|user|> {query} <|end|>\n<|assistant|>' pipe = transformers.pipeline("text-generation", model=model, tokenizer=tokenizer) generation_args = {"max_new_tokens": 512, "return_full_text": False, "temperature": 0.3, "do_sample": False} output = pipe(instruction_format(sys_msg, query), **generation_args) print(output[0]['generated_text'])该演示还展示了一个有趣的玩法:通过 system 提示词把 MoE 模型"装扮"成 Agent,要求其以tool_name/input/output的 JSON 结构分步输出"写博客 → 翻译成中文"的规划结果——这正是 17-ai-agents 课程中 Agent 概念的一种轻量落地形态。
方式二:Ollama
Ollama 是一个让 LLM 在本地机器上运行更简单的平台,支持 Llama 3.1、Phi 3、Mistral、Gemma 2 等多种模型,通过把模型权重、配置与数据打包成一个包来简化流程,支持 macOS、Linux 与 Windows。若想摆脱云服务做实验或部署,这是最直接的方式——只需一条命令:
ollama run phi3.5方式三:Foundry Local(离线设备端运行时)
如果你追求完全离线运行(不需要 Azure 订阅、API Key 或网络连接),可以选用微软的Foundry Local——它在你自己的硬件上运行 Phi 类模型,自动选择当前可用的最佳执行提供方(NPU、GPU 或 CPU),并暴露 OpenAI 兼容端点,因此既有openai/Azure AI Inference SDK 代码几乎无需改动即可接入(详见 19-slm/README.md):
winget install Microsoft.FoundryLocal foundry model run phi-3.5-mini也可以在 Python 中直接使用 SDK:
pip install foundry-local-sdkfrom foundry_local import FoundryLocalManager manager = FoundryLocalManager("phi-3.5-mini") print(manager.endpoint, manager.api_key)方式四:ONNX Runtime for GenAI
ONNX Runtime是一个开源项目,提供机器学习模型的高性能推理能力,支持 ONNX(Open Neural Network Exchange)这一表示机器学习模型的标准格式,兼容 PyTorch、TensorFlow/Keras 等深度学习框架及 scikit-learn、LightGBM、XGBoost 等经典库产出的模型,并能在多种硬件、驱动与操作系统上利用硬件加速器配合图优化获得最佳性能。
ONNX Runtime for GENAI则在 ONNX Runtime 之上扩展了对生成式 AI 模型的支持,为 ONNX 模型提供完整的生成式 AI 循环(generative AI loop),包括 ONNX Runtime 推理、logits 处理、搜索与采样、以及 KV 缓存管理。其主要特性:
- 广泛平台支持:Windows、Linux、macOS、Android、iOS;
- 模型支持:LLaMA、GPT-Neo、BLOOM 等流行生成式模型;
- 性能优化:针对 NVIDIA GPU、AMD GPU 等不同硬件加速器做了优化;
- 易用性:提供高度封装的 API,以极少量代码生成文本、图像等内容;用户既可以调用高层
generate()方法,也可以逐 token 循环运行模型的每次迭代,并在循环内按需更新生成参数; - 解码策略:内置贪心/束搜索(greedy/beam search)与 TopP、TopK 采样,以及重复惩罚(repetition penalty)等 logits 处理,还支持自定义评分。
快速上手:
pip install onnxruntime pip install onnxruntime-genai基础文本生成示例:
import onnxruntime_genai as og model = og.Model('path_to_your_model.onnx') tokenizer = og.Tokenizer(model) input_text = "Hello, how are you?" input_tokens = tokenizer.encode(input_text) output_tokens = model.generate(input_tokens) output_text = tokenizer.decode(output_tokens) print(output_text)调用 Phi-3.5-Vision 的多模态示例(同样来自课程 Demo):
import onnxruntime_genai as og model_path = './Your Phi-3.5-vision-instruct ONNX Path' img_path = './Your Image Path' model = og.Model(model_path) processor = model.create_multimodal_processor() tokenizer_stream = processor.create_stream() text = "Your Prompt" prompt = "<|user|>\n" prompt += "<|image_1|>\n" prompt += f"{text}<|end|>\n" prompt += "<|assistant|>\n" image = og.Images.open(img_path) inputs = processor(prompt, images=image) params = og.GeneratorParams(model) params.set_inputs(inputs) params.set_search_options(max_length=3072) generator = og.Generator(model, params) while not generator.is_done(): generator.compute_logits() generator.generate_next_token() new_token = generator.get_next_tokens()[0] output = tokenizer_stream.decode(new_token) print(tokenizer_stream.decode(new_token), end='', flush=True)这段代码展示了 ONNX Runtime GenAI 的逐 token 流式生成模式:GeneratorParams负责配置搜索选项(如max_length),Generator在循环中不断compute_logits()与generate_next_token(),并通过tokenizer_stream边生成边打印——这种模式特别适合实现流式输出效果的聊天界面。
其他厂商的量化推理方案
除上述方式外,还可以基于各厂商的模型推理方法完成量化模型的推理,例如:
- Apple MLX框架 + Apple Metal(苹果设备);
- Qualcomm QNN+ NPU(高通芯片);
- Intel OpenVINO+ CPU/GPU(英特尔平台)。
这些方案的共同目标,都是让 SLM 在端侧设备上以更小的显存/内存占用、更低的功耗跑起来。
进一步学习
通过本课,你已经掌握了 SLM 的基础知识、Phi-3/3.5 家族的型号矩阵,以及云端与本地两大类的六种推理接入方式。若想深入学习 SLM 的更多细节(如模型微调、量化、评测等),推荐继续阅读:
- 本课程的其余章节:00-course-setup/README.md(环境准备)、18-fine-tuning/README.md(微调)、16-open-source-models/README.md(开源模型选型);
- 仓库中的配套演示笔记本目录:19-slm/python,包含 Instruct、Vision、MoE 与 NVIDIA NIM 四个完整可运行示例;
- 课程英文原版 19-slm/README.md 中关于 Foundry Models 替换 GitHub Models、Foundry Local 离线运行的更新说明,可作为本文内容的时效性补充。
现在,选择一条适合你硬件条件的路线,用 Phi-3.5 跑通你的第一个 SLM 应用吧。
【免费下载链接】generative-ai-for-beginners21 Lessons, Get Started Building with Generative AI项目地址: https://gitcode.com/GitHub_Trending/ge/generative-ai-for-beginners
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考