包含内容
Table with columns: 文件, 说明| 文件 | 说明 |
|---|
adapter_model.safetensors / adapter_config.json | LoRA 适配器(peft 格式,r=32, alpha=64,目标模块 q/k/v/o/gate/up/down) |
anon-lora-f16.gguf | GGUF 版适配器(llama.cpp / ollama ADAPTER 直接挂载用) |
system_prompt_anon.txt | 人设 system prompt(训练与推理一致,建议始终使用) |
rag_service.py | RAG+重排+聊天 一体化服务(OpenAI 兼容端点 /v1/chat/completions) |
kb_docs.jsonl | 世界知识库(182 条:人物/剧情/活动/歌曲/卡牌/设定) |
docs/ | 技术过程文档 + 新手部署指南 |
训练
- 基座:
unsloth/Qwen3-8B-unsloth-bnb-4bit(NF4;合并/导出必须用同一量化基座)
- 数据:947 条(官方剧情对话改写 750 + 手写 RP 合成 197;多轮占 12%)
- 超参:LR 1e-4(cosine)、2 epochs、bf16、seq 2048、batch 1×8、238 steps(RTX 3060 12GB 约 2h)
- 选片:6 个 checkpoint × 30 题语气验证(DeepSeek-v4-flash 评委,三维 1-5 分),选定的 checkpoint-150 总分 4.52/5
- loss 曲线:3.49 → 0.10 平台期(特意避开 0.02 背诵区)
使用
方式一:PEFT 直接加载
from unsloth import FastLanguageModel
from peft import PeftModel
model, tokenizer = FastLanguageModel.from_pretrained(
model_name="unsloth/Qwen3-8B-unsloth-bnb-4bit",
max_seq_length=2048, load_in_4bit=True,
)
model = PeftModel.from_pretrained(model, "你的仓库/anon-mygo-qwen3-8b-lora")
FastLanguageModel.for_inference(model)
方式二:ollama 挂载(推荐,不合并权重、无精度漂移)
ollama pull qwen3:8b-q8_0 # 或自建 Q8 GGUF 基座
cat > Modelfile <<'EOF'
FROM qwen3:8b-q8_0
ADAPTER ./anon-lora-f16.gguf
PARAMETER temperature 0.7
PARAMETER top_p 0.9
PARAMETER repeat_penalty 1.1
SYSTEM """<粘贴 system_prompt_anon.txt 全文>"""
EOF
ollama create anon-mygo:q8_0 -f Modelfile
ollama run anon-mygo:q8_0
方式三:完整套件(SLM + RAG + 重排序)
需要 ollama 模型 qwen3-embedding:0.6b 与 qwen3-reranker-causal:q8_0(因果版 GGUF,制作方法见 docs/DEPLOY_GUIDE.md 2.3 节):
python3 rag_service.py build # 构建知识库向量索引
python3 rag_service.py chat # 命令行聊天
python3 rag_service.py serve 8377 # HTTP 服务(含 OpenAI 兼容端点,可直接接 AstrBot 等客户端)
事实类问题由 RAG+重排序回答(注入阈值 P(yes)≥0.95),语气与人设由 LoRA 负责——这是刻意分工:事实不进权重,避免知识性过拟合。
验证摘要
- 30 题语气验证(寒暄/乐队/吉他/逆鳞/安慰/越界等 14 类):tone 4.50 / persona 4.05 / format 5.00
- 端到端事实问答(队名由来、歌曲词曲归属、角色喜好等)检索命中率与回复正确性人工核验通过
- 已知边界:8B 级人设毛刺(个别事实错位);知识库未覆盖的事实会"语气体面地不知道"
免责
本仓库为粉丝技术实践。训练语料来源于游戏官方剧情文本(仅用于个人学习),未包含在发布包中。请遵守 Bushiroad 二次创作准则。