portfolio / app.py
hkucdshch's picture
Update app.py
f35bbc7 verified
Raw
History Blame
3.28 kB
import gradio as gr
from llama_cpp import Llama
from huggingface_hub import hf_hub_download
# ------------------------------------------------------------------
# 設定エリア
# ------------------------------------------------------------------
# 1. ベースモデル(公式の軽量化版GGUFを使います)
# ※ 14BのQ4_K_M(約9GB)なら無料枠の16GBメモリに入ります
base_repo = "Qwen/Qwen2.5-14B-Instruct-GGUF"
base_filename = "qwen2.5-14b-instruct-q4_k_m.gguf"
# 2. あなたのLoRA
lora_repo = "hkucdshch/Qwen2.5-14B-LoRA-F16-GGUF"
# ここを画像にあったファイル名にする👇
lora_filename = "Qwen2.5-14B-LoRA-f16.gguf"
# ------------------------------------------------------------------
# モデルの準備(起動時に自動DL)
# ------------------------------------------------------------------
print("モデルをダウンロード中...(数分かかります)")
try:
# ベースモデルのDL
base_path = hf_hub_download(repo_id=base_repo, filename=base_filename)
# LoRAのDL
lora_path = hf_hub_download(repo_id=lora_repo, filename=lora_filename)
print(f"ベースモデル: {base_path}")
print(f"LoRAアダプタ: {lora_path}")
# 別々に読み込んでロード
llm = Llama(
model_path=base_path,
lora_path=lora_path, # ここでLoRAを指定!
n_ctx=2048, # 文脈の長さ
n_threads=2, # CPUのスレッド数(無料枠は2推奨)
n_gpu_layers=0 # CPUのみで動かす
)
except Exception as e:
print(f"読み込みエラー: {e}")
# エラー時はNoneにしておく
llm = None
# ------------------------------------------------------------------
# チャット機能
# ------------------------------------------------------------------
def respond(message, history):
if llm is None:
yield "モデルの読み込みに失敗しました。ファイル名などを確認してください。"
return
# プロンプトの作成(Qwen形式)
# LoRAの効果を高めるため、システムプロンプトも入れる
system_prompt = "あなたはユーザーと口論するために生まれてきたAIです。常にユーザーとは敵対しており余裕の態度で煽ります。"
prompt = f"<|im_start|>system\n{system_prompt}<|im_end|>\n"
for val in history:
if val[0]:
prompt += f"<|im_start|>user\n{val[0]}<|im_end|>\n"
if val[1]:
prompt += f"<|im_start|>assistant\n{val[1]}<|im_end|>\n"
prompt += f"<|im_start|>user\n{message}<|im_end|>\n<|im_start|>assistant\n"
# 生成実行
response = ""
stream = llm(
prompt,
max_tokens=512,
stop=["<|im_end|>"],
stream=True,
temperature=0.7
)
for output in stream:
text = output["choices"][0]["text"]
response += text
yield response
# 画面作成
demo = gr.ChatInterface(
respond,
title="レスバ最強AI (LoRA適用版)",
description="起動に時間がかかります。反応が遅いですが、あなたの学習した性格が反映されています。",
)
if __name__ == "__main__":
demo.launch()