Tmax-9B-MLX-bf16函数调用完全指南:用qwen3_xml格式让本地大模型调用工具
【免费下载链接】Tmax-9B-MLX-bf16项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/Tmax-9B-MLX-bf16
Tmax-9B-MLX-bf16 是一款专为 Apple 芯片优化的 9B 级本地大模型,原生支持qwen3_xml 工具调用格式。本指南将带你完成 Tmax-9B-MLX-bf16 函数调用的完整流程:从环境安装、模型下载,到定义工具、解析
<tool_call>返回结果,再到多轮工具调用闭环。零基础也能让本地大模型真正"动手干活",告别只会聊天的玩具模型。🚀
Tmax-9B-MLX-bf16 是什么?为什么它天生适合函数调用
Tmax-9B-MLX-bf16 是 AI2(艾伦人工智能研究所)Tmax-9B 模型的MLX 格式转换版,权重经过精调,可直接在 Mac(Apple Silicon)上高效运行。几个关键参数让它非常适合本地工具调用:
| 特性 | 参数 |
|---|---|
| 参数量 | 约 8.95B(bf16 精度) |
| 上下文窗口 | 262144 tokens(256K) |
| 注意力架构 | 混合架构:32 层中每 4 层一个全注意力,其余为线性注意力 |
| 模型类型 | qwen3_5(纯文本生成,无视觉模块) |
| 工具格式 | qwen3_xml 兼容(<tool_call>{...}</tool_call>) |
其中最有价值的是混合注意力架构:线性注意力大幅降低了长文本推理的内存开销,配合 256K 超长上下文,模型可以在一次会话里携带大量工具说明和调用历史,这对函数调用场景是天然优势。
这些参数都可以在 config.json 中直接查看,比如layer_types字段就清楚地标明了每一层是linear_attention还是full_attention。
什么是函数调用?本地大模型的"三头六臂"🧩
普通聊天模型只能"说",函数调用(Function Calling / Tool Calling)让模型能够"做"。原理很简单:
- 你把一批工具的说明(函数名、参数、作用)告诉模型;
- 模型判断当前任务需要哪个工具,输出一段结构化指令;
- 你的程序解析指令、真正执行工具(比如查天气、读写文件、调 API);
- 把工具执行结果回传给模型,让它继续推理并给出最终答案。
这样一来,一个 9B 的本地模型就拥有了调用外部世界的能力,相当于给它装上了"手"。
qwen3_xml 格式核心语法:一次看懂 <tool_call> 📐
Tmax-9B-MLX-bf16 使用的工具协议是qwen3_xml 格式,全程由随仓库附带的 chat_template.jinja 模板负责生成和解析。整套协议只有三个关键标记:
1️⃣ 工具清单:<tools>标签(模型"看")
工具的 JSON Schema 会被注入到 system 消息中:
<|im_start|>system # Tools You have access to the following functions: <tools> {"type":"function","function":{"name":"get_weather","description":"查询城市天气","parameters":{"type":"object","properties":{"city":{"type":"string"}}}}} </tools> <|im_end|>2️⃣ 调用指令:<tool_call>标签(模型"说")
当模型决定调用工具时,会严格输出以下 XML 结构:
<tool_call> <function=get_weather> <parameter=city> 北京 </parameter> </function> </tool_call>注意:<function=...>必须嵌套在<tool_call></tool_call>内部,参数放在<parameter=参数名>与</parameter>之间,支持跨行文本。
3️⃣ 执行结果:<tool_response>标签(程序"喂")
你的程序执行完工具后,把结果用<tool_response>包好回传:
<|im_start|>user <tool_response> {"city":"北京","weather":"晴","temperature":25} </tool_response> <|im_end|>这三步循环往复,就是完整的多轮工具调用闭环。而这一切的"翻译官",就是 chat_template.jinja 和 tokenizer_config.json 中声明的tool_parser_type: qwen3_coder解析器。
环境准备与一键安装步骤 🛠️
在开始函数调用之前,先完成环境搭建:
第 1 步:安装 MLX 推理库
pip install -U mlx-lm第 2 步:获取模型权重
Tmax-9B-MLX-bf16 权重约 17.9GB(bf16 精度,4 个分片文件),推荐使用 git clone 下载:
git clone https://gitcode.com/hf_mirrors/mlx-community/Tmax-9B-MLX-bf16第 3 步:快速验证模型能否加载
from mlx_lm import load, generate model, tokenizer = load("./Tmax-9B-MLX-bf16") print(generate(model, tokenizer, prompt="你好", max_tokens=64))💡 提示:
load()会自动读取仓库中的 config.json 与权重索引 model.safetensors.index.json,无需手动指定架构。
让 Tmax-9B-MLX-bf16 调用第一个工具:完整流程 ⚙️
下面是一个最小可运行的函数调用示例。核心思路是:手动按 chat_template 拼装消息 → 生成 → 用正则解析<tool_call>。
from mlx_lm import load, generate model, tokenizer = load("./Tmax-9B-MLX-bf16") tools = [{ "type": "function", "function": { "name": "get_weather", "description": "查询指定城市的当前天气", "parameters": { "type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"], }, }, }] messages = [ {"role": "system", "content": "你是一个智能助手,可以调用工具完成任务。"}, {"role": "user", "content": "北京今天天气怎么样?"}, ] # 关键:通过 chat_template 渲染出带 <tools> 系统提示的完整输入 prompt = tokenizer.apply_chat_template( messages, tools=tools, tokenize=False, add_generation_prompt=True ) out = generate(model, tokenizer, prompt=prompt, max_tokens=256) print(out)模型的输出会类似:
<think> 用户想知道北京的天气,我需要调用 get_weather 工具。 </think> <tool_call> <function=get_weather> <parameter=city> 北京 </parameter> </function> </tool_call>接下来只需要用正则r"<function=(\w+)>.*?<parameter=(\w+)>\n(.*?)\n</parameter>"提取出函数名与参数,就能驱动真实的天气 API 了。
多轮工具调用:让本地大模型自主完成任务 🔄
单次调用只是第一步,真正的价值在于多轮闭环。实现逻辑只有 4 步循环:
- 判断:模型输出里有没有
<tool_call>?没有就直接返回答案,结束; - 执行:解析出函数名和参数,执行本地 Python 函数;
- 回传:把结果包进
<tool_response>,作为user消息追加; - 继续:重新调用
generate,让模型基于工具结果给出最终答复。
import re def run_tool(name, args): if name == "get_weather": return f'{{"city": "{args}", "weather": "晴", "temperature": 25}}' for _ in range(5): # 最多 5 轮,防止死循环 out = generate(model, tokenizer, prompt=prompt, max_tokens=256) match = re.search(r"<function=(\w+)>\s*<parameter=(\w+)>\s*(.*?)\s*</parameter>", out, re.S) if not match: print("最终回答:", out) break name, key, value = match.groups() result = run_tool(name, value) messages.append({"role": "assistant", "content": out}) messages.append({"role": "user", "content": f"<tool_response>{result}</tool_response>"}) prompt = tokenizer.apply_chat_template( messages, tools=tools, tokenize=False, add_generation_prompt=True )配合模板中的multi_step_tool逻辑(见 chat_template.jinja),模型就能连续完成"查天气 → 查路线 → 给建议"这类组合任务。
常见问题与避坑指南 ⚠️
❌ 问题 1:bf16 版本流式输出卡住
官方基准测试明确指出:Tmax-9B-MLX-bf16 权重可以正常加载,但在流式推理(streaming)场景下首个 token 迟迟不返回(测试 43 分钟无响应)。如果要做实时流式对话,建议改用同系列的 4bit / 6bit / 8bit 量化版本,它们可以流畅流式输出。批量非流式生成则不受影响。
❌ 问题 2:工具格式不生效
务必使用仓库自带的 chat_template.jinja 模板渲染输入。<tools>、<tool_call>、<tool_response>这些特殊标记全部由模板生成,跳过模板手写很容易格式错位,导致模型无法正确解析。
❌ 问题 3:误以为支持图像输入
这是一个纯文本生成的 MLX 版本,原版虽然带有视觉配置,但权重中不包含任何视觉张量。这个镜像仓库已经剥离了残留的vision_config,因此不能输入图片,请只用于文本与工具调用场景。
❌ 问题 4:显存/内存不足
bf16 全精度加载约需 18GB 内存。8GB 内存的 Mac 建议使用量化版本,16GB 内存可勉强运行本版本但建议关闭其他大内存应用。
总结:把本地大模型变成真正的"助手" ✨
Tmax-9B-MLX-bf16 函数调用并不复杂:一个模型 + 一套 qwen3_xml 协议 + 一段解析代码,就能让本地大模型调用任意工具。记住三个核心标记<tools>、<tool_call>、<tool_response>,再配合 chat_template.jinja 的规范渲染,你就能搭建出属于自己的本地 AI 助手——查天气、管日程、读文件、调 API,全部离线运行,数据不出本机。
现在就 clone 仓库开始动手吧,你的本地大模型,值得拥有"手"。
【免费下载链接】Tmax-9B-MLX-bf16项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/Tmax-9B-MLX-bf16
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考