基于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

一文通关 MySQL 数据类型,打好高性能数据库的第一战!

一文通关 MySQL 数据类型,打好高性能数据库的第一战!

🔥海棠蚀omo:个人主页                 ❄️个人专栏:《初识数据结构》,《C++:从入门到实践》,《Linux:从零基础到实践》,《Linux网络:从不懂到不会》,《MySQL:新手入门指南》                 ✨追光的人,终会光芒万丈 博主简介: 目录 一.数值类型 1.1tinyint类型 1.2bit类型 二.小数类型 2.1float类型 2.2decimal类型 三.字符串类型 3.1char类型 3.2varchar类型 3.3char和varchar的比较 四.日期和时间类型 五.enum和set 5.1查询set中的数据 前言: 在上一篇文章中,我们学习了库和表的相关操作,而在我们上一篇的讲解中,我们提到了在列名后面跟的是数据类型,但是对于MySQL中的数据类型我们现在还一知半解,那么今天这篇文章我们就来详细谈一谈MySQL中的数据类型。 那么在详细讲解每种数据类型之前,

By Ne0inhk
RUST异步微服务架构的最佳实践与常见反模式

RUST异步微服务架构的最佳实践与常见反模式

RUST异步微服务架构的最佳实践与常见反模式 一、项目优化前的问题分析 1.1 任务调度不合理 💡在第21篇项目中,用户同步服务的任务调度使用了Cron调度器,但Cron调度器的精度有限,可能导致任务执行延迟。此外,任务的并发度没有配置,可能导致任务积压。 1.2 I/O资源限制不足 订单处理服务的TCP连接队列大小没有配置,可能导致连接失败。数据库连接池的大小没有配置,可能导致数据库连接耗尽。 1.3 同步原语使用不当 实时监控服务中,Redis连接没有使用连接池,可能导致连接开销过大。任务结果的处理没有使用批量操作,可能导致上下文切换过多。 1.4 错误处理不完善 任务失败的处理逻辑不够完善,没有进行任务重试和错误统计。服务之间的通信没有进行超时管理和错误处理。 二、异步架构设计模式的应用 2.1 命令查询分离(CQS) CQS是一种架构设计模式,将系统的操作分为命令和查询两种类型。命令用于修改系统状态,查询用于获取系统状态,两者互不干扰。 在项目中,我们可以将用户同步任务视为命令操作,将系统状态查询视为查询操作: // 用户同步任务(

By Ne0inhk
英伟达GTC 2026大会开幕:AI智能体时代正式到来,黄仁勋发布新一代推理芯片与Rubin架构

英伟达GTC 2026大会开幕:AI智能体时代正式到来,黄仁勋发布新一代推理芯片与Rubin架构

导读:北京时间3月16日,全球AI行业的目光聚焦圣何塞。英伟达创始人黄仁勋在GTC 2026大会主题演讲中,正式宣告AI产业从“造模型”迈入“用模型”的新纪元,发布了新一代推理芯片与Rubin架构,并推出对标OpenAI的AI智能体平台。这场科技盛宴不仅揭示了未来三年的技术方向,更将直接影响千行百业的数字化转型进程。 核心新闻摘要 时间:2026年3月16日(北京时间) 事件:英伟达GTC 2026大会在加州圣何塞正式开幕,黄仁勋发表了长达两小时的主题演讲。 核心发布: * 新一代推理芯片:性能较上一代提升50%,功耗降低30%,专门针对AI智能体、大规模推理场景优化。同时推出了更便宜的入门级AI芯片,旨在降低中小企业使用AI的门槛。 * Rubin架构GPU(R100/R200系列):基于3nm工艺与HBM4内存,性能实现代际跃升,聚焦AI工厂与物理AI应用。 * AI智能体平台:对标OpenAI,支持工业制造、办公文档、智能家居等多场景的自主任务执行,能够自主学习用户习惯,优化交互体验。 * 开源大模型圆桌讨论:黄仁勋亲自主持,邀请Perplexity创始人Ar

By Ne0inhk
Flutter 组件 shelf_router 的适配 鸿蒙Harmony 实战 - 驾驭官方标准路由器架构、实现鸿蒙端 HTTP 流量精密分发与逻辑路由审计方案

Flutter 组件 shelf_router 的适配 鸿蒙Harmony 实战 - 驾驭官方标准路由器架构、实现鸿蒙端 HTTP 流量精密分发与逻辑路由审计方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 shelf_router 的适配 鸿蒙Harmony 实战 - 驾驭官方标准路由器架构、实现鸿蒙端 HTTP 流量精密分发与逻辑路由审计方案 前言 在鸿蒙(OpenHarmony)生态的分布式业务中继、政务级内嵌 API 管理平台以及需要承载大规模高频交互请求的各类全栈式应用开发中,“路由的精确支配与逻辑安全性”是决定系统架构稳健性的命门所在。面对包含上百个 RESTful 端点的复杂服务模型、需要动态解析包含 UUID、日期等多种格式的 URL 参数,或者是需要针对鸿蒙手机与智慧大屏执行差异化的路由匹配。如果仅仅依靠原始的字符串拆分或低性能的手写拦截逻辑。不仅会导致路由解析执行效率的低下,更会因为缺乏一套工业级的“官方契约”规范。引发鸿蒙端微服务接口在面对异常报文时的逻辑脆弱性风险。 我们需要一种“官方背书、匹配闭环”的路由艺术。 shelf_router 是一套由 Dart 官方团队维护的、

By Ne0inhk