🚀 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は、エンジニアリングコード、アーティファクト生成、関数呼び出し、検索ベースの質問応答、レポート生成などの分野で良好な結果を達成しています。一部のベンチマークでは、GPT-4oやDeepSeek-V3-0324(671B)などの大規模モデルに匹敵する性能を発揮します。
GLM-Z1-32B-0414は、深い思考能力を備えた推論モデルです。このモデルはGLM-4-32B-0414をベースに、コールドスタートと拡張強化学習を行い、数学、コード、論理に関するタスクでさらに学習を行って開発されました。ベースモデルと比較して、GLM-Z1-32B-0414は数学的能力と複雑なタスクを解決する能力が大幅に向上しています。学習過程では、ペアワイズランキングフィードバックに基づく一般的な強化学習も導入され、モデルの一般的な能力がさらに強化されています。
GLM-Z1-Rumination-32B-0414は、熟考能力を備えた深層推論モデルです(OpenAIのDeep Researchをベンチマークとしています)。一般的な深層思考モデルとは異なり、熟考モデルはより長い時間をかけて深い思考を行い、よりオープンエンドで複雑な問題(例えば、2つの都市のAI開発の比較分析と将来の開発計画の作成)を解決します。熟考モデルは、深い思考過程で検索ツールを統合して複雑なタスクを処理し、複数のルールベースの報酬を利用してエンドツーエンドの強化学習をガイドおよび拡張することで学習されています。Z1-Ruminationは、研究スタイルの執筆や複雑な検索タスクで大幅な改善を見せています。
最後に、GLM-Z1-9B-0414は驚きのモデルです。前述の一連の技術を用いて90億の小規模モデルを学習させ、オープンソースの伝統を維持しています。規模が小さいにもかかわらず、GLM-Z1-9B-0414は数学的推論や一般的なタスクでも優れた能力を発揮します。その全体的な性能は、同規模のオープンソースモデルの中ですでにリーディングレベルにあります。特にリソースが制限されたシナリオでは、このモデルは効率と効果のバランスを見事に達成し、軽量なデプロイを求めるユーザーに強力な選択肢を提供します。
🚀 クイックスタート
💻 使用例
基本的な使用法
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": "Let a, b be positive real numbers such that ab = a + b + 3. Determine the range of possible values for 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))
高度な使用法
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": "Let a, b be positive real numbers such that ab = a + b + 3. Determine the range of possible values for 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": "snippet_content_1"},
{"title": "t2", "url":"url2", "snippet": "snippet_content_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 = "main content"
content = mock_click_res
elif function_name == "open":
mock_open_res = "main_content"
content = mock_open_res
else:
raise ValueError("unspport function name!")
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()
📄 ライセンス
このモデルはMITライセンスの下で提供されています。