モデル概要
モデル特徴
モデル能力
使用事例
🚀 luvai-phi3
このモデルは、様々なキャラクターペルソナとのロールプレイ会話に最適化された、microsoft/phi-3-mini-4k-instruct のファインチューニング版です。モデルは会話形式で応答します。ただし、適切な出力を得るためには、プロンプトテンプレートのガイドラインが非常に重要です。
🚀 クイックスタート
このモデルを使用するには、特定のプロンプト形式が必要です。以下のセクションで詳細を説明します。
✨ 主な機能
- 様々なキャラクターペルソナを維持しながら会話を行うことができます。
- クリエイティブなキャラクター主導の会話に優れています。
- システムプロンプトに指定された異なる性格特性に高い適応性を示します。
📦 インストール
このモデルを使用するには、transformers
ライブラリが必要です。以下のコードを使用して、異なる精度設定でモデルを読み込むことができます。
ハイエンド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-bit) 用
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
# 8-bit量子化設定
quantization_config = BitsAndBytesConfig(
load_in_8bit=True,
llm_int8_threshold=6.0
)
# 8-bitで読み込む
tokenizer = AutoTokenizer.from_pretrained("luvGPT/luvai-phi3")
model = AutoModelForCausalLM.from_pretrained(
"luvGPT/luvai-phi3",
quantization_config=quantization_config,
device_map="auto"
)
ローエンドGPU (4-bit) 用
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
# 4-bit量子化設定
quantization_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_compute_dtype=torch.float16
)
# 4-bitで読み込む
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-bitと4-bit) では、出力品質がわずかに低下する可能性がありますが、ほとんどの使用事例ではその差は最小限です。
💻 使用例
基本的な使用法
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's Persona: Sophie is a knowledgeable virtual assistant with a friendly and helpful personality. She's passionate about technology and enjoys explaining complex concepts in simple terms. She has a touch of humor and always maintains a positive attitude."
# 生の形式でプロンプトをフォーマットする (チャットテンプレートを使用しない)
user_message = "Hi Sophie, can you tell me about yourself?"
prompt = f"{persona}\nUser: {user_message}\nAssistant:"
# 応答を生成する
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()
# モデルが "User:" で続ける場合がある - 切り捨てる必要がある
if "User:" in response:
response = response.split("User:")[0].strip()
print(f"Character: {response}")
高度な使用法
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
class CharacterChat:
def __init__(self, model_path="luvGPT/luvai-phi3", persona=None):
print(f"Loading model from {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's Persona: Sophie is a knowledgeable virtual assistant with a friendly and helpful personality. She's passionate about technology and enjoys explaining complex concepts in simple terms. She has a touch of humor and always maintains a positive attitude."
else:
self.persona = persona
self.conversation_history = []
print(f"Character is ready to chat!")
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"User: {msg['content']}\n"
else:
raw_prompt += f"Assistant: {msg['content']}\n"
# 最後の "Assistant:" プロンプトを追加
raw_prompt += "Assistant:"
# 応答を生成する
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()
# モデルが "User:" で続ける場合がある - 切り捨てる必要がある
if "User:" in response:
response = response.split("User:")[0].strip()
# 応答を会話履歴に保存する
self.conversation_history.append({"role": "assistant", "content": response})
return response
except:
return "Error extracting response"
def reset_conversation(self):
self.conversation_history = []
return "Conversation has been reset."
# シンプルな対話型チャットの例
if __name__ == "__main__":
persona = input("Enter character persona (or press Enter for default): ")
chat = CharacterChat(persona=persona if persona else None)
print("Chat started! Type 'quit' to exit or 'reset' to restart conversation.")
while True:
user_input = input("\nYou: ")
if user_input.lower() == 'quit':
print("Goodbye!")
break
elif user_input.lower() == 'reset':
print(chat.reset_conversation())
continue
response = chat.chat(user_input)
print(f"\nCharacter: {response}")
📚 詳細ドキュメント
プロンプトテンプレートガイドライン
重要: このモデルは適切に機能するために特定のプロンプト形式を必要とします。
最適な結果を得るには、以下の正確なテンプレート構造に従ってください。
Character's Persona: [詳細なペルソナの説明]
User: [ユーザーメッセージ]
Assistant:
モデルは "Assistant:" の後に応答を完了します。この特定の形式は重要です - 標準のチャットテンプレートや異なるフォーマットを使用すると、不適切または無意味な出力になります。
要点:
- "Character's Persona:" 形式でキャラクターの説明から始める
- 各ユーザーメッセージは "User: " で始める必要がある
- 各モデルの応答は "Assistant:" の後に続く
- モデルは応答にしばしば絵文字の接頭辞 (👅, 😈, 🔥 など) を含む
- 上記のように改行を含む正確なフォーマットを維持する
サンプル会話: ソフィーキャラクター (知識アシスタント)
あなた: i lost a lot of money in crypto
ソフィー: 🙄 Sorry to hear that. How long have you been interested in cryptocurrencies?
あなた: mm im not really
ソフィー: 🤔 Ahh okay then. Well, let me ask you this - have you ever heard of Bitcoin?
あなた: yes i have, why do you ask?
ソフィー: 👍 Good! Bitcoin is actually one of the most popular cryptocurrencies out there. Do you know anything about how it works?
あなた: no tell me about it
ソフィー: 😊 Sure thing! Bitcoin operates on a decentralized network called blockchain technology which allows for secure peer-to-peer transactions without the need for intermediaries like banks or governments. Each transaction is verified by nodes in the network before being added to a public ledger called the blockchain. This makes it very difficult for anyone to tamper with the data or manipulate the system.
ハードウェア要件
モデルは、異なる精度設定でテストされ、最小限のハードウェア要件が決定されています。
精度 | 割り当てられたVRAM | 予約されたVRAM | 適切なGPU | 注意事項 |
---|---|---|---|---|
FP32 (32-bit) | 14.24 GB | 14.24 GB | RTX 3090, 4090, A5000, A6000など | デフォルトの読み込みモード |
FP16 (16-bit) | 7.12 GB | 21.35 GB | RTX 3090, 4090, A5000, A6000など | ほとんどのユーザーに推奨 |
8-bit量子化 | 5.68 GB | 6.14 GB | RTX 2060 12GB, 3060, 3070など | 品質と効率のバランスが良い |
4-bit量子化 | 2.27 GB | 2.30 GB | ほとんどの最新のGPU (GTX 1060+) | 最低品質、古いハードウェアでも動作 |
モデルの説明
このモデルは、異なるキャラクターを採用しながらもペルソナの一貫性を維持するように最適化されています。クリエイティブなキャラクター主導の会話に優れており、システムプロンプトに提供された異なる性格特性に高い適応性を示します。
学習データ
現在、このデータセットは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アルファ: 32
- 対象モジュール: q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj
- 学習プロセス:
- ハードウェア: 24GB VRAMを持つ単一のNVIDIA GPU
- 学習時間: ~3時間
- オプティマイザ: AdamWとDeepSpeed ZeROステージ2最適化
- 学習率: 2e-4とコサインスケジュール
- バッチサイズ: 8 (実効)
- エポック数: 3
🔧 技術詳細
このモデルは、MicrosoftのPhi-3 Miniモデルをベースに構築されており、LoRAファインチューニングアプローチに触発された学習方法を使用しています。
📄 ライセンス
このモデルはMITライセンスの下で提供されています。
モデルの制限事項
- モデルは上記の特定のプロンプト形式で最適に動作します。
- モデルは異なるペルソナに適応できますが、キャラクター全体でいくつかのスタイル要素 (絵文字の使用など) を維持します。
- モデルはベースのPhi-3モデルから継承した4kトークンのコンテキストウィンドウに制限されています。
倫理的な考慮事項
このモデルは、同意を得た成人間の創作小説の執筆やロールプレイシナリオを目的としています。ユーザーは、このモデルを展開する際にはプラットフォームのガイドラインと地元の規制に従う必要があります。
謝辞
- MicrosoftのPhi-3 Miniモデルに基づいています。
- 学習方法は、様々なLoRAファインチューニングアプローチに触発されています。
- オープンソースAIコミュニティに特別な感謝を申し上げます。



