模型简介
以 Qwen/Qwen3.5-4B 为基座,用 Pingo 产品真实用户对话(脱敏后)做 LoRA/QLoRA 监督微调,
使模型稳定具备:Pingo 的人设/语气/回复节奏、产品世界观与规则、与线上一致的多轮对话组织方式、
线上工具协议(OpenAI 兼容 tool_calls)的调用时机与格式,以及安全边界内的拒答能力。
训练方法
- 方式:QLoRA(4bit NF4)SFT,LoRA 作用于全部线性层(q/k/v/o/gate/up/down)
- 推荐起点:rank 16 / alpha 32 / lr 1.5e-4 / epoch 2
- 训练目标:仅 assistant / tool-call 部分参与 loss(system、user、tool 结果全部 mask)
- 对话模板:严格使用 Qwen3.5 官方 chat template,未改 special token
- 双模式:
- 保真模式:完整 system prompt(人设卡+世界观+护栏+规则)作为上下文,max_len 20480
- 烘焙模式(本仓库默认发布形态):人设/世界观/护栏全部训进权重,推理只需薄 system
(身份锄+时间锄点+用户记忆);靠身份/世界观问答样本(事实取自线上人设卡与
world_setting,未编造)+ 护栏全类目拒答样本(~8% 占比)+ 真实对话的人设一致性实现
数据来源原则
- 仅使用 Pingo 产品真实用户聊天记录 + 代码/配置中已有的提示词、世界观、工具定义;
- 不使用任何无关开源对话数据;
- 工具调用样本为「回放合成」:线上工具轨迹不落库,故按真实工具 schema 与调用时机规则
在真实对话上下文上合成,样本内单独标注(meta.synthetic_tool);
- 安全拒答样本为按护栏规则手写的小量补充,单独标注(meta.source=safety_refusal_synth)。
清洗规则(摘要)
- 删除:违法/暴力/自残指导/色情/未成年/仇恨/诈骗类内容;测试账号、刷屏、乱码、纯表情、
极短无意义、中断或系统失败会话;助手空回复、上下文残缺、角色错乱样本;
- 脱敏:手机号/邮箱/证件号/银行卡/订单号/地址/坐标/社交账号/密钥 token/内部地址/URL 一律
替换为语义占位符;用户昵称统一替换为
[昵称];无法确认敏感性的内容默认删除;
- 自伤倾诉类仅保留助手给出合规求助引导的样本,作为安全应答示范。
适用场景
- Pingo 角色单聊(DM)文本对话;
- 与线上协议一致的工具调用(get_date / get_weather / send_sticker / search_memory /
draft_schedule / get_schedule / draft_companion / get_companion_record)。
限制
- 不保证通用问答、代码、数学等任务表现;
- 烘焙模式下人设/世界观/护栏的更新需要重新训练(不再有 prompt 侧运营能力);
- 多模态图片输入未纳入训练(历史图片以
[图片] 占位);
- 工具结果的真实数据由服务端执行器提供,模型只学习「何时调、传什么参数、拿到结果怎么答」;
- 训练数据量级约 1.5k 样本(单角色场景刻意求精不求量),领域外表现会显著退化。
推理示例
普通对话
from transformers import AutoModelForCausalLM, AutoTokenizer
tok = AutoTokenizer.from_pretrained("<this-repo>")
model = AutoModelForCausalLM.from_pretrained("<this-repo>", device_map="auto")
msgs = [{"role": "system", "content": "<Pingo system prompt>"},
{"role": "user", "content": "今天上班好累啊"}]
ids = tok.apply_chat_template(msgs, tokenize=True, return_dict=True,
add_generation_prompt=True).to(model.device)
out = model.generate(**ids, max_new_tokens=200, temperature=0.7, top_p=0.9)
print(tok.decode(out[0][ids["input_ids"].shape[1]:], skip_special_tokens=True))
工具调用
msgs = [{"role": "system", "content": "<Pingo system prompt>"},
{"role": "user", "content": "明早7点叫我起床"}]
ids = tok.apply_chat_template(msgs, tools=TOOLS, tokenize=True, return_dict=True,
add_generation_prompt=True).to(model.device)
out = model.generate(**ids, max_new_tokens=200, temperature=0.7)
(TOOLS 为线上 8 个工具的 OpenAI 兼容 schema,见训练仓库 pingo_sft/synth_tools.py: TOOL_SCHEMAS。)
数据与隐私声明
- 不上传任何原始聊天日志;训练数据均已完成脱敏与质检;
- 本模型卡只描述数据类别与清洗原则,不展示真实用户原文;
- 如在使用过程中发现模型输出包含疑似真实个人信息,请立即下线并回查数据管线。