当前的大语言模型(LLM)发展呈现出两个明显的极化方向:一是以角色扮演(Roleplay)为主的 Chatbot,侧重情感交互与人设维持;二是以工具调用(Tool Use)为主的 Agent,侧重逻辑推理与任务执行。然而,在实际应用中,用户往往期待一个既有“有趣灵魂”又能“干活”的 AI 助手。本文基于 RWKV 线性 Attention 架构,提出了一套 Roleplay 与 Tool Learning 的混合训练方案。通过精心设计的 Markdown 数据协议、五级(L0-L4)分级数据构建策略以及 RWKV 独有的 State Tuning 技术,我们成功在保持模型人设稳定性的同时,赋予其复杂的工具使用与推理规划能力。本文将详细论述数据构建细节、训练配比策略及工程实践经验。
传统的 Agent 训练(如 ReAct、ToolFormer)往往使用冷冰冰的 JSON 格式交互,导致模型在执行任务时语气机械,丧失了原有的人设风格。反之,专注于 Roleplay 的模型虽然对话流畅,但往往缺乏逻辑严密性,难以正确调用外部 API。如何将二者有机结合,是实现“具身智能雏形(Embodied Agent)”的关键。
我们选择 RWKV 架构作为基座,利用其 RNN 特性(无限上下文、固定推理显存)和对长文本格式的强记忆力。通过构建一套包含思维链(Chain of Thought)和显式工具定义的 Markdown 语料,采用课程学习(Curriculum Learning)策略进行混合训练,实现了人设与能力的双重对齐。
为了让模型在同一个 Context 中区分“思考”、“指令”和“回复”,我们设计了一套严格的 Markdown 格式协议。
标准样本结构:
# System
## Persona
{"name": "Moss", "personality": "绝对理性", ...}
# User
## say
<用户指令>
## Time
<当前时间>
## Tools Usage
<工具定义列表 (JSON Schema)>
# Assistant
## Thought
<Thinking in English: observation -> reasoning -> reflection -> action>
## Step 1
### Step Respond
<步骤响应 (可选)>
### Tool Call
<工具调用指令 (JSON)>
### Tool Risk
<用户决策模拟>
### Tool Output
<工具返回结果 (JSON)>
### Step End
<单步反思>
## Respond
<基于工具结果的自然语言回复>关键设计:
- 动态工具挂载 (
## Tools Usage后置设计): 我们将工具定义置于# User块内而非全局# System中,是基于海量工具库的工程落地考量。- RAG 检索机制:在真实场景中,工具库可能包含数千个 API,直接塞入 Context 会导致 Token 爆炸且干扰模型注意力。
- 按需加载:这种设计允许前端系统根据用户当前的自然语言指令(Query),利用向量检索(RAG)动态提取最相关的 Top-N(如 5-10 个)工具挂载到当前轮次。
- 降低噪音:模型只需在极小的候选集中进行决策,显著降低了幻觉率。
- 思维链 (
## Thought):在行动前强制输出英文思考过程(English Chain of Thought)。- 原因:英文在逻辑推理上的 Token 密度更高,且现有基座模型(Base Model)的英文逻辑能力通常强于中文。强制英文思考能有效提升复杂任务的规划准确率,同时避免中文思考对后续中文回复语气的潜在干扰。
- 四步范式:强制模型遵循
observation(观测) ->reasoning(推理) ->reflection(反思) ->action(行动) 的四步思维法,确保决策严谨。
- 语义隔离:使用
## Tool Call等标签将机器语言与自然语言(## Respond)物理隔离,防止格式混淆。
真实场景往往需要多轮交互或单轮内的多步操作。我们的协议天然支持这种扩展。
1. 多轮对话上下文 (## Context)
在多轮对话中,为了避免 Context 长度无限膨胀,我们引入 ## Context 字段。
- 位置:置于
# Assistant块的首部,## Thought之前。 - 作用:对前序对话中的关键事实(如用户偏好、已确认的参数、历史工具结果)进行摘要。
- 优势:在训练时,这教会了模型“总结历史”的能力;配合 State Tuning,模型能更精准地回忆起之前的状态。
2. 单轮多步工具链 (Multi-step Tool Chain)
对于复杂任务(如 L3/L4),模型需要执行多次工具调用。为了清晰界定每一步的状态,我们引入了分级结构 ## Step {N}。
结构如下:
# Assistant
## Context
用户上一轮要求查询天气,已确认为北京。
## Thought
- observation: User asked about weather in Beijing.
- reasoning: Need to call get_weather tool.
- reflection: Check if location is ambiguous. 'Beijing' is clear. No risk.
- action: Call get_weather tool.
## Step 1
### Step Respond
[neutral, thinking] 好的,首先为您查询北京的天气。
### Tool Call
```tool_call_json
{"name": "get_weather", "args": {"city": "Beijing"}}
```
### Tool Risk
- user_decision: true
### Tool Output
```tool_output_json
{"temp": "35C", "condition": "Sunny"}
```
### Step End
- observation: Weather is 35C and Sunny.
- reasoning: High UV likely. Need to check sunscreen stock.
- reflection: Is it appropriate to recommend products? Yes, fits persona helpfulness.
- action: Search for sunscreen.
## Step 2
### Step Respond
[neutral, thinking] 好的,正在为您搜索防晒霜。
### Tool Call
```tool_call_json
{"name": "search_product", "args": {"query": "sunscreen"}}
```
### Tool Risk
- user_decision: true
### Tool Output
```tool_output_json
{"items": ["BrandA", "BrandB"]}
```
### Step End
- observation: Found BrandA and BrandB.
- reasoning: Task completed. Ready to respond.
- reflection: Ensure response is polite and enthusiastic.
- action: Respond to user.
## Respond
[happy, recommend] 北京今天艳阳高照,35度呢!为您找到了以下防晒霜...关键设计:
- 层级化 (
## Step):将单步内的“思考-行动-结果”封装在一个块内,防止上下文错乱。 - Tool Risk (
### Tool Risk):显式引入用户决策(user_decision: true/false),用于训练模型处理高风险操作(如转账、删除文件)时的人机确认逻辑。 - Step Respond (
### Step Respond):工具执行过程中的“安抚性对话”。让模型在调用耗时工具(如搜索、绘图)时先与用户沟通(如“好的,正在为您查找...”),避免死板的沉默。 - 数字人驱动标签 (
[emotion, action]):- 在
## Respond和### Step Respond的句首,我们强制模型输出[happy, wave]这样的情感动作标签。 - 目的:这些标签可以直接被前端解析,驱动 Live2D 或 3D 数字人做出相应的表情和动作,实现“具身智能”的视觉表现。
- 在
- Step End (
### Step End):每步结束后的微型反思,用于修正下一步计划。
为何在众多架构中选择 RWKV?其核心优势在于RNN 架构与 State Tuning 的完美结合,这解决了传统 Transformer 在 Agent 场景下的痛点。
-
原理:RWKV 的 RNN 特性允许我们将 System Prompt(包含复杂的人设定义、Few-shot 示例、输出格式规范)“压缩”进一个固定的隐状态(State)中。我们冻结模型主体参数,仅训练初始 State 向量。
-
RWKV 的独特优势:
- System Prompt 的“零开销” (Zero Overhead): 在 Transformer 中,复杂的 System Prompt(往往长达数千 Token)在每轮对话中都会占用昂贵的 KV Cache 或需要重复计算。而 RWKV 将其“编译”为 State 后,推理时无需输入任何 System Prompt,直接加载 State 即可起手。这意味着无论人设文档多长,首字延迟(TTFT)恒定为 0,且不额外占用显存。
- 人设深度固化 (Deep Persona Alignment): Prompt Engineering 往往是“浅层催眠”,模型容易在长对话中遗忘设定(Catastrophic Forgetting)。State Tuning 则是直接调整 RNN 的记忆单元,相当于给模型植入了“潜意识”。这种底层对齐使得模型在执行复杂工具调用时,依然能稳固地保持“Moss”或“小叮当”的语气,极难破功(Out-of-Character)。
- 多角色热切换: 由于主体权重不变,我们可以为不同角色(如“严谨管家”、“活泼死党”)训练不同的 State 文件。运行时只需毫秒级替换 State,即可实现角色的瞬间切换,极适合多 Agent 协同场景。
为了让模型逐步掌握能力,我们将训练数据划分为 L0 至 L4 五个等级。每个等级针对不同的能力维度,缺一不可。
- 定义:纯对话数据,不涉及任何工具调用。
- 形态:
## Tools Usage为空,或有工具但无需调用。 - 目的:“保住灵魂”。防止模型因为大量学习 JSON 格式而丧失自然语言能力。
- 关键点:包含闲聊、知识问答、情感陪伴。必须明确输出
## Thought解释“为何不需要工具”。
- 定义:用户指令明确,只需调用一次工具且必然成功。
- 形态:Thought -> Tool Call -> Tool Output (Success) -> Respond。
- 目的:“学会走路”。让模型掌握基本的格式规范和参数提取能力。
- 场景:查询时间、查询天气、开关设备。
- 定义:引入噪音和异常情况的单步或简单两步任务。
- 形态:
- 缺参 (Missing Args):用户未提供必要参数 -> 模型不调用工具 ->
## Respond反问。 - 报错 (Error Handling):工具返回 Error -> 模型读取错误信息 -> 解释并告知用户。
- 两步链 (2-Step):先查后做(如“把灯调成和昨天一样”)。
- 缺参 (Missing Args):用户未提供必要参数 -> 模型不调用工具 ->
- 目的:“学会抗扰”。避免模型产生幻觉(瞎猜参数)或面对报错不知所措。
- 定义:多工具协同、条件分支、中途重规划。
- 形态:
- 多步链 (Multi-step):≥3 步操作(查询 -> 过滤 -> 决策 -> 执行)。
- 分支 (Branching):如果 A 成功则做 B,否则做 C。
- 重规划 (Re-planning):用户中途打断或改口。
- 目的:“学会思考”。训练模型的逻辑推理和长期规划能力。
- 定义:包含闲聊与工具使用的长程多轮对话。
- 形态:用户意图在“闲聊”与“任务”间切换,模型需灵活判断何时调用工具,何时仅做情感回应。
- 目的:“综合实战”。模拟真实人机交互的复杂性,训练模型在长上下文中保持人设并精准执行任务。
混合训练的精髓在于配比。盲目堆砌复杂数据会导致模型“过拟合”工具格式,变成只会发指令的机器。我们推荐的经验配比如下:
| 等级 | 推荐占比 | 理由 |
|---|---|---|
| L0 | 30% | 必须重仓。这是模型的“底色”,保证对话的自然度和人设不崩塌。 |
| L1 | 20% | 基础格式训练,保证基本指令的响应速度和准确率。 |
| L2 | 20% | 提升抗干扰能力,防止模型在模糊指令下“乱动”。 |
| L3 | 25% | 提升智力上限,处理复杂需求。 |
| L4 | 5% | 多轮混合对话,包含闲聊和工具使用。 |
参考 RWKV 官方微调指南,我们的数据准备遵循以下标准化流程:
- 需求定义:明确模型需要掌握的“知识”(如特定领域资料)与“能力”(如工具调用、角色扮演)。
- 数据收集与构建:
- 基于 L0-L4 分级策略生成原始语料。
- 确保覆盖多轮对话与单轮指令场景。
- JSONL 格式化:
- 虽然我们使用 Markdown 协议组织内容,但最终训练数据必须符合 RWKV 标准 JSONL 格式。
- 格式要求:将完整的 Markdown 文本(包含
# System,# User,# Assistant)转义为 JSONL 的text字段。 - 示例:
{"text": "# System\n## Persona\n...\n\n# User\n...\n\n# Assistant\n...\n\n"} - 注意:
- 换行符需转义为
\n。 - 结尾必须包含两个换行符
\n\n,这是 RWKV 微调数据的标准要求,有助于模型明确文本结束。
- 换行符需转义为
- 迭代优化:
- 遵循“满足需求 -> 收集数据 -> 微调训练 -> 测试效果”的闭环。
- 质量优先:高质量的少量数据(几千条 L4)远胜于低质量的海量数据。
建议所有级别(L0-L4)的数据均使用顶级闭源模型(如 Claude 3.5 Sonnet, GPT-4o)进行蒸馏,以确保数据质量和格式的一致性。
- Teacher Model 选择:首选逻辑推理能力强、指令遵循度高的模型。
- Prompt 工程:
- 协议注入:将本文定义的 Markdown 协议(包含
# System,# User,# Assistant及## Thought)完整写入 System Prompt。 - 思维链约束:强制要求 Teacher Model 输出英文思考(English Thought),并遵循
observation -> reasoning -> reflection -> action的四步范式。 - Few-Shot 引导:根据生成的 L0-L4 不同级别,提供对应的 Few-Shot 示例。
- 协议注入:将本文定义的 Markdown 协议(包含
- 生成流程:
- Step 1 (Scenario): 让模型先生成符合特定 Level 难度的用户请求场景(如 L0 为闲聊,L3 为复杂任务)。
- Step 2 (Execution): 让模型扮演 Assistant,根据协议生成完整的交互记录。
- 后处理与清洗:
- 格式校验:确保 JSON 解析无误,Markdown 标签闭合。
- 逻辑校验:检查
user_decision等关键字段是否符合预期。
基于 RWKV-PEFT 项目进行 State Tuning,这是目前最高效的微调方式。
1. 环境准备
- Linux 操作系统 (或 WSL)
- NVIDIA 显卡 (支持 CUDA)
- Python 环境
2. 安装与配置
git clone https://github.com/JL-er/RWKV-PEFT.git
cd RWKV-PEFT
pip install -r requirements.txt3. 训练脚本配置 (scripts/state_tuning.sh)
重点调整以下参数:
-
路径设置:
load_model: 基底模型路径proj_dir: 输出路径data_file: JSONL 数据路径 (不带后缀)
-
模型参数 (根据模型尺寸选择):
- RWKV6-1.6B:
n_layer=24,n_embd=2048 - RWKV6-3B:
n_layer=32,n_embd=2560 - RWKV6-7B:
n_layer=32,n_embd=4096
- RWKV6-1.6B:
-
超参数建议:
--lr_init 1e-3(State Tuning 推荐高学习率)--lr_final 1e-5--ctx_len 4096(由于多轮对话文本较长,推荐 4k 起步)--micro_bsz 1--peft state--precision bf16--op cuda
4. 启动训练
sh scripts/state_tuning.sh- Thought 是灵魂:绝对不要省略
## Thought。即使是 L0 任务,也要让模型输出“用户只是在闲聊,无需调用工具”。这能显著降低幻觉率。 - 噪音注入 (Noise Injection):在训练数据的
## Tools Usage中故意加入几个无关工具(Distractors)。如果模型能准确忽略它们,说明它真的懂了 description,而不是在背诵。 - User 拟人化:User 的输入不应只是标准指令。加入口语、错别字、含糊不清的表达,训练模型从嘈杂信息中提取意图的能力。
- 验证集设计:不仅要看 Loss,必须编写自动化脚本,模拟真实对话环境,检查模型生成的 JSON 是否合法、参数是否正确。
通过将 Roleplay 与 Tool Learning 结合,并利用 RWKV 的 State Tuning 技术,我们探索出了一条构建高效、拟人化具身智能的可行路径。L0-L4 的分级数据构建与合理的混合配比,是平衡模型“情商”与“智商”的关键。未来,随着 L4 级别数据的进一步丰富,模型在处理长程任务上的表现值得期待。
我们在 RWKV7 2.9B g1c 模型上使用 约 7200 条数据 进行的微调实验表明,该方案成功满足了所有设计指标。