GLM-4-32B-0414:清华大学推出的强大开源大模型系列详解
2025年4月,清华大学知识工程与数据挖掘团队(THUDM)在 Face 上发布了全新的 GLM-4-32B-0414 系列模型。该系列模型在对话、代码生成、函数调用、搜索问答和复杂推理等任务上表现出色,成为开源大模型领域的重要里程碑。本文将详细介绍该系列模型的结构、训练方法、性能表现及其应用场景。
模型概述
GLM-4-32B-0414 系列模型基于 320 亿参数构建,性能可与 的 GPT 系列和 的 V3/R1 系列相媲美。该系列模型支持本地部署,便于用户在本地环境中进行推理和应用。基础模型 GLM-4-32B-Base-0414 在 15 万亿高质量数据上进行了预训练,其中包括大量推理类型的合成数据decode函数,为后续的强化学习奠定了基础。
在后训练阶段,研究团队采用了人类偏好对齐方法decode函数,结合拒绝采样和强化学习技术,提升了模型在指令跟随、工程代码生成和函数调用等方面的性能,从而增强了模型在代理任务中的基本能力。
模型家族成员
GLM-4-32B-0414 系列包括多个子模型,分别针对不同的任务需求进行了优化:
GLM-4-32B-Base-0414
作为基础模型,GLM-4-32B-Base-0414 在多个基准测试中表现优异,尤其在代码生成和特定问答任务上,其性能与更大规模的模型(如 GPT-4o 和 -V3-0324)相当。
GLM-Z1-32B-0414
该模型通过冷启动、扩展强化学习和在数学、代码、逻辑等任务上的进一步训练,显著提升了数学能力和解决复杂任务的能力。训练过程中引入了基于成对排序反馈的通用强化学习,增强了模型的通用能力。
GLM-Z1--32B-0414
这是一个具备深度思考能力的推理模型,能够处理更开放和复杂的问题,如撰写关于两个城市人工智能发展及其未来规划的比较分析。该模型通过端到端的强化学习进行训练,利用真实答案或评分标准对响应进行评分,并在深度思考过程中使用搜索工具,以应对复杂任务。
GLM-Z1-9B-0414
作为一个轻量级模型,GLM-Z1-9B-0414 在数学推理和通用任务上表现出色。在资源受限的场景中,该模型在效率和效果之间实现了良好的平衡,为寻求轻量级部署的用户提供了强大的选择。
应用展示
GLM-4-32B-0414 系列模型在多个实际应用场景中展现了强大的能力:
动画生成
模型能够生成模拟小球在旋转六边形内弹跳的 程序,考虑了重力和摩擦力的影响,实现了现实的碰撞效果。
网页设计
模型可以设计支持自定义函数绘图的绘图板,允许添加和删除自定义函数,并为函数分配颜色,展示了其在前端开发中的应用潜力。
使用模型
下面我们用一个例子介绍新模型的能力,不只可以进行代码、对话,还可以进行函数调用。为构建MCP能力打下了很好的基础。
在本章中,我们将使用 搭建一个具备函数调用能力的对话系统。通过集成外部工具,例如获取实时空气质量信息,我们可以让模型具有类似“工具人”的实用能力。
1. 模型初始化
首先,我们加载 的 和模型
2. 函数调用解析器
我们定义了一个辅助函数来识别和解析模型输出中包含的函数调用指令:
该函数会尝试提取函数名和参数(使用 JSON 或 Python 字面量格式),并返回解析结果。
3. 模拟外部工具:实时空气质量查询
这里我们模拟了一个名为的函数,模拟返回北京、上海等地的空气质量信息:
def realtime_aqi(city): ...
这个函数作为模型可调用的外部 API。
4. 构建
为了告诉模型有哪些函数可用,我们构造一个系统提示信息:
传入的工具列表会被格式化为一段包含函数说明和参数定义的文本,作为 role 的提示。
5. 构造对话上下文
我们将用户的问题以及系统 合并为对话消息:
message = [ {"role": "system", "content": system_prompt}, {"role": "user", "content": "北京和上海今天的天气情况"}]
6. 启动交互循环
通过 和模型进行生成,每次迭代处理模型输出,如果检测到函数调用则执行并把结果以 的形式加入上下文:
7. 运行效果
运行时,模型会先识别用户请求中提到的城市(如“北京”“上海”),然后分别调用函数查询空气质量,最终合成完整的回复。
完整代码如下:
import json
import re
import ast
from transformers import AutoModelForCausalLM, AutoTokenizer
MODEL_PATH = "THUDM/GLM-4-32B-0414"
tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH)
model = AutoModelForCausalLM.from_pretrained(MODEL_PATH, device_map="auto")
def is_function_call(single_message):
"""Determine whether the current system message is a function call."""
pattern = re.compile(r'([^n`]*?)n({.*?})(?=w*n|$)', re.DOTALL)
matches = pattern.findall(single_message)
if not matches:
return False
func_name, args_str = matches[0]
func_name = func_name.strip()
try:
parsed_args = json.loads(args_str)
except json.JSONDecodeError:
try:
parsed_args = ast.literal_eval(args_str)
except:
return False
return {"name": func_name, "arguments": parsed_args}
def realtime_aqi(city):
"""Weather Query Tool"""
if '北京' in city.lower():
return json.dumps({'city': '北京', 'aqi': '10', 'unit': 'celsius'}, ensure_ascii=False)
elif '上海' in city.lower():
return json.dumps({'city': '上海', 'aqi': '72', 'unit': 'fahrenheit'}, ensure_ascii=False)
else:
return json.dumps({'city': city, 'aqi': 'unknown'}, ensure_ascii=False)
def build_system_prompt(tools):
"""Construct system prompt based on the list of available tools."""
if tools is None:
tools = []
value = "# 可用工具"
contents = []
for tool in tools:
content = f"nn## {tool['function']['name']}nn{json.dumps(tool['function'], ensure_ascii=False, indent=4)}"
content += "n在调用上述函数时,请使用 Json 格式表示调用的参数。"
contents.append(content)
value += "".join(contents)
return value
tools = [
{
"type": "function",
"function": {
"name": "realtime_aqi",
"description": "天气预报。获取实时空气质量。当前空气质量,PM2.5,PM10信息",
"parameters": {
"type": "object",
"properties": {
"city": {
"description": "城市名"
}
},
"required": [
"city"
]
}
}
}
]
system_prompt = build_system_prompt(tools)
message = [
{"role": "system", "content": system_prompt},
{"role": "user", "content": "北京和上海今天的天气情况"}
]
print(f"User Message: {message[-1]['content']}")
while True:
inputs = tokenizer.apply_chat_template(
message,
return_tensors="pt",
add_generation_prompt=True,
return_dict=True,
).to(model.device)
generate_kwargs = {
"input_ids": inputs["input_ids"],
"attention_mask": inputs["attention_mask"],
"max_new_tokens": 1024,
"do_sample": True,
}
out = model.generate(**generate_kwargs)
generate_resp = tokenizer.decode(out[0][inputs["input_ids"].shape[1]:-1], skip_special_tokens=False)
stop_sequence = tokenizer.decode(out[0][-1:], skip_speical_tokens=False)
if stop_sequence == "":
print(f"Assistant Response: {generate_resp.strip()}")
break
function_calls = []
for m in generate_resp.split(""):
fc_decode = is_function_call(m.strip())
if fc_decode:
message.append({"role": "assistant", "metadata": fc_decode['name'], "content": json.dumps(fc_decode['arguments'], ensure_ascii=False)})
print(f"Function Call: {fc_decode}")
function_calls.append(fc_decode)
else:
message.append({"role": "assistant", "content": m})
print(f"Assistant Response: {m.strip()}")
for fc in function_calls:
function_response = realtime_aqi(
city=fc["arguments"]["city"],
)
print(f"Function Response: {function_response}")
message.append({"role": "observation", "content": function_response})
性能评估
在多个基准测试中,GLM-4-32B-0414 系列模型表现出色,尤其在代码生成、函数调用和复杂推理任务上,其性能与更大规模的闭源模型相当,甚至在某些任务上超越了它们。此外,轻量级的 GLM-Z1-9B-0414 模型在资源受限的环境中也展现了卓越的性能,证明了其在实际应用中的实用性。
结语
GLM-4-32B-0414 系列模型的发布,标志着清华大学在开源大模型领域的又一重要进展。该系列模型不仅在性能上与国际领先的闭源模型相当,而且在本地部署、轻量化和多样化应用方面提供了更多选择。对于开发者、研究人员和企业用户而言,GLM-4-32B-0414 系列模型无疑是一个值得关注和尝试的强大工具。
限时特惠:本站持续每日更新海量各大内部创业课程,一年会员仅需要98元,全站资源免费下载
点击查看详情
站长微信:Jiucxh