计划中的功能:本文档描述的 mint.renderers 模块尚未实现。此页面作为即将推出的多轮训练支持的设计参考。
多轮训练
多轮训练允许你在多轮对话数据上训练模型。MinT 使用 renderer 系统 高效处理多轮对话。
为什么需要 Renderer?
在多轮 RL 中,每一轮都基于之前的轮次。朴素方法每轮都重新计算整个对话,导致 O(T^2) 复杂度。MinT 的 renderer 系统使用 extension property 实现 O(T) 复杂度。
朴素方法 (O(T^2)):
Turn 1: [system, user1, assistant1]
Turn 2: [system, user1, assistant1, user2, assistant2]
Turn 3: [system, user1, assistant1, user2, assistant2, user3, assistant3]
...
Extension property (O(T)):
Turn 1: [system, user1, assistant1]
Turn 2: [user2, assistant2] # 扩展 Turn 1
Turn 3: [user3, assistant3] # 扩展 Turn 2使用 Renderer
MinT 提供常见聊天格式的内置 renderer:
from mint.renderers import get_renderer
# 获取 Qwen3 instruct 格式的 renderer
renderer = get_renderer("qwen3_instruct")
# 渲染对话
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Hello!"},
{"role": "assistant", "content": "Hi there!"},
{"role": "user", "content": "How are you?"},
]
tokens = renderer.render(messages, tokenizer)可用 Renderer
| Renderer | 模型系列 | 格式 |
|---|---|---|
qwen3_instruct | Qwen3 | <|im_start|>role\ncontent<|im_end|> |
kimi_k2 | Kimi-K2 | 类似 Qwen3,支持 thinking blocks |
deepseekv3 | DeepSeek-V3 | DeepSeek 聊天格式 |
role_colon | 通用 | role: content\n |
多轮 RL 示例
import mint
from mint import types
from mint.renderers import get_renderer
service_client = mint.ServiceClient()
training_client = service_client.create_lora_training_client(
base_model="Qwen/Qwen3-4B-Instruct-2507",
rank=16
)
tokenizer = training_client.get_tokenizer()
renderer = get_renderer("qwen3_instruct")
# 多轮交互环境
def run_episode():
messages = [{"role": "system", "content": "Count down from the given number."}]
total_reward = 0
for turn in range(3):
# 添加用户消息
messages.append({"role": "user", "content": f"Start from {5 - turn}"})
# 获取模型响应
prompt_tokens = renderer.render(messages, tokenizer)
result = sampling_client.sample(
prompt=types.ModelInput.from_ints(tokens=prompt_tokens),
sampling_params=types.SamplingParams(max_tokens=50, temperature=0.8)
).result()
response = tokenizer.decode(result.sequences[0].tokens)
messages.append({"role": "assistant", "content": response})
# 计算本轮 reward
reward = compute_reward(response, expected=f"{5-turn}, {4-turn}, ...")
total_reward += reward
return messages, total_rewardExtension Property 优化
训练多轮数据时,使用 extension property 避免冗余计算:
# 不要每轮重新计算完整对话:
# Turn 1: forward([sys, u1, a1])
# Turn 2: forward([sys, u1, a1, u2, a2]) # 冗余前缀
# 使用 extension:
# Turn 1: forward([sys, u1, a1])
# Turn 2: forward([u2, a2], extends=turn1_state) # 只处理新 token使用 extend 参数时,MinT 的 renderer 系统会自动处理这一优化。