Mind Lab Toolkit (MinT)

计划中的功能:本文档描述的 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_instructQwen3<|im_start|>role\ncontent<|im_end|>
kimi_k2Kimi-K2类似 Qwen3,支持 thinking blocks
deepseekv3DeepSeek-V3DeepSeek 聊天格式
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_reward

Extension 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 系统会自动处理这一优化。

本页目录