🚀 实践步骤概览
今天我们要在MAC上完成一个完整的AI项目闭环:
微调一个大模型 → 2. 导出模型并部署 → 3. 暴露API给web后端 → 4. 前端展示
🛠️ 微调模型准备
核心配置
框架:LLama-Factory 🏭
算法:LoRA (低秩适应) 🧠
基座模型:
deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B(来自HuggingFace)
📥 第一步:下载LLama Factory
# 如果下载失败的话,可以手动下载压缩包 git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory # 下载依赖包 pip install -e ".[torch,metrics]" # 检验是否安装成功 llamafactory-cli version # 启动webui llamafactory-cli webui
💡 小贴士:部署成功后会自动弹出
localhost:7860的页面哦!
🧩 基座模型下载
曲折经历:原本想用huggingface-cli命令下载,但多次尝试失败后,我选择了手动下载...
mkdir Hugging-Face # 将下载的模型放在该目录下
指定模型路径
点击加载按钮
等待模型加载完成
📚 准备微调数据
参考LLama-Factory的身份训练数据模板,替换{{name}}和{{author}}:
[{
"instruction": "你好",
"input": "",
"output": "您好,我是 {{name}},一个由 {{author}} 开发的 AI 助手,很高兴认识您。请问我能为您做些什么?"
},
{
"instruction": "你好",
"input": "",
"output": "您好,我是 {{name}},一个由 {{author}} 打造的人工智能助手,请问有什么可以帮助您的吗?"
}]
关键操作:
创建
magic_conch.json文件放在LLama-Factory/data下在
dataset_info.json中添加配置:
"magic_conch": {"file_name": "magic_conch.json"},
⚙️ 微调参数设置与执行
微调完成后:
在chat界面卸载模型
选择检查点重新导入
测试提问"我是谁",验证微调效果
📦 导出完整模型
mkdir -p Models/deepseek-r1-1.5b-merged
🔍 技术说明:LoRA只是低秩矩阵,调整了部分权重,需要合并导出完整模型
在UI上:
选择export(导出)
选择导出设备为auto
设置导出路径
点击导出按钮
🌐 创建FastAPI接口
from fastapi import FastAPI
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
app = FastAPI()
# 模型路径
model_path = "/Users/xxx/deepseek/Models/deepseek-r1-1.5b-merged"
# 加载 tokenizer (分词器)
tokenizer = AutoTokenizer.from_pretrained(model_path)
# 加载模型并移动到可⽤设备(GPU/CPU)
device = "cuda" if torch.cuda.is_available() else "cpu"
model = AutoModelForCausalLM.from_pretrained(model_path).to(device)
@app.get("/generate")
async def generate_text(prompt: str):
inputs = tokenizer(prompt, return_tensors="pt").to(device)
outputs = model.generate(inputs["input_ids"], max_length=150)
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
return {"generated_text": generated_text}
if __name__ == '__main__':
import uvicorn
uvicorn.run(app,host='localhost',port=8060)
☕ Java后端调用示例
关键代码(完整项目见GitHub):
@RestController
@RequestMapping(value = "/chat")
public class ChatController {
@Autowired
private ChatService chatService;
@RequestMapping("/generate")
@ResponseBody
public Result generate(@RequestParam String prompt) {
// 参数校验和异常处理
try {
String res = chatService.callAiForOneReply(prompt);
return Result.success().setData(res);
} catch (Exception e) {
return Result.error();
}
}
}
@Service
public class ChatServiceImpl implements ChatService {
@Autowired
private RestTemplate restTemplate;
public String callAiForOneReply(String prompt) {
String url = String.format("%s/generate?prompt=%s",
aiServiceConfig.getBaseUrl(), prompt);
GenerateResponse response = restTemplate.getForObject(url, GenerateResponse.class);
return response != null ? response.getGenerated_text() : "";
}
}
🎉 大功告成!
现在你已经完成了:
模型微调
模型导出
API服务搭建
后端集成
下一步:可以开始设计炫酷的前端界面啦!🚀
💬 遇到问题?欢迎在评论区交流讨论~