GLM-4项目微调后工具调用异常问题分析与解决方案
问题背景
在使用GLM-4开源大语言模型时,许多开发者发现通过LLaMA-Factory对GLM-4-9B-Chat模型进行LoRA微调后,虽然普通对话功能正常,但工具调用(Function Call)功能会出现异常。具体表现为当尝试使用工具调用时,系统会抛出"TypeError: can only concatenate str (not "NoneType") to str"的错误。
技术分析
经过深入分析,这个问题源于LLaMA-Factory在导出合并后的模型时,会覆盖原始GLM-4-9B-Chat模型的chat_template配置。chat_template是Transformers库中用于定义对话格式的重要模板,它决定了模型如何处理包含工具调用的特殊对话结构。
GLM-4模型原本包含一个精心设计的chat_template,能够正确处理工具调用的特殊格式。但当使用LLaMA-Factory进行微调并合并权重后,这个关键模板被替换成了一个更简单的版本,导致系统无法正确解析工具调用的消息结构。
解决方案
要解决这个问题,需要手动恢复模型原始的chat_template配置。具体步骤如下:
- 找到微调合并后模型的tokenizer_config.json文件
- 修改其中的chat_template字段,将其恢复为GLM-4原始的工具调用支持模板
- 重新启动服务
以下是修复后的chat_template关键部分示例(已简化):
"[gMASK]<sop>{% for item in messages %}{% if item['tools'] is defined %}<|system|>
你是一个名为GLM-4的人工智能助手...
# 可用工具{% set tools = item['tools'] %}{% for tool in tools %}
## {{ tool['function']['name'] }}
{{ tool['function'] | tojson(indent=4) }}
在调用上述函数时,请使用Json格式表示调用的参数...
{% endfor %}{% endif %}{% if item['content'] %}<|{{ item['role'] }}|>{{ item['metadata'] }}
{{ item['content'] }}{% endif %}{% endfor %}{% if add_generation_prompt %}<|assistant|>{% endif %}"
技术建议
-
微调数据准备:在进行微调时,建议在训练数据中加入工具调用的示例,以保持模型这方面的能力。
-
精度选择:虽然V100显卡理论上不支持bfloat16,但可以通过fp32模拟,不过要注意可能出现的精度问题。
-
模型合并:在合并LoRA权重时,建议检查所有配置文件是否被正确保留,特别是tokenizer相关的配置。
-
测试验证:微调后应全面测试模型各项功能,包括基础对话、工具调用等核心能力。
总结
GLM-4作为一款功能强大的开源大模型,其工具调用能力是其重要特性之一。通过正确配置chat_template,开发者可以在保持微调效果的同时,不损失原有的工具调用功能。这个问题也提醒我们,在进行模型微调时,不仅要关注模型权重,还要注意相关配置文件的完整性。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0152- DDeepSeek-V4-ProDeepSeek-V4-Pro(总参数 1.6 万亿,激活 49B)面向复杂推理和高级编程任务,在代码竞赛、数学推理、Agent 工作流等场景表现优异,性能接近国际前沿闭源模型。Python00
LongCat-Video-Avatar-1.5最新开源LongCat-Video-Avatar 1.5 版本,这是一款经过升级的开源框架,专注于音频驱动人物视频生成的极致实证优化与生产级就绪能力。该版本在 LongCat-Video 基础模型之上构建,可生成高度稳定的商用级虚拟人视频,支持音频-文本转视频(AT2V)、音频-文本-图像转视频(ATI2V)以及视频续播等原生任务,并能无缝兼容单流与多流音频输入。00
auto-devAutoDev 是一个 AI 驱动的辅助编程插件。AutoDev 支持一键生成测试、代码、提交信息等,还能够与您的需求管理系统(例如Jira、Trello、Github Issue 等)直接对接。 在IDE 中,您只需简单点击,AutoDev 会根据您的需求自动为您生成代码。Kotlin03
Intern-S2-PreviewIntern-S2-Preview,这是一款高效的350亿参数科学多模态基础模型。除了常规的参数与数据规模扩展外,Intern-S2-Preview探索了任务扩展:通过提升科学任务的难度、多样性与覆盖范围,进一步释放模型能力。Python00
skillhubopenJiuwen 生态的 Skill 托管与分发开源方案,支持自建与可选 ClawHub 兼容。Python0112