Granite 4.0 Nano语言模型:轻量级AI的强大能力与实用指南
什么是Granite 4.0 Nano语言模型?
如果你正在寻找一款既能在资源有限的设备上高效运行,又能支持多种复杂任务的AI模型,那么Granite 4.0 Nano语言模型或许正是你需要的。它是IBM推出的轻量级、最先进的开源基础模型,专为效率和速度至关重要的场景设计。
与那些需要庞大计算资源的大型模型不同,Granite 4.0 Nano可以在智能手机、物联网设备等资源受限的硬件上运行。这意味着它能支持离线应用,更好地保护用户隐私——毕竟数据不需要上传到云端处理。
这些模型的应用范围相当广泛,包括代码补全(通过专门的前缀和后缀标记实现“中间填充”功能)、检索增强生成(RAG)、工具调用以及结构化JSON输出等。无论你是开发者想集成到应用中,还是企业寻找适合特定场景的AI解决方案,它都有很大的实用价值。
更重要的是,所有Granite 4.0 Nano模型都基于Apache 2.0许可证公开发布,这意味着你可以免费将其用于研究和商业目的。在数据处理和训练过程中,IBM还融入了企业场景特有的治理、风险和合规(GRC)评估,以及标准的数据清理和文档质量审查流程,让模型更适合企业级应用和定制化需求。
Granite 4.0 Nano有哪些型号可选?
Granite 4.0 Nano模型家族提供了多种型号,以满足不同场景的需求。按参数规模分,有350M和1B两种;按架构分,有纯密集型(dense)和密集-混合型(dense-hybrid);按训练阶段分,有基础模型(预训练后的 checkpoint)和指令模型(针对对话、指令遵循、实用性和安全性进行微调的checkpoint)。
具体型号如下:
-
ibm-granite/granite-4.0-1b-base(1B参数基础模型,纯密集架构) -
ibm-granite/granite-4.0-1b(1B参数指令模型,纯密集架构) -
ibm-granite/granite-4.0-h-1b-base(1B参数基础模型,密集-混合架构) -
ibm-granite/granite-4.0-h-1b(1B参数指令模型,密集-混合架构) -
ibm-granite/granite-4.0-350m-base(350M参数基础模型,纯密集架构) -
ibm-granite/granite-4.0-350m(350M参数指令模型,纯密集架构) -
ibm-granite/granite-4.0-h-350m-base(350M参数基础模型,密集-混合架构) -
ibm-granite/granite-4.0-h-350m(350M参数指令模型,密集-混合架构)
其中,带有“h”的型号采用了混合架构,结合了Transformer和SSM(状态空间模型)的优势,在效率和性能之间取得了更好的平衡;而不带“h”的型号则采用传统Transformer架构,适合那些对混合架构支持尚未优化的工作负载(如Llama.cpp环境)。
Granite 4.0 Nano能做什么?核心能力详解
Granite 4.0 Nano虽然体型小巧,但能力却十分全面。无论是基础的问答交互,还是复杂的工具调用、代码补全,它都能应对自如。下面我们逐一介绍它的核心能力及使用方法。
1. 基础推理:简单对话与问答
最基础的用法是让模型处理用户的提问,进行对话或回答问题。比如询问常识性问题、解释概念等。
如何操作?
只需几步即可实现:
-
安装必要的库(torch、transformers等) -
加载模型和分词器 -
构造对话内容 -
生成并输出结果
以下是一个使用Granite-4.0-350M模型进行基础推理的示例代码:
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
# 选择设备,"auto"会自动选择可用设备(GPU优先)
device = "auto"
# 模型路径,可替换为其他型号
model_path = "ibm-granite/granite-4.0-350m"
# 加载分词器
tokenizer = AutoTokenizer.from_pretrained(model_path)
# 加载模型,若使用CPU可去掉device_map参数
model = AutoModelForCausalLM.from_pretrained(model_path, device_map=device)
model.eval()
# 构造对话内容
chat = [
{ "role": "user", "content": "What is the name of the durable rock known for being one of the hardest natural building stones?"},
]
# 应用对话模板,准备输入
chat = tokenizer.apply_chat_template(chat, tokenize=False, add_generation_prompt=True)
# tokenize输入文本
input_tokens = tokenizer(chat, return_tensors="pt").to(device)
# 生成输出
output = model.generate(**input_tokens,
max_new_tokens=150)
# 解码并打印结果
output = tokenizer.batch_decode(output)
print(output)
这段代码的逻辑很清晰:先准备好对话内容,通过分词器处理成模型能理解的格式,再让模型生成回答,最后将结果解码为自然语言。你可以根据需要修改model_path来使用不同型号的模型,也可以调整max_new_tokens控制生成内容的长度。
2. 工具调用:让AI与外部系统交互
在很多场景中,AI需要调用外部工具(如API、函数)才能完成任务。比如查询天气、验证车辆信息等。Granite 4.0 Nano具备强大的工具调用能力,能根据用户需求选择合适的工具,并处理工具返回的结果。
它能解决什么问题?
-
当需要实时数据(如天气、股票)时,调用对应的API获取 -
处理特定领域的任务(如验证VIN码、查询车辆注册信息) -
多轮交互中,根据前一步结果决定是否继续调用工具
使用示例:验证车辆VIN码与处理后续请求
下面的代码展示了模型如何调用工具验证VIN码,并在面对无法处理的请求时礼貌回复:
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
device = "cuda" # 若使用CPU,改为"cpu"并去掉模型加载时的device_map
model_path = "ibm-granite/granite-4.0-350m"
tokenizer = AutoTokenizer.from_pretrained(model_path)
# 加载模型,CPU用户可去掉device_map参数
model = AutoModelForCausalLM.from_pretrained(model_path, device_map=device)
model.eval()
# 构造对话历史
chat=[
{"role": "user", "content": "我想买一辆二手卡车用于建筑工作,卖家提供了VIN码:1FMXK92W8YPA12345,说车辆注册在佐治亚州。你能验证这个VIN码是否有效,是否与注册车辆匹配吗?"},
{"role": "assistant",
"content": "",
"tool_calls": [
{
"function": {
"name": "check_valid_vin",
"arguments": {"vin": "1FMXK92W8YPA12345"}
}
}
]
},
{"role": "tool", "content": "{\"valid\": true, \"vin_details\": {\"make\": \"Ford\", \"model\": \"F-150\", \"year\": 2020, \"vehicle_type\": \"Truck\", \"registration_status\": \"Active\", \"registration_state\": \"GA\", \"odometer\": 82345, \"title_status\": \"Clear\", \"lienholder\": null, \"recall_history\": \"No active recalls\"}, \"notes\": \"VIN有效且在佐治亚州注册。PPSR留置权检查完成——未发现担保权益。车牌验证需要单独的DMV查询,目前此工具不支持。\"}"},
{"role": "user", "content": "我还在考虑从德克萨斯州的官方经销商处购买一辆新的福特F-150。你能提供这种卡车在该州的成本估算吗?"},
]
# 定义可用工具列表(遵循OpenAI函数定义格式)
tools = [
{
"type": "function",
"function": {
"name": "check_valid_registration",
"description": "验证车辆注册号在特定州是否有效,并返回注册车辆的详细信息(若有效)。用于验证车辆注册状态及获取所有权/车辆数据。",
"parameters": {
"type": "object",
"properties": {
"reg": {
"type": "string",
"description": "标准格式的车辆注册号(如ABC123或XYZ-7890)"
},
"state": {
"type": "string",
"description": "车辆注册所在州的两字母缩写(如加利福尼亚州为CA,得克萨斯州为TX)"
}
},
"required": ["reg", "state"],
}
}
},
{
"type": "function",
"function": {
"name": "check_valid_vin",
"description": "验证车辆识别号(VIN)是否与官方记录中的注册车辆对应。若有效,返回包括品牌、型号、年份、注册状态和所有权信息在内的综合车辆详情。",
"parameters": {
"type": "object",
"properties": {
"vin": {
"type": "string",
"description": "17位车辆识别号,需遵循标准VIN格式(大写字母数字,无空格或特殊字符)。内部会进行大小写不敏感验证。"
}
},
"required": ["vin"],
}
}
},
{
"type": "function",
"function": {
"name": "ppsr_lookup_by_vin",
"description": "通过VIN对车辆进行PPSR(个人财产安全登记)查询。返回包括担保权益、所有权状态和官方PDF证书URL的搜索结果。用于验证车辆历史或担保声明。",
"parameters": {
"type": "object",
"properties": {
"vin": {
"type": "string",
"description": "17位字母数字车辆识别号(符合ISO 3779标准),大小写不敏感。例如:'1HGCM82633A123456'"
}
},
"required": ["vin"]
}
}
},
]
# 应用对话模板,传入工具信息
chat = tokenizer.apply_chat_template(chat,tokenize=False, add_generation_prompt=True, tools=tools)
# 处理输入并生成输出
input_tokens = tokenizer(chat, return_tensors="pt").to(device)
output = model.generate(** input_tokens,
max_new_tokens=1000)
output = tokenizer.batch_decode(output)
print(output[0])
在这个例子中,模型首先接收到验证VIN码的请求,由于check_valid_vin工具可用,它会生成对应的工具调用;当工具返回结果后,用户又询问新卡车的成本估算,但可用工具中没有相关功能,模型会生成道歉信息说明无法提供帮助。
3. 结构化JSON输出:规范数据格式
在处理需要结构化数据的场景(如解析表单、生成标准化报告)时,Granite 4.0 Nano能精确按照指定的JSON schema生成输出,避免格式混乱带来的后续处理问题。
适用场景:
-
解析IT支持工单,提取关键信息(如请求人、优先级、问题类别) -
将非结构化文本转换为数据库可直接存储的格式 -
生成符合API要求的请求参数
使用示例:解析IT支持工单为JSON格式
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
device = "cuda" # CPU用户改为"cpu"
model_path = "ibm-granite/granite-4.0-350m"
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(model_path, device_map=device) # CPU用户去掉device_map
model.eval()
# 构造对话,系统提示定义JSON格式要求
chat = [
{
"role": "system",
"content": "你是一个乐于助人的助手,仅以JSON格式回答。以下是你必须遵循的JSON schema:\n<schema>\n{\"title\":\"ITSupportTicket\",\"type\":\"object\",\"properties\":{\"ticketID\":{\"type\":\"string\"},\"requester\":{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\"},\"email\":{\"type\":\"string\",\"format\":\"email\"}},\"required\":[\"name\",\"email\"]},\"category\":{\"type\":\"string\",\"enum\":[\"Access\",\"Hardware\",\"Software\",\"Network\",\"Other\"]},\"priority\":{\"type\":\"string\",\"enum\":[\"Low\",\"Medium\",\"High\",\"Critical\"]},\"description\":{\"type\":\"string\"},\"reportedAt\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"ticketID\",\"requester\",\"category\",\"priority\",\"description\",\"reportedAt\"]}\n</schema>\n"
},
{
"role": "user",
"content": "请帮我分解以下IT工单内容并进行分类。\n# 工单内容:\n我在家无法访问VPN——认证后一直超时。请标记为高优先级。我是Jordan Lee,邮箱是jordan.lee@acme.co。工单编号设为TCK-10944。我今天大约在2025-10-01T08:35:00Z发现了这个问题。"
}
]
# 应用对话模板
chat = tokenizer.apply_chat_template(chat,tokenize=False, add_generation_prompt=True)
# 生成并输出结果
input_tokens = tokenizer(chat, return_tensors="pt").to(device)
output = model.generate(**input_tokens,
max_new_tokens=200)
output = tokenizer.batch_decode(output)
print(output[0])
运行这段代码后,模型会严格按照系统提示中定义的schema,从用户提供的工单内容中提取信息,生成结构完整的JSON,包含工单ID、请求人信息、问题类别(这里会被归类为“Network”)、优先级(“High”)等关键字段。
4. 代码补全(FIM):填充中间缺失代码
对于开发者来说,“中间填充”(Fill-in-the-Middle,FIM)功能非常实用——它能在已有代码的前缀和后缀之间,智能生成缺失的部分,提高编程效率。
使用场景:
-
补全函数内部的逻辑实现 -
填充循环或条件判断中的代码 -
完善未完成的算法步骤
使用示例:补全用户数据汇总函数
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
device = "cuda" # CPU用户改为"cpu"
model_path = "ibm-granite/granite-4.0-350m"
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(model_path, device_map=device) # CPU用户去掉device_map
model.eval()
# 构造包含前缀、后缀的提示,中间部分需要模型补全
prompt = """<|fim_prefix|>
def summarize_users(users):
\"\"\"
给定一个包含'name'和'age'的用户字典列表,
返回包含平均年龄和姓名列表的汇总信息。
\"\"\"
summary = {}
<|fim_suffix|>
return summary
<|fim_middle|>
"""
# 构造对话
chat = [
{ "role": "user", "content": prompt},
]
# 处理输入并生成代码
chat = tokenizer.apply_chat_template(chat, tokenize=False, add_generation_prompt=True)
input_tokens = tokenizer(chat, return_tensors="pt").to(device)
output = model.generate(** input_tokens,
max_new_tokens=100)
output = tokenizer.batch_decode(output)
print(output[0])
在这个例子中,summarize_users函数的开头(前缀)和结尾(后缀)已经给出,模型需要在中间填充计算平均年龄和收集姓名的逻辑。生成的代码会自动完成这部分工作,让函数能够正常运行。
Granite 4.0 Nano的性能如何?评估结果解析
选择模型时,性能是重要的考量因素。Granite 4.0 Nano在多个基准测试中表现出色,尤其考虑到它的参数规模,其性能优势更为明显。
各型号性能对比
不同型号的Granite 4.0 Nano在各类任务中的表现如下表所示(数据来源于模型官方评估):
| 基准测试 | 评估指标 | 350M 纯密集 | H 350M 密集混合 | 1B 纯密集 | H 1B 密集混合 |
|---|---|---|---|---|---|
| 通用任务 | |||||
| MMLU | 5-shot | 35.01 | 36.21 | 59.39 | 59.74 |
| MMLU-Pro | 5-shot, CoT | 12.13 | 14.38 | 34.02 | 32.86 |
| BBH | 3-shot, CoT | 33.07 | 33.28 | 60.37 | 59.68 |
| AGI EVAL | 0-shot, CoT | 26.22 | 29.61 | 49.22 | 52.44 |
| GPQA | 0-shot, CoT | 24.11 | 26.12 | 29.91 | 29.69 |
| 对齐任务 | |||||
| IFEval | Instruct, Strict | 61.63 | 67.63 | 80.82 | 82.37 |
| IFEval | Prompt, Strict | 49.17 | 55.64 | 73.94 | 74.68 |
| IFEval | Average | 55.4 | 61.63 | 77.38 | 78.53 |
| 数学任务 | |||||
| GSM8K | 8-shot | 30.71 | 39.27 | 76.35 | 69.83 |
| GSM Symbolic | 8-shot | 26.76 | 33.7 | 72.3 | 65.72 |
| Minerva Math | 0-shot, CoT | 13.04 | 5.76 | 45.28 | 49.4 |
| DeepMind Math | 0-shot, CoT | 8.45 | 6.2 | 34 | 34.98 |
| 代码任务 | |||||
| HumanEval | pass@1 | 39 | 38 | 74 | 73 |
| HumanEval+ | pass@1 | 37 | 35 | 69 | 68 |
| MBPP | pass@1 | 48 | 49 | 65 | 69 |
| MBPP+ | pass@1 | 38 | 44 | 57 | 60 |
| CRUXEval-O | pass@1 | 23.75 | 25.5 | 33.13 | 36 |
| BigCodeBench | pass@1 | 11.14 | 11.23 | 30.18 | 29.12 |
| 工具调用任务 | |||||
| BFCL v3 | – | 39.32 | 43.32 | 54.82 | 50.21 |
| 多语言任务 | |||||
| MULTIPLE | pass@1 | 15.99 | 14.31 | 32.24 | 36.11 |
| MMMLU | 5-shot | 28.23 | 27.95 | 45 | 49.43 |
| INCLUDE | 5-shot | 27.74 | 27.09 | 42.12 | 43.35 |
| MGSM | 8-shot | 14.72 | 16.16 | 37.84 | 27.52 |
| 安全性 | |||||
| SALAD-Bench | – | 97.12 | 96.55 | 93.44 | 96.4 |
| AttaQ | – | 82.53 | 81.76 | 85.26 | 82.85 |
数据解读
从表格中可以看出:
-
1B参数型号在几乎所有任务上的表现都优于350M型号,这符合模型参数规模与性能的一般关系 -
混合架构(H系列)在部分任务(如对齐任务、多语言任务)上表现更优,体现了其架构设计的优势 -
在代码任务(如HumanEval、MBPP)中,1B型号的pass@1指标达到65-74,说明其代码生成能力较强 -
安全性相关的基准测试中,各型号得分均在80以上,表明模型在安全方面有较好的表现
此外,与同参数规模的其他模型相比,Granite 4.0 Nano在综合能力上有明显优势。在知识、数学、代码和安全等领域的平均准确率,以及指令遵循(IFEval)、工具调用(BFCLv3)等关键任务上,都处于领先水平。


