基于Llamafactory与LoRA方法的大语言模型微调创建个性化聊天机器人

基于Llamafactory与LoRA方法的大语言模型微调创建个性化聊天机器人

一 、项目背景

随着大语言模型的快速发展,如何让通用模型具备垂直领域的深度知识特定的角色人格,已成为参数高效微调(PEFT,Parameter-Efficient Fine-Tuning)技术的重要应用方向。传统的提示词难以让模型长期、稳定地维持复杂的角色设定和世界观知识,而全参数微调成本高昂。

本项目旨在利用 LlamaFactory 这一大模型微调框架,结合 LoRA(低秩适应) 技术,在保留基础模型通用能力的前提下,低成本地注入明日方舟游戏内的专属知识。目标是打造一个不仅能流畅对话,更能深度理解游戏内世界观设定、模拟特定人格说话方式的智能聊天机器人。

二、 介绍

2.1 Llamafactory

Llamafactory 是一个专注于高效微调大型语言模型的开源工具库。它旨在简化模型微调流程,支持多种主流开源模型,并提供丰富的训练策略和优化技术。其支持多种微调方法,包括全参数微调(Full Fine-tuning)、轻量级微调(如LoRA、QLoRA)、适配器微调(Adapter)等。兼容Hugging Face生态系统,可直接加载预训练模型。

2.2 LoRA

构建大语言模型需要耗费大量时间和资源。这些模型可能包含数万亿个参数,并被设置为特定值。要使模型在特定环境下运行,可能需要进行大量的重新训练,这意味着所有参数都会改变。由于此类模型的参数数量庞大,重新训练既耗时又费力。LoRA(Low-Rank Adaptation) 提供了一种无需重新训练即可快速调整模型的方法。其通过引入低秩矩阵来调整模型的权重,从而显著减少需要训练的参数数量。这种方法在保持模型性能的同时,降低了计算成本和内存占用。

2.3 环境要求

三、 Llamafactory的环境搭建与本地大模型以及数据集的准备

3.1 搭建环境

# 克隆仓库 git clone --depth 1 https://github.com/hiyouga/LlamaFactory.git cd LlamaFactory # 安装依赖 pip install -e . pip install -r requirements/metrics.txt

在安装完依赖后,可执行以下命令进入llamafactory webui

# 进入 Webui llamafactory-cli webui

3.2  下载大模型到本地

在开始使用LlamaFactory微调之前,将基座模型下载到本地是非常重要的一步。因为相比于每次训练从huggingface下载,下载大模型文件到本地进行训练是更加稳定且安全的。用户可以自行选择通过Modelscope或Huggingface将大模型拉取到本地。

这里以从Modelscope库下载Qwen2.5-7B-instruct为例

# 安装Modelscope pip install modelscope # 安装完整模型库 modelscope download --model Qwen/Qwen2.5-7B-Instruct
# 也可以使用Git下载 # 确保lfs已被正确安装 git lfs install git clone https://www.modelscope.cn/Qwen/Qwen2.5-7B-Instruct.git

3.3 准备数据集

这是开始微调前的最后一步,也是非常影响微调后模型效果的重要的一步。Llamafactory主要支持以下三种数据集格式:

# Alpaca 格式 [ { "instruction": "user instruction (required)", "input": "user input (optional)", "output": "model response (required)", "system": "system prompt (optional)", "history": [ ["user instruction in the first round (optional)", "model response in the first round (optional)"], ["user instruction in the second round (optional)", "model response in the second round (optional)"] ] } ]
# Sharegpt 格式 [ { "conversations": [ { "from": "human", "value": "user instruction" }, { "from": "function_call", "value": "tool arguments" }, { "from": "observation", "value": "tool result" }, { "from": "gpt", "value": "model response" } ], "system": "system prompt (optional)", "tools": "tool description (optional)" } ]
# Openai 格式 [ { "messages": [ { "role": "system", "content": "system prompt (optional)" }, { "role": "user", "content": "user instruction" }, { "role": "assistant", "content": "model response" } ] } ]

