模型简介
模型特点
模型能力
使用案例
语言:
- 英文 许可证: 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词元,对话通常包含6-7条消息
性能表现
训练指标显示训练过程中持续改进:
- 词元准确率: 从~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 with DeepSpeed ZeRO stage 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}")
模型限制
- 模型在以上演示的特定提示格式下效果最佳
- 虽然能适应不同角色,但会保持某些风格元素(如表情使用)跨角色一致
- 继承基础Phi-3模型的4k词元上下文窗口限制
伦理考量
该模型旨在用于成人间同意的创意小说写作和角色扮演场景。部署该模型时应遵循平台指南和当地法规。
致谢
- 基于微软Phi-3 Mini模型
- 训练方法受各种LoRA微调方法启发
- 特别感谢开源AI社区


