Skip to content

Latest commit

 

History

History
329 lines (247 loc) · 17.1 KB

File metadata and controls

329 lines (247 loc) · 17.1 KB

RWKV State Tuning 数据工程:构建融合 Roleplay 与 Tool Learning 的具身智能雏形

摘要 (Abstract)

当前的大语言模型(LLM)发展呈现出两个明显的极化方向:一是以角色扮演(Roleplay)为主的 Chatbot,侧重情感交互与人设维持;二是以工具调用(Tool Use)为主的 Agent,侧重逻辑推理与任务执行。然而,在实际应用中,用户往往期待一个既有“有趣灵魂”又能“干活”的 AI 助手。本文基于 RWKV 线性 Attention 架构,提出了一套 Roleplay 与 Tool Learning 的混合训练方案。通过精心设计的 Markdown 数据协议、五级(L0-L4)分级数据构建策略以及 RWKV 独有的 State Tuning 技术,我们成功在保持模型人设稳定性的同时,赋予其复杂的工具使用与推理规划能力。本文将详细论述数据构建细节、训练配比策略及工程实践经验。


1. 引言 (Introduction)

1.1 问题背景

传统的 Agent 训练(如 ReAct、ToolFormer)往往使用冷冰冰的 JSON 格式交互,导致模型在执行任务时语气机械,丧失了原有的人设风格。反之,专注于 Roleplay 的模型虽然对话流畅,但往往缺乏逻辑严密性,难以正确调用外部 API。如何将二者有机结合,是实现“具身智能雏形(Embodied Agent)”的关键。

1.2 解决方案

我们选择 RWKV 架构作为基座,利用其 RNN 特性(无限上下文、固定推理显存)和对长文本格式的强记忆力。通过构建一套包含思维链(Chain of Thought)和显式工具定义的 Markdown 语料,采用课程学习(Curriculum Learning)策略进行混合训练,实现了人设与能力的双重对齐。


2. 方法论 (Methodology)

2.1 数据协议设计 (Data Protocol Design)

为了让模型在同一个 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)物理隔离,防止格式混淆。

2.2 进阶协议:多轮对话与工具链

真实场景往往需要多轮交互或单轮内的多步操作。我们的协议天然支持这种扩展。

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):每步结束后的微型反思,用于修正下一步计划。

2.3 核心技术:State Tuning (状态微调)

为何在众多架构中选择 RWKV?其核心优势在于RNN 架构与 State Tuning 的完美结合,这解决了传统 Transformer 在 Agent 场景下的痛点。

  • 原理:RWKV 的 RNN 特性允许我们将 System Prompt(包含复杂的人设定义、Few-shot 示例、输出格式规范)“压缩”进一个固定的隐状态(State)中。我们冻结模型主体参数,仅训练初始 State 向量。

  • RWKV 的独特优势

    1. System Prompt 的“零开销” (Zero Overhead): 在 Transformer 中,复杂的 System Prompt(往往长达数千 Token)在每轮对话中都会占用昂贵的 KV Cache 或需要重复计算。而 RWKV 将其“编译”为 State 后,推理时无需输入任何 System Prompt,直接加载 State 即可起手。这意味着无论人设文档多长,首字延迟(TTFT)恒定为 0,且不额外占用显存。
    2. 人设深度固化 (Deep Persona Alignment): Prompt Engineering 往往是“浅层催眠”,模型容易在长对话中遗忘设定(Catastrophic Forgetting)。State Tuning 则是直接调整 RNN 的记忆单元,相当于给模型植入了“潜意识”。这种底层对齐使得模型在执行复杂工具调用时,依然能稳固地保持“Moss”或“小叮当”的语气,极难破功(Out-of-Character)。
    3. 多角色热切换: 由于主体权重不变,我们可以为不同角色(如“严谨管家”、“活泼死党”)训练不同的 State 文件。运行时只需毫秒级替换 State,即可实现角色的瞬间切换,极适合多 Agent 协同场景。

3. 实验设计:分级数据构建 (Hierarchical Data Construction)

为了让模型逐步掌握能力,我们将训练数据划分为 L0 至 L4 五个等级。每个等级针对不同的能力维度,缺一不可。

L0:基石 —— 角色扮演 (Roleplay Foundation)

  • 定义:纯对话数据,不涉及任何工具调用。
  • 形态## Tools Usage 为空,或有工具但无需调用。
  • 目的“保住灵魂”。防止模型因为大量学习 JSON 格式而丧失自然语言能力。
  • 关键点:包含闲聊、知识问答、情感陪伴。必须明确输出 ## Thought 解释“为何不需要工具”。

L1:入门 —— 单步执行 (Simple Execution)

  • 定义:用户指令明确,只需调用一次工具且必然成功。
  • 形态:Thought -> Tool Call -> Tool Output (Success) -> Respond。
  • 目的“学会走路”。让模型掌握基本的格式规范和参数提取能力。
  • 场景:查询时间、查询天气、开关设备。

L2:进阶 —— 鲁棒性与纠错 (Robustness & Correction)

  • 定义:引入噪音和异常情况的单步或简单两步任务。
  • 形态
    • 缺参 (Missing Args):用户未提供必要参数 -> 模型不调用工具 -> ## Respond 反问。
    • 报错 (Error Handling):工具返回 Error -> 模型读取错误信息 -> 解释并告知用户。
    • 两步链 (2-Step):先查后做(如“把灯调成和昨天一样”)。
  • 目的“学会抗扰”。避免模型产生幻觉(瞎猜参数)或面对报错不知所措。

