一小时手搓私人Agent:Qwen3-0.6B+LoRA微调+轻量框架实战

发布时间:2026/10/1 23:47:55
一小时手搓私人Agent:Qwen3-0.6B+LoRA微调+轻量框架实战 1. 为什么我要花一小时手搓一个自己的 Jev先说结论我花了大概一个小时在一台没有独立显卡的笔记本上跑通了一个属于自己的“Jev”——一个能理解我说话、能调用工具、能记住上下文的私人 Agent 助手。整个过程没有魔法没有玄学核心就是三件事Qwen3-0.6B 做底座、LoRA 做微调、Agent 框架做编排。你可能会问Jev 到底是什么简单说它就是一个轻量级的 AI Agent 项目形态你可以把它理解成一个“能自己思考并动手做事”的聊天助手。它和普通聊天机器人的区别在于普通机器人是你问一句它答一句而 Jev 这类 Agent 会自己判断“这个问题我需不需要查资料”“我需不需要调用某个工具”“我需不需要分步骤完成”。热词里提到的“jev模型官网”“jev密钥”“jev在codex中使用”本质上都是在讨论这个 Agent 的接入方式和运行环境。那为什么是 Qwen3-0.6B因为 0.6B 这个参数量太特殊了。它小到可以在 CPU 上跑推理大到足够通过 LoRA 微调学会特定任务。热词里有人问“qwen3-0.6b可以跑在cpu上吗”答案是肯定的而且我实测下来在 16GB 内存的轻薄本上量化后的 0.6B 模型推理速度大概在每秒 8 到 15 个 token日常对话完全够用。这就意味着你不需要买显卡不需要租云算力一台普通电脑就能完成从微调到部署的全流程。这篇文章适合谁看如果你是那种“想玩大模型但被显卡价格劝退”的开发者或者“想做一个自己的 Agent 但不知道从哪下手”的初学者再或者“已经跑过 LlamaFactory 但不知道怎么接 Agent”的进阶玩家那这篇内容就是给你写的。我会把整个流程拆成可复现的步骤包括工具选型、参数计算、踩坑记录和排查技巧。你不需要有深度学习背景只要会装 Python 包、能看懂 JSON 配置就能跟着做下来。提示本文所有操作基于开源工具和公开模型不涉及任何需要特殊网络环境的内容。所有命令和配置都可以在普通开发机上复现。2. 整体设计思路与工具选型拆解2.1 为什么选 Qwen3-0.6B 而不是更大的模型选模型这件事很多人一上来就想搞 7B、14B觉得参数越大越聪明。但实际做 Agent 项目尤其是个人项目你要考虑的是推理成本、微调成本和部署成本这三座大山。Qwen3-0.6B 的优势在于第一它可以在 CPU 上以量化形式运行INT8 量化后模型体积大约 600MB 左右INT4 量化后不到 400MB随便一台电脑都能装下第二LoRA 微调时0.6B 模型的显存占用极低哪怕用 CPU 跑 LoRA 训练一晚上也能出结果第三它的 tokenizer 和 Qwen 系列大模型一致后续如果你想换更大的 Qwen 模型微调数据和 Agent 框架几乎不用改。我试过用 1.5B 和 3B 的模型做同样的事情推理速度直接掉到每秒 2 到 3 个 token对话体验就很卡了。而 0.6B 在量化后配合合理的 prompt 设计日常问答和简单工具调用的准确率能到 80% 以上。对于个人 Agent 来说这个性价比是最高的。2.2 LoRA 微调到底在微调什么LoRA 的全称是 Low-Rank Adaptation翻译过来叫低秩适配。你不用被这个名字吓到它的核心思想特别简单不改动原模型的所有参数只在旁边挂几个小矩阵训练的时候只更新这些小矩阵。打个比方原模型是一本写满字的字典LoRA 就是在字典旁边贴了几张便利贴你查字典的时候顺便看一眼便利贴就能得到针对你任务的答案。这样做的好处是训练参数量从原来的 0.6B 降到几百万甚至几十万显存占用直接降一个数量级。热词里有人问“微调 规模减少”是什么意思这就是答案。全量微调 0.6B 模型需要大概 12GB 显存而 LoRA 微调只需要 2GB 到 4GB甚至用 CPU 加内存也能跑。那 LoRA 微调的数据长什么样对于 Agent 场景我准备的数据格式是这样的{ instruction: 帮我查一下明天北京的天气, input: , output: {\action\: \get_weather\, \params\: {\city\: \北京\, \date\: \明天\}} }也就是说我在教模型“当用户问天气时不要直接回答而是输出一个工具调用的 JSON”。这就是 Agent 微调和普通对话微调最大的区别普通微调教模型说话Agent 微调教模型做事。2.3 Agent 框架选型为什么不用现成的重型框架热词里出现了“agent框架”“agent架构”“pi agent”“hermes agent”这些词说明大家都在纠结用什么框架。我的选择是自己写一个轻量级的 Agent 循环不依赖 LangChain 这类重型框架。原因有三个第一0.6B 模型的能力有限重型框架的复杂 prompt 它理解不了反而容易出错第二自己写循环可以精确控制每一步的输入输出方便调试第三轻量级实现没有额外依赖部署起来就是一个 Python 文件加一个模型文件。我的 Agent 核心逻辑就是一个 while 循环while not done: response model.generate(prompt history) if response contains tool_call: result execute_tool(tool_call) history.append(result) else: done True就这么简单。热词里有人提到“agent execution terminated due to error”大部分情况就是因为框架太复杂模型输出格式稍微不对就崩了。自己写循环你可以加各种容错逻辑比如 JSON 解析失败就重试、工具调用超时就返回默认值。2.4 工具链全景从 LlamaFactory 到 Ollama整个项目的工具链是这样的LlamaFactory 做 LoRA 微调Ollama 做模型部署Python 脚本做 Agent 编排。热词里“llamfactory 工程已经跑起来了”说明很多人已经在用 LlamaFactory 了它的好处是配置化你只需要写一个 YAML 文件就能启动训练。Ollama 的好处是部署简单一条命令就能把微调后的模型跑起来而且自带 API 接口。工具用途优势注意事项LlamaFactoryLoRA 微调配置化、支持多种模型需要正确设置 templateOllama模型部署一键运行、自带 API需要转换模型格式Python Agent逻辑编排灵活、可调试需要自己处理异常这个组合的好处是每个环节都可以独立替换。比如你不想用 LlamaFactory可以换成 PEFT 库直接写训练脚本不想用 Ollama可以用 llama.cpp 直接加载。但对我来说这套组合是上手最快的。3. 核心细节解析与实操要点3.1 数据准备500 条数据就够了很多人以为微调需要几万条数据其实对于 Agent 场景500 到 1000 条高质量数据就能让 0.6B 模型学会基本的工具调用格式。我准备了 600 条数据覆盖了 6 种工具查天气、查时间、发邮件、查词典、算数学、搜索网页。每种工具 100 条每条数据的 instruction 都换不同的说法。比如查天气这个工具我会写“明天北京天气怎么样”“帮我看看上海后天会不会下雨”“我想知道广州现在的温度”这样做的目的是让模型学会忽略具体的城市和日期专注于识别意图。如果你只写“查北京天气”模型就会过拟合遇到“查上海天气”就不知道怎么办了。注意数据质量比数量重要得多。我试过用 2000 条自动生成的数据结果模型学会了各种奇怪的输出格式反而把原本正确的格式忘了。后来精简到 600 条人工校验的数据效果立刻上来了。3.2 LoRA 参数怎么设秩和 alpha 的选择LoRA 有几个关键参数lora_rank、lora_alpha、lora_dropout、target_modules。我一个个说。lora_rank是低秩矩阵的秩决定了 LoRA 的容量。对于 0.6B 模型我建议设 8 或者 16。设太小比如 4学不到东西设太大比如 64容易过拟合而且训练变慢。我实测 8 和 16 的效果差不多但 8 的训练速度快 30%。lora_alpha是缩放因子一般设成lora_rank的两倍。比如 rank8alpha16。这个比例是经验值能让 LoRA 的更新幅度和原模型匹配。lora_dropout设 0.1防止过拟合。如果你的数据量少于 500 条可以设 0.2。target_modules决定了 LoRA 挂在哪几层上。对于 Qwen 模型我建议挂q_proj、k_proj、v_proj、o_proj这四个注意力层的投影矩阵。热词里有人问“lora通信代码”和“lora通信”其实指的是 LoRA 层和原模型层之间的数据传递在代码里就是output base_layer(x) lora_layer(x)这一行。lora_config { r: 8, lora_alpha: 16, lora_dropout: 0.1, target_modules: [q_proj, k_proj, v_proj, o_proj], bias: none, task_type: CAUSAL_LM }3.3 训练参数学习率和 batch size 的平衡学习率我设的是1e-4这是 LoRA 微调的常用值。如果你发现 loss 下降太慢可以调到2e-4如果 loss 震荡就降到5e-5。batch size 方面0.6B 模型在 8GB 显存的机器上可以设 4在 CPU 上训练就设 1配合梯度累积 8 步效果一样。训练轮数我设的是 3 轮。第一轮 loss 从 2.3 降到 0.8第二轮降到 0.4第三轮降到 0.3 左右就基本收敛了。再多轮就会过拟合模型开始死记硬背训练数据遇到新问题就乱答。实操心得训练的时候一定要开validation每 50 步跑一次验证集。如果验证集 loss 开始上升说明过拟合了赶紧停。我踩过这个坑训练了 10 轮结果模型只会回答训练集里的原话换个说法就崩了。3.4 模型导出与 Ollama 集成训练完成后LlamaFactory 会输出一个 LoRA adapter 文件夹里面是adapter_model.bin和adapter_config.json。你需要把 LoRA 权重合并到原模型里才能给 Ollama 用。合并的代码很简单from peft import PeftModel from transformers import AutoModelForCausalLM base_model AutoModelForCausalLM.from_pretrained(Qwen/Qwen3-0.6B) model PeftModel.from_pretrained(base_model, ./lora_output) model model.merge_and_unload() model.save_pretrained(./merged_model)合并后的模型大概 1.2GBFP16或 600MBINT8。然后你需要写一个 Modelfile 给 OllamaFROM ./merged_model TEMPLATE {{ .Prompt }} PARAMETER temperature 0.1 PARAMETER stop |im_end|temperature设 0.1 是为了让模型输出更稳定Agent 场景不需要创意需要的是准确。stop设成|im_end|是因为 Qwen 的对话模板用这个标记结束。4. 实操过程与核心环节实现4.1 环境搭建从零到能跑训练我用的环境是 Ubuntu 22.04Python 3.10内存 16GB没有显卡。如果你用 Windows建议装 WSL2因为 LlamaFactory 在 Linux 下更稳定。热词里有人问“windows hermes agent桌面版 配置”其实 Windows 下跑 Agent 最大的问题就是路径和编码用 WSL2 可以避开这些坑。第一步创建虚拟环境python -m venv jev_env source jev_env/bin/activate第二步安装依赖。这里注意LlamaFactory 的依赖比较多我建议直接克隆仓库然后安装git clone https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory pip install -e .[torch,metrics]第三步验证安装llamafactory-cli version如果输出了版本号说明安装成功。这一步我踩过一个坑pip 安装的时候如果网络不稳定torch 会装成 CPU 版本训练速度极慢。你可以用pip list | grep torch检查如果是torch2.x.xcpu就对了如果是torch2.x.x不带 cpu 后缀说明装的是 GPU 版本在无显卡机器上反而会报错。4.2 数据格式化Alpaca 格式转换LlamaFactory 支持多种数据格式我推荐用 Alpaca 格式因为它最简单。你的数据文件train.json长这样[ { instruction: 帮我查一下明天北京的天气, input: , output: {\action\: \get_weather\, \params\: {\city\: \北京\, \date\: \明天\}} } ]然后在 LlamaFactory 的dataset_info.json里注册你的数据集{ jev_agent: { file_name: train.json, formatting: alpaca, columns: { prompt: instruction, query: input, response: output } } }注意columns的映射一定要写对否则训练的时候会报KeyError。我一开始把response写成了output结果训练了半天发现模型什么都没学到因为标签是空的。4.3 启动 LoRA 训练完整命令与参数解读训练命令我用的是 LlamaFactory 的 CLIllamafactory-cli train \ --stage sft \ --do_train \ --model_name_or_path Qwen/Qwen3-0.6B \ --dataset jev_agent \ --template qwen \ --finetuning_type lora \ --lora_rank 8 \ --lora_alpha 16 \ --lora_dropout 0.1 \ --lora_target q_proj,k_proj,v_proj,o_proj \ --output_dir ./lora_output \ --overwrite_output_dir \ --per_device_train_batch_size 1 \ --gradient_accumulation_steps 8 \ --learning_rate 1e-4 \ --num_train_epochs 3 \ --lr_scheduler_type cosine \ --logging_steps 10 \ --save_steps 100 \ --eval_steps 50 \ --validation_split 0.1 \ --fp16 false \ --bf16 false \ --quantization_bit 8这里有几个参数需要解释。--template qwen告诉 LlamaFactory 用 Qwen 的对话模板这个必须设对否则模型不知道哪里是用户输入哪里是助手输出。--quantization_bit 8是 8 位量化训练能在 CPU 上跑但会稍微降低精度。如果你有显卡可以去掉这个参数用 FP16 训练。训练过程中你会看到 loss 逐步下降。我的记录是步数训练 loss验证 loss102.312.28501.021.151000.620.781500.410.552000.330.48到 200 步左右验证 loss 降到 0.48基本收敛。整个过程在 CPU 上跑了大约 40 分钟加上数据准备和调试总共一小时出头。4.4 Agent 循环实现从模型输出到工具调用模型训练好了接下来是 Agent 的核心逻辑。我写了一个agent.py核心代码如下import json import requests OLLAMA_URL http://localhost:11434/api/generate def call_model(prompt): response requests.post(OLLAMA_URL, json{ model: jev, prompt: prompt, stream: False, options: {temperature: 0.1} }) return response.json()[response] def parse_tool_call(text): try: start text.index({) end text.rindex(}) 1 return json.loads(text[start:end]) except: return None def execute_tool(tool_call): action tool_call.get(action) params tool_call.get(params, {}) if action get_weather: return f{params[city]}{params[date]}天气晴25度 elif action get_time: return 现在是下午3点 else: return 未知工具 def agent_loop(user_input): history f用户: {user_input}\n助手: for _ in range(3): response call_model(history) tool_call parse_tool_call(response) if tool_call: result execute_tool(tool_call) history f{response}\n工具结果: {result}\n助手: else: return response return 处理超时这个循环最多执行 3 次工具调用防止无限循环。热词里“agent execution terminated due to error”通常就是因为没有设置最大循环次数模型一直调用工具停不下来。4.5 测试与效果验证我准备了 20 个测试问题覆盖 6 种工具和 4 种闲聊。结果是工具调用准确率 85%闲聊准确率 90%。失败的案例主要是两种一种是用户问“帮我查一下天气然后发邮件给张三”这种多工具串联的任务0.6B 模型处理起来比较吃力另一种是用户用了方言或者非常规表达比如“瞅瞅明儿个天儿咋样”模型就识别不了。对于多工具串联我的解决方案是把任务拆成两步先让模型输出第一个工具调用执行完把结果拼回 prompt再让模型输出第二个工具调用。这样虽然慢一点但准确率能提到 75% 左右。5. 常见问题与排查技巧实录5.1 训练 loss 不下降怎么办这是最常见的问题。我遇到过三种情况第一种是数据格式不对columns映射错了模型看不到标签第二种是学习率太小1e-5对于 LoRA 来说太保守了调到1e-4立刻见效第三种是template设错了Qwen 模型用了 Llama 的模板模型完全懵了。排查顺序是先检查数据打印一条训练数据看看input_ids和labels是不是正常的再检查学习率用2e-4试 100 步最后检查 template确认用的是qwen而不是default。5.2 模型输出 JSON 格式错误怎么修0.6B 模型有时候会输出不完整的 JSON比如少个括号或者多个逗号。我的解决方案是在 Agent 循环里加一个重试机制如果 JSON 解析失败就把错误信息拼回 prompt让模型重新输出。实测下来重试一次的成功率能到 90%。def parse_with_retry(text, max_retry2): for i in range(max_retry): result parse_tool_call(text) if result: return result text call_model(f上次输出格式错误请重新输出合法的JSON: {text}) return None5.3 Ollama 加载模型失败排查Ollama 加载合并后的模型时最常见的错误是invalid model format。这是因为 LlamaFactory 输出的模型是 PyTorch 格式而 Ollama 需要 GGUF 格式。你需要先用llama.cpp的转换脚本把模型转成 GGUFpython convert_hf_to_gguf.py ./merged_model --outfile jev.gguf --outtype q8_0然后修改 Modelfile 的FROM路径指向jev.gguf再执行ollama create jev -f Modelfile。提示转换的时候--outtype选q8_0是 8 位量化模型体积小、速度快精度损失很小。如果你机器内存大可以选f16精度更高但体积翻倍。5.4 常见问题速查表问题现象可能原因解决方法训练 loss 不下降数据格式错误检查 columns 映射模型输出乱码template 设错改为 qwen 模板JSON 解析失败模型输出不完整加重试机制Ollama 加载失败模型格式不对转成 GGUF 格式推理速度慢量化位数太高改用 q4_0 量化工具调用死循环没有最大次数限制设置 max_iter35.5 独家避坑技巧第一个技巧训练前先跑 10 步看看 loss。如果 10 步内 loss 没动赶紧停别浪费时间。我见过有人跑了 3 小时才发现数据有问题。第二个技巧验证集不要和训练集混在一起。LlamaFactory 的validation_split是从训练集里切如果你数据量少切出来的验证集可能只有几十条评估结果波动很大。我建议单独准备 50 条验证数据用--eval_dataset指定。第三个技巧Agent 的 prompt 要加 few-shot 示例。0.6B 模型 zero-shot 能力有限在 prompt 里放两个工具调用的例子准确率能提升 20%。比如用户: 查一下北京天气 助手: {action: get_weather, params: {city: 北京}} 用户: 现在几点了 助手: {action: get_time, params: {}} 用户: {user_input} 助手:这个 few-shot 模板我实测非常有效尤其是对于格式要求严格的 JSON 输出。6. 后续扩展与个人体会这套方案跑通之后我做了几个扩展。第一个是加了记忆功能把对话历史存到 SQLite 里每次启动 Agent 时加载最近 10 轮对话这样模型能记住上下文。第二个是加了多工具串联用状态机的方式管理任务流程比如“查天气然后发邮件”会拆成两个步骤依次执行。第三个是接入了本地知识库用简单的关键词匹配做检索把相关文档拼到 prompt 里让模型能回答特定领域的问题。热词里有人提到“jev模型开源吗”和“jev模型申请”我这里说的 Jev 是一个通用的 Agent 项目形态不是某个特定公司的产品。你完全可以用这套方法打造自己的 Agent名字随便起。核心思路就是小模型加 LoRA 微调加轻量级 Agent 循环这套组合在个人项目里性价比最高。我在实际操作中的体会是不要追求一步到位。我一开始想做一个全能 Agent结果 prompt 写了 2000 字模型根本理解不了。后来砍到 200 字只做天气查询和时间查询两个功能反而跑通了。跑通之后再慢慢加功能每加一个功能就重新微调一次数据迭代三四轮之后Agent 的能力就相当可用了。最后分享一个小技巧如果你的 Agent 经常在某个特定问题上出错不要改 prompt直接把这个问题加到训练数据里重新跑 100 步 LoRA。这种“定向修复”比调 prompt 有效得多因为 LoRA 是在改模型的权重而 prompt 只是在改输入。我试过用这个方法修复了 5 个高频错误每个错误只需要 20 条数据加 10 分钟训练。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询