如何下载和安装Granite 4.0 Nano模型?
如果你想亲自体验Granite 4.0 Nano,下载和安装过程非常简单。
下载模型
你可以通过Git直接克隆模型仓库。以ibm-granite/granite-4.0-350m为例,在终端中运行以下命令:
git clone https://huggingface.co/ibm-granite/granite-4.0-350m
如果你需要其他型号,只需将命令中的模型路径替换为对应的型号名称(如ibm-granite/granite-4.0-h-1b)。
安装依赖库
使用模型前,需要安装必要的Python库。推荐使用以下命令:
pip install torch torchvision torchaudio
pip install accelerate
pip install transformers
-
torch:PyTorch深度学习框架,模型运行的基础 -
accelerate:用于加速模型训练和推理的工具 -
transformers:Hugging Face的库,提供模型加载和使用的接口
安装完成后,就可以按照前面介绍的示例代码使用模型了。
常见问题解答(FAQ)
1. Granite 4.0 Nano支持哪些语言?
目前支持英语、德语、西班牙语、法语、日语、葡萄牙语、阿拉伯语、捷克语、意大利语、韩语、荷兰语和中文。如果你需要其他语言,可以通过微调模型来扩展其支持范围。
2. 这些模型可以用于商业项目吗?
可以。所有Granite 4.0 Nano模型都基于Apache 2.0许可证发布,允许免费用于研究和商业目的。
3. 运行模型需要什么硬件配置?
由于模型体型小巧,350M参数型号可以在普通CPU上运行,也能在中低端GPU(如NVIDIA GTX系列)上高效运行;1B参数型号建议使用具有一定显存的GPU(如NVIDIA RTX系列)以获得更好的性能。对于资源受限的设备(如智能手机),可以通过优化部署(如量化)进一步降低资源需求。
4. 如何选择合适的型号?
-
若优先考虑资源占用,选择350M参数型号 -
若需要更好的性能,选择1B参数型号 -
若使用环境对混合架构有优化支持,优先选择H系列(密集-混合架构) -
若需要兼容Llama.cpp等对传统Transformer更友好的框架,选择非H系列(纯密集架构)
5. 可以对模型进行微调以适应特定任务吗?
可以。Granite 4.0 Nano的紧凑尺寸使其非常适合在特定领域进行微调,且不需要大规模的计算资源。你可以使用自己的数据集对模型进行微调,以提升其在特定任务上的表现。
6. 如何获取模型的详细评估报告?
各型号的核心评估结果可以在其对应的Hugging Face模型卡片中找到,更全面的扩展评估报告可参考官方文档。你也可以访问Granite 4.0 Nano的Hugging Face集合获取更多信息。
7. 遇到问题或有反馈该如何处理?
你可以通过两种方式提供反馈或提问:
-
访问模型的Hugging Face仓库,进入“Community”标签,点击“New discussion” -
在GitHub讨论页面发布问题或评论
总结
Granite 4.0 Nano语言模型家族以其轻量级、高性能的特点,为资源受限设备上的AI应用提供了理想选择。无论是基础的问答交互、复杂的工具调用,还是结构化数据生成、代码补全,它都能胜任。
凭借Apache 2.0许可证的灵活性,以及对多语言、多任务的支持,这些模型在研究和商业场景中都有广泛的应用前景。如果你正在寻找一款易于部署、功能全面且成本可控的AI模型,Granite 4.0 Nano值得一试。
如果你想深入了解或开始使用,可以访问Hugging Face集合或官方文档获取更多资源。
引用说明
如果你在研究或项目中使用了Granite 4.0 Nano模型,请按以下格式引用:
@misc{granite2025,
author = {{IBM Research}},
title = {Granite 4.0 Nano Language Models},
year = {2025},
howpublished = {\url{https://github.com/ibm-granite/granite-4.0-nano-language-models}},
note = {Accessed: 2025-10-23}
}