L3:高阶 —— 复杂规划 (Complex Planning)

  • 定义:多工具协同、条件分支、中途重规划。
  • 形态
    • 多步链 (Multi-step):≥3 步操作(查询 -> 过滤 -> 决策 -> 执行)。
    • 分支 (Branching):如果 A 成功则做 B,否则做 C。
    • 重规划 (Re-planning):用户中途打断或改口。
  • 目的“学会思考”。训练模型的逻辑推理和长期规划能力。

L4:强化 —— 多轮混合对话 (Multi-turn Mixed Dialogue)

  • 定义:包含闲聊与工具使用的长程多轮对话。
  • 形态:用户意图在“闲聊”与“任务”间切换,模型需灵活判断何时调用工具,何时仅做情感回应。
  • 目的“综合实战”。模拟真实人机交互的复杂性,训练模型在长上下文中保持人设并精准执行任务。

4. 训练策略 (Training Strategy)

4.1 数据配比 (Data Distribution)

混合训练的精髓在于配比。盲目堆砌复杂数据会导致模型“过拟合”工具格式,变成只会发指令的机器。我们推荐的经验配比如下:

等级 推荐占比 理由
L0 30% 必须重仓。这是模型的“底色”,保证对话的自然度和人设不崩塌。
L1 20% 基础格式训练,保证基本指令的响应速度和准确率。
L2 20% 提升抗干扰能力,防止模型在模糊指令下“乱动”。
L3 25% 提升智力上限,处理复杂需求。
L4 5% 多轮混合对话,包含闲聊和工具使用。

4.2 数据准备与格式化 (Data Preparation & Formatting)

参考 RWKV 官方微调指南,我们的数据准备遵循以下标准化流程:

  1. 需求定义:明确模型需要掌握的“知识”(如特定领域资料)与“能力”(如工具调用、角色扮演)。
  2. 数据收集与构建
    • 基于 L0-L4 分级策略生成原始语料。
    • 确保覆盖多轮对话与单轮指令场景。
  3. 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 微调数据的标准要求,有助于模型明确文本结束。
  4. 迭代优化
    • 遵循“满足需求 -> 收集数据 -> 微调训练 -> 测试效果”的闭环。
    • 质量优先:高质量的少量数据(几千条 L4)远胜于低质量的海量数据。

4.3 数据蒸馏策略 (Data Distillation Strategy)

建议所有级别(L0-L4)的数据均使用顶级闭源模型(如 Claude 3.5 Sonnet, GPT-4o)进行蒸馏,以确保数据质量和格式的一致性。

  1. Teacher Model 选择:首选逻辑推理能力强、指令遵循度高的模型。
  2. Prompt 工程
    • 协议注入:将本文定义的 Markdown 协议(包含 # System, # User, # Assistant## Thought)完整写入 System Prompt。
    • 思维链约束强制要求 Teacher Model 输出英文思考(English Thought),并遵循 observation -> reasoning -> reflection -> action 的四步范式。
    • Few-Shot 引导:根据生成的 L0-L4 不同级别,提供对应的 Few-Shot 示例。
  3. 生成流程
    • Step 1 (Scenario): 让模型先生成符合特定 Level 难度的用户请求场景(如 L0 为闲聊,L3 为复杂任务)。
    • Step 2 (Execution): 让模型扮演 Assistant,根据协议生成完整的交互记录。
  4. 后处理与清洗
    • 格式校验:确保 JSON 解析无误,Markdown 标签闭合。
    • 逻辑校验:检查 user_decision 等关键字段是否符合预期。

4.4 State Tuning 实操 (State Tuning Practice)

基于 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.txt

3. 训练脚本配置 (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
  • 超参数建议:

    • --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

5. 最佳实践与避坑 (Best Practices)

  1. Thought 是灵魂:绝对不要省略 ## Thought。即使是 L0 任务,也要让模型输出“用户只是在闲聊,无需调用工具”。这能显著降低幻觉率。
  2. 噪音注入 (Noise Injection):在训练数据的 ## Tools Usage 中故意加入几个无关工具(Distractors)。如果模型能准确忽略它们,说明它真的懂了 description,而不是在背诵。
  3. User 拟人化:User 的输入不应只是标准指令。加入口语、错别字、含糊不清的表达,训练模型从嘈杂信息中提取意图的能力。
  4. 验证集设计:不仅要看 Loss,必须编写自动化脚本,模拟真实对话环境,检查模型生成的 JSON 是否合法、参数是否正确。

6. 结论 (Conclusion)

通过将 Roleplay 与 Tool Learning 结合,并利用 RWKV 的 State Tuning 技术,我们探索出了一条构建高效、拟人化具身智能的可行路径。L0-L4 的分级数据构建与合理的混合配比,是平衡模型“情商”与“智商”的关键。未来,随着 L4 级别数据的进一步丰富,模型在处理长程任务上的表现值得期待。

我们在 RWKV7 2.9B g1c 模型上使用 约 7200 条数据 进行的微调实验表明,该方案成功满足了所有设计指标。