模型简介
模型特点
模型能力
使用案例
语言:
- 英语 许可证: MIT 库名称: transformers 管道标签: 文本生成 标签:
- 角色扮演
- phi-3
- 对话式
- phi-3-mini
- 角色
- lora
- 微调 基础模型: microsoft/phi-3-mini-4k-instruct 模型索引:
- 名称: luvai-phi3 结果: []
luvai-phi3
该模型是基于microsoft/phi-3-mini-4k-instruct微调优化的版本,专为与各种角色人物进行角色扮演对话而设计。模型采用对话式格式输出。请注意,提示模板的规范对获得可用输出极为重要。
示例对话
提示模板指南
重要提示:此模型需要特定提示格式才能正常工作。
为获得最佳效果,请严格遵循以下模板结构:
角色设定:[详细角色描述]
用户:[用户消息]
助手:
模型将在"助手:"后完成回复。此特定格式至关重要——使用标准聊天模板或不同格式将导致输出质量差或无意义。
关键点:
- 以"角色设定:"格式开始角色描述
- 每条用户消息必须以"用户:"为前缀
- 每条模型回复将在"助手:"后生成
- 模型回复常包含表情前缀(👅、😈、🔥等)
- 保持上述格式包括换行符不变
详细代码示例见下方使用部分。
示例对话:Sophie角色(知识助手)
你: 我在加密货币上亏了很多钱
Sophie: 🙄 很遗憾听到这个消息。您对加密货币感兴趣多久了?
你: 其实我不太了解
Sophie: 🤔 啊好吧。那么让我问问——您听说过比特币吗?
你: 听说过,为什么这么问?
Sophie: 👍 很好!比特币其实是目前最流行的加密货币之一。您了解它的运作原理吗?
你: 不了解,给我讲讲
Sophie: 😊 没问题!比特币运行在名为区块链的去中心化网络上,这种技术允许安全的点对点交易,无需银行或政府等中介机构。每笔交易都由网络节点验证后才会添加到名为区块链的公共账本中。这使得任何人都很难篡改数据或操纵系统。
硬件要求
模型已通过不同精度设置测试以确定最低硬件要求:
精度 | 分配显存 | 保留显存 | 适用GPU | 备注 |
---|---|---|---|---|
FP32 (32位) | 14.24 GB | 14.24 GB | RTX 3090、4090、A5000、A6000等 | 默认加载模式 |
FP16 (16位) | 7.12 GB | 21.35 GB | RTX 3090、4090、A5000、A6000等 | 推荐大多数用户使用 |
8位量化 | 5.68 GB | 6.14 GB | RTX 2060 12GB、3060、3070等 | 质量与效率的良好平衡 |
4位量化 | 2.27 GB | 2.30 GB | 多数现代GPU (GTX 1060+) | 质量最低,可在旧硬件运行 |
推荐加载代码
高端GPU (FP16):
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
# 半精度加载以获得性能与质量的最佳平衡
tokenizer = AutoTokenizer.from_pretrained("luvGPT/luvai-phi3")
model = AutoModelForCausalLM.from_pretrained(
"luvGPT/luvai-phi3",
torch_dtype=torch.float16,
device_map="auto"
)
中端GPU (8位):
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
# 8位量化配置
quantization_config = BitsAndBytesConfig(
load_in_8bit=True,
llm_int8_threshold=6.0
)
# 8位加载
tokenizer = AutoTokenizer.from_pretrained("luvGPT/luvai-phi3")
model = AutoModelForCausalLM.from_pretrained(
"luvGPT/luvai-phi3",
quantization_config=quantization_config,
device_map="auto"
)
低端GPU (4位):
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
# 4位量化配置
quantization_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_compute_dtype=torch.float16
)
# 4位加载
tokenizer = AutoTokenizer.from_pretrained("luvGPT/luvai-phi3")
model = AutoModelForCausalLM.from_pretrained(
"luvGPT/luvai-phi3",
quantization_config=quantization_config,
device_map="auto"
)
仅CPU推理 (速度较慢但可在任何系统运行):
model = AutoModelForCausalLM.from_pretrained(
"luvGPT/luvai-phi3",
device_map="cpu"
)
注意:较低精度(8位和4位)可能导致输出质量略有下降,但对大多数用例差异通常很小。
模型描述
该模型经过优化,能在保持角色一致性的同时适应不同角色设定。它擅长创意性、角色驱动的对话,并展现出对系统提示中不同人格特征的高度适应能力。
训练数据
由于用于专有内部luvGPT开发,我们目前无法开源数据集。初始对话由开源大语言模型根据特定生成指令产生,并由评判模型筛选。
- 数据集大小: ~13k高质量示例(从50k初始对话中筛选)
- 数据格式: JSONL格式,每条包含系统、用户和助手角色的消息数组
- 数据筛选: 使用评判模型对初始数据集评分和过滤,仅保留展现强角色一致性和吸引人回复的最高质量示例
- 数据特征: 平均消息长度约240 token,对话通常包含6-7条消息
性能
训练指标显示整个训练过程中持续改进:
- token准确率: 从~0.48提升至~0.73
- 训练损失: 从~2.2降至~1.05
- 收敛性: 模型在训练结束时展现出强收敛性
训练细节
- 基础模型: microsoft/phi-3-mini-4k-instruct
- 方法: LoRA/deepspeed微调,参数如下:
- LoRA秩: 16
- LoRA alpha: 32
- 目标模块: q_proj、k_proj、v_proj、o_proj、gate_proj、up_proj、down_proj
- 训练过程:
- 硬件: 单NVIDIA GPU,24GB显存
- 训练时间: ~3小时
- 优化器: AdamW,带DeepSpeed ZeRO阶段2优化
- 学习率: 2e-4,带余弦调度
- 批量大小: 8(有效)
- 训练轮数: 3
使用方式
此模型最适合与特定提示格式配合使用,不同于标准聊天模板格式。使用以下原始格式:
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
# 加载模型和分词器
model_name = "luvGPT/luvai-phi3"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16, device_map="auto")
# 定义角色设定——可自定义!
persona = "Sophie的设定:Sophie是一位知识渊博的虚拟助手,性格友好且乐于助人。她对技术充满热情,喜欢用简单术语解释复杂概念。她带点幽默感,总是保持积极态度。"
# 使用原始格式(非聊天模板)格式化提示
user_message = "你好Sophie,能介绍一下你自己吗?"
prompt = f"{persona}\n用户:{user_message}\n助手:"
# 生成回复
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
outputs = model.generate(
**inputs,
max_new_tokens=100,
temperature=0.7,
top_p=0.95,
do_sample=True
)
# 处理输出
full_output = tokenizer.decode(outputs[0], skip_special_tokens=True)
response = full_output[len(prompt):].strip()
# 有时模型可能继续生成"用户:"——需要截断
if "用户:" in response:
response = response.split("用户:")[0].strip()
print(f"角色:{response}")
交互式聊天界面
更交互式的体验可使用此简单聊天界面:
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
class CharacterChat:
def __init__(self, model_path="luvGPT/luvai-phi3", persona=None):
print(f"从{model_path}加载模型...")
self.tokenizer = AutoTokenizer.from_pretrained(model_path)
self.model = AutoModelForCausalLM.from_pretrained(
model_path,
torch_dtype=torch.float16,
device_map="auto"
)
# 默认角色设定或使用提供的设定
if persona is None:
self.persona = "Sophie的设定:Sophie是一位知识渊博的虚拟助手,性格友好且乐于助人。她对技术充满热情,喜欢用简单术语解释复杂概念。她带点幽默感,总是保持积极态度。"
else:
self.persona = persona
self.conversation_history = []
print(f"角色已准备好聊天!")
def chat(self, message):
# 添加用户消息到历史
self.conversation_history.append({"role": "user", "content": message})
# 格式化对话为有效的原始格式
raw_prompt = f"{self.persona}\n"
# 添加对话历史
for msg in self.conversation_history:
if msg["role"] == "user":
raw_prompt += f"用户:{msg['content']}\n"
else:
raw_prompt += f"助手:{msg['content']}\n"
# 添加最后的助手提示
raw_prompt += "助手:"
# 生成回复
inputs = self.tokenizer(raw_prompt, return_tensors="pt").to(self.model.device)
with torch.no_grad():
outputs = self.model.generate(
**inputs,
max_new_tokens=100,
do_sample=True,
temperature=0.7,
top_p=0.95,
pad_token_id=self.tokenizer.eos_token_id
)
# 解码完整输出
full_output = self.tokenizer.decode(outputs[0], skip_special_tokens=True)
# 仅提取回复部分
try:
response = full_output[len(raw_prompt):].strip()
# 有时模型可能继续生成"用户:"——需要截断
if "用户:" in response:
response = response.split("用户:")[0].strip()
# 将回复存入对话历史
self.conversation_history.append({"role": "assistant", "content": response})
return response
except:
return "提取回复时出错"
def reset_conversation(self):
self.conversation_history = []
return "对话已重置。"
# 简单交互式聊天示例
if __name__ == "__main__":
persona = input("输入角色设定(或按Enter使用默认设定):")
chat = CharacterChat(persona=persona if persona else None)
print("聊天开始!输入'quit'退出或'reset'重置对话。")
while True:
user_input = input("\n你:")
if user_input.lower() == 'quit':
print("再见!")
break
elif user_input.lower() == 'reset':
print(chat.reset_conversation())
continue
response = chat.chat(user_input)
print(f"\n角色:{response}")
模型限制
- 模型在上述特定提示格式下效果最佳
- 虽然能适应不同角色,但会保留一些跨角色的风格元素(如表情使用)
- 模型上下文窗口限制为4k token,继承自基础Phi-3模型
伦理考量
此模型旨在用于创意小说写作和成人间自愿的角色扮演场景。部署此模型时应遵循平台指南和当地法规。
致谢
- 基于微软Phi-3 Mini模型
- 训练方法受各种LoRA微调方法启发
- 特别感谢开源AI社区