由于训练集的质量对结果的影响远大于数量,所以建议不要过于依赖ai生成的对话。低质量的AI生成数据不仅无益,反而可能引入噪音,导致模型学习到错误的对话模式。笔者的思路是,首先人工撰写一部分高质量对话,再结合游戏内的文本以及游戏背景世界观,引导ai在此基础上进行分层扩写,对ai做出不同场景下对话的要求(如日常对话,夹杂世界观背景的对话等)。这一部分的比例可以根据需求自行调整。但需对ai生成的对话做检查,对明显不符合世界观或者人物性格的对话做删除或修改。下面是一个从明日方舟wiki源代码提取特定人物文本的脚本。

import re #复制文本' ''' # 使用正则表达式匹配特定格式的对话行 matches = re.findall(r'\[name="普瑞赛斯"\](.*?)\n', text) # 输出 for i, line in enumerate(matches, 1): print(f"{i}. {line}")

数据集准备就绪后,需将其以 JSON 格式存放于 `LlamaFactory/data/` 目录下,并在 `dataset_info.json` 配置文件中完成对应数据集的注册。

 "your data": { "file_name": "preseries_dataset.json", # 这里是你数据集的名字 "format": "alpaca", # 对话模板类型 "columns": { "instruction": "instruction", "output": "output" } },

至此,训练前的准备工作已全部完成,可以在llamafactory webui中进行微调了。

四、 在Llamafactory Webui中进行微调

4.1 首先对llamafactory提供了以下几种微调方式:

1. 全参数微调(Full Parameter Fine-Tuning)

全参数微调是指对预训练模型的所有参数进行更新。这种方法通常需要较大的计算资源和数据量,但能充分调整模型以适应特定任务。适用于数据充足且任务与预训练目标差异较大的场景。

2. LoRA(Low-Rank Adaptation)

LoRA通过低秩矩阵分解来微调模型,仅训练新增的低秩矩阵参数,冻结原始模型参数。显著减少计算和存储开销,适合资源受限的场景。

3. Freeze(参数冻结)

Freeze方法冻结预训练模型的大部分参数,仅微调部分层(如分类头或特定模块)。计算成本低,适用于小规模数据或迁移学习中特征提取层无需调整的场景。

4. OFT(Orthogonal Fine-Tuning)

OFT通过正交变换约束微调过程,保持模型参数的范数和正交性,避免灾难性遗忘。适用于需要保持预训练模型通用性的场景。

对于聊天机器人的训练,LoRA 是最为推荐的微调方法。这主要基于以下几个原因:首先,对话数据具有多样性和多轮性特点,LoRA 通过低秩适配矩阵能够有效捕捉对话模式,同时保持基座模型的通用语言能力不受破坏;其次,聊天机器人开发是一个不断试错、持续优化的迭代过程,LoRA 训练速度快,便于快速验证新数据效果;第三,LoRA 对硬件要求友好,能够在消费级显卡上运行。相比之下,全参数微调虽然理论上能达到更好效果,但训练成本高、迭代周期长。因此,建议使用LoRA进行微调。

4.2 其他设置:

模型路径: 之前下载到本地的大模型的路径

对话模板: 由于不同的大模型有不同的模板,所以需要根据你的基座模型来选择相应的模板

学习率: 学习率是控制模型在每次参数更新时调整步长的超参数,决定收敛速度与精度平衡。一般可以采用默认值5e-5

训练轮数: 训练轮数指机器学习模型在整个训练数据集上完整迭代的次数。在数据量小的情况下可以适当增加训练轮数防止欠拟合

计算类型: bf16具有较大的数值范围,能有效防止训练过程中的梯度溢出和损失爆炸,保证训练稳定性,在训练聊天机器人时一般采用bf16

其余参数可以根据自己的数据集以及对机器人的要求做更改。

4.3 开始微调

在开始微调后,网页右下角会开始自动生成损失函数曲线。通常来说,损失函数的值越低,效果就越好。该过程根据硬件的不同持续的时间也不一样。若设备性能较差可以考虑租用云算力平台。

4.4 模型导出

在微调完成后,可以在llamafactory webui中点击Chat,先加载检查点路径,看看微调效果是否理想。若效果理想,则可以点击Export进行导出了。在Export页面下输入导出路径,基座模型就会与LoRA权重合并并导出到该路径下。

五、 转换格式以及量化

5.1 将safetensors转换成gguf

导出后的模型是safetensores格式,若想进行大模型的ollama本地部署,首先要进行格式转换。在这里使用llamacpp的convert_*.py脚本进行大模型格式的转换

#安装llama.cpp winget install llama.cpp #转换成gguf格式 python convert_hf_to_gguf.py models/7B/qwen1_5-7b-chat --outtype f16 --output ./qwen_gguf.gguf

这里请注意,部分较早的文章中使用的是convert-hf-to-gguf.py,但目前这个脚本已改成下划线。具体可在llama.cpp目录下查看。

5.2 将fp16精度量化到q8或q4精度

在得到fp16精度的gguf文件后,还要进行量化。量化是通过降低模型参数的精度,大幅减少显存占用和计算量,并保持相近的效果。

#将fp16精度量化到q4 ./quantize models/7B/qwen1_5-7b-chat-fp16.gguf models/7B/qwen1_5-7b-chat-q8_0.gguf q8_0

至此已经得到了一个q8精度的大模型,可以进行本地部署了。

六、 将大模型导入Ollama完成本地部署

6.1 Ollama的介绍与下载

Ollama 是一个开源的大型语言模型交互工具,支持在本地运行和微调多种主流模型。其核心功能包括模型下载、版本管理、对话交互和 API 集成,适合开发者和研究人员快速部署 LLM 到本地环境。

# Windows用户可以直接下载Ollama客户端 # Linux或者云平台用户 curl -fsSL https://ollama.com/install.sh | sh 

6.2 Modelfile

导入Ollama这一步需要之前准备好的gguf文件以及一个Modelfile。Modelfile是Ollama用于定义和配置模型的核心文件,采用声明式语法描述模型参数、依赖项及生成规则。通过Modelfile,用户可以自定义模型行为、调整推理参数或整合外部数据。

其格式如下:

# 模型文件 FROM ./ollama-model.gguf # 推理参数 PARAMETER <parameter> <parametervalue> #对话模板 TEMPLATE """{{ if .System }}<|im_start|>system {{ .System }}<|im_end|> {{ end }}{{ if .Prompt }}<|im_start|>user {{ .Prompt }}<|im_end|> {{ end }}<|im_start|>assistant """ # 系统提示词 SYSTEM """<system message>"""

6.3 导入Ollama

在准备好gguf文件和Modelfile后,就可以将微调好的大模型导入Ollama并进行测试了,

# 将模型导入Ollama,名字自定义 ollama create Priestess_q8 -f ./Modelfile # 打模型列表 ollama list # 运行模型 ollama run Priestess_q8 

如果一切正常,即已经完成了本地部署,效果如下

七、 使用Napcat和Astrbot框架接入QQ

# 通过 Docker Compose 将Astrbot和Napcat部署 mkdir astrbot cd astrbot wget https://raw.githubusercontent.com/NapNeko/NapCat-Docker/main/compose/astrbot.yml sudo docker compose -f astrbot.yml up -d

具体详细步骤请参考其他接入QQ机器人的文章,最终效果如下

Read more

2026微信小程序抓包全解析:从实操落地到合规风控,解锁前端调试新范式

在移动互联网与小程序生态深度融合的今天,微信小程序已成为企业数字化转型、用户服务触达的核心载体。从电商交易、政务服务到生活便民,小程序的轻量化、高便捷性优势凸显,但随之而来的是接口调试、数据校验、安全排查等需求的激增——而抓包技术,正是解决这些需求的核心手段。 不同于传统APP抓包,微信小程序基于微信内核运行,存在「系统代理绕过、HTTPS证书严格校验、进程隔离」三大核心壁垒,再加上2025-2026年微信官方对小程序安全机制的持续升级,传统抓包方法已逐渐失效。本文将从实操落地、工具选型、问题排错、合规风控四个维度,为开发者、测试工程师及技术爱好者,提供一份专业、全面、具前瞻性的微信小程序抓包指南,助力大家高效突破技术壁垒,规避风险。 一、核心认知:为什么微信小程序抓包比APP更难? 要做好小程序抓包,首先要理解其与传统APP抓包的本质区别——微信小程序并非独立运行的应用,而是寄生在微信客户端内,依托微信自带的WebView内核(iOS端为WKWebView,Android端为X5内核)运行,这就决定了其抓包的特殊性: * 代理绕过机制:微信内核默认优先级高于系统代理,即便

关于前端访问浏览器报错的小坑

以下是前端开发中,浏览器访问页面时经常遇到的报错小坑,以及常见原因和解决办法(2025年视角,基于当前主流浏览器 Chrome / Edge / Firefox / Safari): 1. ERR_CONNECTION_REFUSED / 无法连接到服务器 现象:浏览器显示“无法访问此网站”或“ERR_CONNECTION_REFUSED” 常见原因: * 本地开发服务器没启动(npm run dev、yarn dev、vite、next dev 等没跑) * 端口被占用 * 防火墙拦截了端口 * 访问了错误的地址(比如写成 http://localhost:3000 但服务跑在 5173) 解决: * 确认开发服务器是否在运行 * 检查终端输出端口号(Vite 默认 5173,Create React App

前端微前端:别让你的应用变成巨石应用

前端微前端:别让你的应用变成巨石应用 毒舌时刻 这应用做得跟巨石似的,想改个功能都得动全身。 各位前端同行,咱们今天聊聊前端微前端。别告诉我你还在维护一个巨大的单体应用,那感觉就像在没有分区的大房子里生活——能住,但乱得要命。 为什么你需要微前端 最近看到一个项目,代码量超过 100 万行,构建时间超过 10 分钟,团队协作困难。我就想问:你是在做应用还是在做代码仓库? 反面教材 // 反面教材:单体应用 // App.jsx import React from 'react'; import Header from './components/Header'; import Sidebar from './components/Sidebar'; import Dashboard from

后端代码不用写了?前端操作数据库?一文精通Supabase,实战教程+本地部署

后端代码不用写了?前端操作数据库?一文精通Supabase,实战教程+本地部署

视频版:https://www.bilibili.com/video/BV1ZJsBznEt3 2025年最火的后端开源项目那必须是Supabase。Supabase是一个开源的后端级服务框架,在强大的PostgreSQL数据库的基础上,封装了用户认证、文件存储、可视化的运维面板等功能,为开发者提供了一整套开箱即用的后端基础设施。Supabase在Github上面有恐怖的9万star,这已经是整个Github上面最顶级的开源项目之一了。 总的来说,Supabase为开发者提供了三大部分的能力:后端、前端与免费的云服务。Supabase在后端提供数据库、文件存储、边缘函数、用户鉴权等各种基础设施。在前端方面,Supabase提供客户端SDK,可以将任何一个前端框架,比如React, Vue,甚至手机APP,用几行代码就可以轻松接入后端。 Supabase是一个完全开源免费的项目,我们可以使用源代码或者docker镜像,自己部署一个Supabase的完整实例。如果懒得自己部署,Supabase的官方还提供一个云服务的版本,我们只需要注册一个账户,就能立即获得一个免费的Supabase