Ling-3.0-flash-VL chat_template.jinja 完整拆解:读懂 enable_thinking、工具调用与视觉 ID 注入的 6 个关键段落
Ling-3.0-flash-VL是蚂蚁集团(inclusionAI)开源的 124B 参数原生多模态模型,支持图片与视频输入、256K 上下文,每个 token 仅激活 5.5B 参数。它的 chat_template.jinja 只有 183 行,却把enable_thinking 思考开关、工具调用(tool calling)和视觉 ID 注入三大核心能力写得清清楚楚,是多模态模型模板里难得的"教科书级"范例。本文将这份模板逐段拆解,帮你彻底看懂它的每一行在做什么。
模板速览:3 个可配置参数
在看细节之前,先认识模板暴露给调用方的 3 个参数(都通过chat_template_kwargs传入):
| 参数 | 默认值 | 作用 |
|---|---|---|
enable_thinking | true | 思考模式总开关,控制模型是否先输出推理过程 |
preserve_thinking | true | 多轮对话中是否保留历史轮次的思考内容 |
add_vision_id | 未定义(不添加) | 为图片/视频插入Picture 1:、Video 1:编号前缀 |
模板生成的最终格式如下:每段内容用<role>SYSTEM</role>、<role>HUMAN</role>等角色标签包裹,段落之间以特殊 token<|role_end|>分隔。
第 5–15 行:enable_thinking 思考开关如何生效
模板开头对enable_thinking做了归一化:
{%- set enable_thinking = enable_thinking if enable_thinking is defined else true %}- 不传参时默认为开启——这正是官方文档说"Thinking is enabled by default"的实现来源;
- 开启时生成指令
detailed thinking on,关闭时生成detailed thinking off,这段指令后面会写进系统区,直接告诉模型该不该先"想"再答; - 需要按请求关闭思考时,只需在请求里传
"chat_template_kwargs": {"enable_thinking": false}即可。
紧接着的preserve_thinking(默认true)决定多轮对话中,历史轮次的思考过程要不要继续带给模型——保留它可以维持推理连续性,代价是上下文变长。
第 18–57 行:视觉 ID 注入的计数器与渲染宏
namespace 计数器
{%- set image_count = namespace(value=0) %} {%- set video_count = namespace(value=0) %}这里用 Jinja 的namespace对象实现跨宏调用共享的计数器——普通变量出了宏就失效,namespace可以"带回",这是模板里最关键的小技巧。
render_content 宏:多模态内容的统一入口
宏render_content负责把一条消息的内容渲染成文本:
- 字符串:原样输出;
- 列表(OpenAI 多模态 content 格式):逐项判断类型
image→ 输出占位符 `
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考