许可证:MIT
语言:
- 中文
- 英文
任务类型:文本生成
库名称:transformers
GLM-4-Z1-Rumination-32B-0414
简介
GLM家族迎来了新一代开源模型——GLM-4-32B-0414系列,其参数量达320亿。其性能与OpenAI的GPT系列、DeepSeek的V3/R1系列相当,并支持非常友好的本地部署特性。GLM-4-32B-Base-0414基于15T高质量数据预训练,其中包含大量推理型合成数据,为后续强化学习扩展奠定了基础。在后训练阶段,除了针对对话场景的人类偏好对齐外,我们还通过拒绝采样、强化学习等技术增强了模型在指令跟随、工程代码和函数调用等方面的表现,强化了智能体任务所需的原子能力。GLM-4-32B-0414在工程代码、Artifact生成、函数调用、基于搜索的问答、报告生成等领域取得了良好效果,部分基准测试甚至可与GPT-4o、DeepSeek-V3-0324(671B)等更大规模的模型媲美。
GLM-Z1-32B-0414是一款具备深度思考能力的推理模型。这是基于GLM-4-32B-0414通过冷启动和扩展强化学习,以及针对数学、代码和逻辑任务的进一步训练开发而成。相比基础模型,GLM-Z1-32B-0414显著提升了数学能力和复杂任务解决能力。在训练过程中,我们还引入了基于成对排序反馈的通用强化学习,进一步增强了模型的通用能力。
GLM-Z1-Rumination-32B-0414是一款具备反刍能力的深度推理模型(对标OpenAI的深度研究)。与典型的深度思考模型不同,反刍模型通过更长时间的深度思考来解决更开放和复杂的问题(例如撰写两座城市AI发展对比分析及其未来发展计划)。反刍模型在深度思考过程中整合搜索工具以处理复杂任务,并通过利用多规则奖励引导和扩展端到端强化学习进行训练。Z1-Rumination在研究式写作和复杂检索任务上表现出显著提升。
最后,GLM-Z1-9B-0414是一个惊喜。我们采用上述系列技术训练了一款9B小规模模型,延续了开源传统。尽管规模较小,GLM-Z1-9B-0414在数学推理和通用任务上仍展现出优秀能力,其综合性能已处于同规模开源模型的领先水平。尤其在资源受限场景下,该模型实现了效率与效果的绝佳平衡,为轻量化部署需求的用户提供了有力选择。
推理代码
确保使用transformers>=4.51.3
。
from transformers import AutoModelForCausalLM, AutoTokenizer
MODEL_PATH = "THUDM/GLM-Z1-Rumination-32B-0414"
tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH)
model = AutoModelForCausalLM.from_pretrained(MODEL_PATH, device_map="auto")
message = [{"role": "user", "content": "设a、b为正实数,且ab = a + b + 3。确定a + b的可能取值范围。"}]
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"],
"temperature": 0.95,
"top_p": 0.7,
"do_sample": True,
}
out = model.generate(**generate_kwargs)
print(tokenizer.decode(out[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True))
函数调用
默认情况下,该模型目前支持以下function
调用:
search
:通过关键词搜索并返回搜索结果
click
:点击搜索结果中的特定网页查看详情
open
:打开固定URL查看详细内容
finish
:完成信息收集并开始撰写
以下是一个简单的工作流,帮助您快速连接流程。
from transformers import AutoModelForCausalLM, AutoTokenizer
import re
import json
MODEL_PATH = "THUDM/GLM-4-Z1-Rumination-32B-0414"
tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH)
model = AutoModelForCausalLM.from_pretrained(MODEL_PATH, device_map="auto")
messages = [{"role": "user", "content": "设a、b为正实数,且ab = a + b + 3。确定a + b的可能取值范围。"}]
generate_kwargs = {
"temperature": 0.95,
"top_p": 0.7,
"do_sample": True,
"max_new_tokens": 16384
}
def get_assistant():
inputs = tokenizer.apply_chat_template(
messages,
return_tensors="pt",
add_generation_prompt=True,
return_dict=True,
).to(model.device)
out = model.generate(input_ids=inputs["input_ids"], **generate_kwargs)
return tokenizer.decode(out[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True).strip()
def get_observation(function_name, args):
content = None
if function_name == "search":
mock_search_res = [
{"title": "t1", "url":"url1", "snippet": "摘要内容_1"},
{"title": "t2", "url":"url2", "snippet": "摘要内容_2"}
]
content = "\n\n".join([f"【{i}†{res['title']}†{res['url']}\n{res['snippet']}】"] for i, res in enumerate(mock_search_res))
elif function_name == "click":
mock_click_res = "主要内容"
content = mock_click_res
elif function_name == "open":
mock_open_res = "主要内容"
content = mock_open_res
else:
raise ValueError("不支持的功能名称!")
return content
def get_func_name_args(llm_text):
function_call = re.sub(r'.*?</think>', '', llm_text, flags=re.DOTALL)
function_call = json.loads(function_call)
action = function_call['name']
params = function_call['arguments']
return action, params
def pipeline():
end_str = "{\"name\": \"finish\", \"arguments\": {}}"
response = get_assistant()
messages.append({"role": "assistant", "content": response})
max_turns, turns = 35, 1
while not response.endswith(end_str) and turns < max_turns:
action, params = get_func_name_args(response)
observation = get_observation(action, params)
messages.append({"role": "observation", "content": observation})
response = get_assistant()
messages.append({"role": "assistant", "content": response})
turns += 1
if response.endswith(end_str):
final_answer = get_assistant()
else:
final_answer = None
return final_answer
pipeline()