上承〔24 · 社区生态:围绕一个项目长出来的森林〕。前面二十四篇,训练靠命令行,对话靠
eval_llm.py。但命令行对不熟悉的人不友好。这一篇讲两条“不写代码”的路径:MiniMind 自带的 Streamlit Web UI,让你在浏览器里和模型对话;LLaMA-Factory,让你用图形界面完成 SFT / DPO / PPO 的微调。两条路都基于同一个前提:模型已经转换成 HuggingFace 格式。
一、Streamlit Web UI:浏览器里的对话界面
1.1 它是什么
MiniMind 自带一个基于 Streamlit 的 Web UI,脚本位置在 scripts/web_demo.py。它是一个单进程应用:Streamlit 负责管理 Web 服务器、会话状态和模型推理。
1.2 环境准备
需要 Python 3.10 以上,安装 Streamlit:
pip install streamlit transformers torch
然后把转换好的 HuggingFace 格式模型文件夹复制到 ./scripts/ 目录下:
cp -r minimind-3 ./scripts/minimind-3
这一步容易漏掉。 web_demo.py 会自动扫描 ./scripts/ 下的子目录,如果找不到任何权重文件,会直接报错。
1.3 启动
有两种方式。
方式一:前台启动,适合调试。
cd scripts && streamlit run web_demo.py
方式二:后台启动,适合长期运行。
cd scripts
nohup streamlit run web_demo.py \
--server.address 0.0.0.0 \
--server.port 80 \
--server.headless true > streamlit.log 2>&1 &
启动后,浏览器打开对应地址(默认 http://localhost:8501),就能看到对话界面。
1.4 界面功能
侧边栏提供这些可调项:
| 参数 | 范围 / 说明 |
|---|---|
| 模型路径 | 输入本地路径或 HuggingFace ID |
| 温度 | 0.0 – 2.0 滑块 |
| 最大生成长度 | 最大 8192 token |
| 历史轮数 | 调整对话上下文包含几轮 |
| 自适应思考 | 开关,控制 <think> 标签的生成 |
“自适应思考”开关对应第十五篇讲的自适应思考能力。
1.5 核心机制:流式输出
Web UI 的流式输出靠一个 TextIteratorStreamer 实现。
模型生成时,model.generate 在一个独立的 Thread 里运行。主线程同时遍历 Streamer,每拿到一个 token 就更新 UI。这就是“一个字一个字蹦出来”的效果。
1.6 和 API 的分工
第十七篇讲过 serve_openai_api.py。两者的定位不同:
Web UI(web_demo.py) | OpenAI API(serve_openai_api.py) | |
|---|---|---|
| 使用者 | 人类 | 程序 |
| 接入方式 | 浏览器 | HTTP 请求 |
| 典型场景 | 手动测试、演示 | FastGPT / OpenWebUI / Dify 接入 |
| 技术栈 | Streamlit | FastAPI |
一句话:Web UI 给人用,API 给程序用。
二、LLaMA-Factory:图形化的训练界面
2.1 为什么需要 LLaMA-Factory
MiniMind 自带的训练脚本(train_full_sft.py、train_dpo.py 等)是命令行程序。调参靠改配置或传参数。对不熟悉命令行的人来说,门槛不低。
LLaMA-Factory 是一个统一训练框架,提供 Web 界面,可以在浏览器里选择模型、上传数据、配置超参数、启动训练。MiniMind 作者在 Issue #465 里也表达过对这个集成的期望:“这样我们更多的关注对于数据的投喂,当前版本的命令提示符下操作太繁琐了”。
2.2 前提:Qwen3 兼容格式
LLaMA-Factory 不认识 MiniMind 的原生 .pth 格式。需要先用 convert_model.py 转换成 Qwen3 兼容格式。
转换后,模型在 LLaMA-Factory 里以 Qwen2(或 Qwen2MoE)模型类型加载。因为 MiniMind-3 的层结构对齐了 Qwen3/Qwen2 生态。
2.3 配置步骤
第一步:转换模型。
cd scripts
python convert_model.py --kpt_path ../out/full_sft_768.pth --save_dir ../minimind-3-hf
第二步:在 LLaMA-Factory 的 Web UI 里配置。
启动 LLaMA-Factory:
llamafactory-cli webui
然后在界面里:
- 模型名称:选
Qwen2(Dense)或Qwen2MoE(MoE) - 模型路径:指向转换后的
minimind-3-hf文件夹 - 微调方法:LoRA / QLoRA / Full / Freeze
- 数据集:上传或选择 MiniMind 格式的 JSONL 数据
2.4 支持哪些训练
LLaMA-Factory 支持 MiniMind 的 SFT、DPO、PPO 等训练阶段。论文里也提到,MiniMind 可与 LLaMA-Factory 互通。
三、回到开头的问题
两条“不写代码”的路径,解决的是同一个问题:降低使用门槛。
Web UI 让人在浏览器里和模型对话。调温度、看思考过程、连续聊天,都不需要碰命令行。
LLaMA-Factory 让人在浏览器里微调模型。选模型、传数据、配参数、点“开始训练”。
两条路都依赖同一个前提:模型必须转换成 HuggingFace 格式。原生 .pth 只在 MiniMind 项目内部流通。转到标准格式,才能接上更广阔的工具生态。
四、本篇概念清单
| 概念 | 本篇交代到什么程度 |
|---|---|
| Streamlit Web UI | 讲透:安装、启动、界面功能、流式输出机制 |
| TextIteratorStreamer | 讲清:后台线程 + 主线程遍历,实现流式 |
| 自适应思考开关 | 沿用 15 篇,不重复 |
| Web UI vs API | 讲清:人类用 vs 程序用 |
| LLaMA-Factory 集成 | 讲透:前提、配置步骤、Qwen2 模型类型 |
| Qwen3 兼容格式 | 沿用 17 篇,不重复 |
本篇要牢记的只有三个词:Streamlit、LLaMA-Factory、HuggingFace 格式。
五、思考题
- Web UI 把模型文件夹复制到
./scripts/下才能用。如果直接指定绝对路径,为什么不行?(提示:看web_demo.py的扫描逻辑) - LLaMA-Factory 加载 MiniMind 时选
Qwen2模型类型。如果 MiniMind 的架构改了,不再对齐 Qwen,这个集成还能用吗? - Web UI 和 OpenAI API 都支持流式输出。实现机制有什么不同?
- LLaMA-Factory 支持 LoRA 微调,MiniMind 自带的
train_lora.py也支持 LoRA。两者有什么区别?
备注:本篇的 Web UI 信息来自 MiniMind 的 DeepWiki 文档(Web UI Demo 章节)和 HuggingFace 模型卡。LLaMA-Factory 集成信息来自 DeepWiki 的 Third-Party Inference Engines 章节和社区教程。web_demo.py 的代码引用来自 DeepWiki 的行号标注。LLaMA-Factory 的模型类型配置参考了 MiniMind 的 Qwen3 兼容架构说明。