FeedLens反馈透镜

个人 AI 项目 · 小模型微调与落地

FeedLens 反馈透镜

把一句零散的中文用户反馈,整理成类别、情感、紧急度和一句话摘要。背后是一个在开源小模型 MiniMind 上微调得到的 64M 参数模型,可以在笔记本的 CPU 上运行。这个项目完整记录了它是怎么做出来的,以及它在哪些地方没有达到预期。

基于 MiniMind 微调,非从零训练64M 参数无需 GPU 推理训练与测试数据均为合成结果如实公开,含未达成的目标

它解决什么问题

小团队的用户反馈散落各处、没有结构、轻重混杂。FeedLens 在人工阅读之前先做一遍预整理。

1

问题

每周几十到几百条评论和留言,靠人读会漏。一条“被重复扣费”夹在二十条“希望加深色模式”里,很容易被晚看到。

2

做法

定义一个边界清晰、可量化的任务:短反馈进,四个字段出。为它造数据、微调小模型,并和关键词规则放在同一份测试集上比较。

3

产出

一个有名称、版本和说明卡的模型;一套可复现的数据、训练、评测流程;一个能实际输入并得到结果的网页应用;以及一份不回避问题的评测报告。

模型实际输出

FeedLens-MiniMind v0.1.0 · 全参数微调 · 训练运行 ft-full-v1

更新完之后一点开就闪退,重装了两次都没用

启动时闪退

功能故障紧急度 高情感 负面
明明取消了自动续费,这个月又扣了我25块

取消自动续费

支付订单紧急度 高情感 负面
希望能加个深色模式,晚上用太亮了

希望增加深色模式

功能建议紧急度 低情感 中性

以上是构建本页时(2026-10-12 19:58)FeedLens-MiniMind v0.1.0 在 CPU 上的实际输出,未经挑选或修改。

效果如何

所有数字读取自仓库中的评测输出文件,页面生成时自动填入。

最重要的一条结果

在“类别、情感、紧急度三项全对”这个指标上,微调后的模型没有超过一份约 90 行的关键词规则:同分布测试集 66.8% 对 71.9%,手写的分布外测试集 58.1% 对 58.1%。按核心表达聚类计算的置信区间下,两者没有可分辨的差别。模型明确更好的是情感判断(91.1% 对 79.6%)和同分布数据上的摘要(ROUGE-L 62.2 对 29.3)。原因分析与下一步见 评测报告。

66.8%
同分布测试集:类别、情感、紧急度三项全对(规则基线 71.9%)
58.1%
手写分布外测试集:三项全对,95% 区间 50–67(规则基线 58.1%)
100.0%
输出格式合规率(同分布测试集)
127ms
CPU 单条请求延迟中位数,P95 176 ms

预先写下的验收标准

  • 达成A1 同分布测试集格式合规率 ≥ 99% 100.0%
  • 未达成A2 同分布测试集三标签全对率 ≥ 90% 66.8%
  • 未达成A3 分布外测试集三标签全对率高于关键词规则 58.1% 对 58.1%
  • 未达成A4 同分布测试集摘要 ROUGE-L ≥ 0.80 0.622
  • 达成A5 CPU 单条请求 P95 延迟 < 500 ms 176 ms

这五条是在看到任何微调结果之前定下的。

同分布测试集 · 三标签全对率(977 条)

合成语法生成;测试集里的核心说法在训练集中没有出现过。

rules关键词规则基线,不使用模型(feedlens/baseline_rules.py)
71.9%
base-zeroshot训练前:MiniMind 官方 full_sft 权重,使用与微调时相同的简短指令
0.0%
base-detailed训练前:同一份官方权重,提示词里写明标签集合并给一个示例
1.3%
scratch-v1对照:同结构随机初始化,只用任务数据训练,不加载任何预训练权重
58.8%
ft-lora-v1在官方 full_sft 权重上训练 LoRA 适配器(主干冻结),取验证损失最低的检查点(第 350 步)
70.3%
ft-lora-v1-last同一次 LoRA 训练在结束时(第 966 步)的权重,用来对比“按验证损失选检查点”是否合适
71.4%
ft-full-v1在官方 full_sft 权重上全参数微调(验证损失最低即训练结束时,第 483 步)
66.8%
ft-full-v2v0.2:全参数微调,训练数据换成 v2;取验证损失最低的检查点(第 150 步,不到一轮)
69.2%
ft-full-v2-lastv0.2:同一次训练结束时(第 789 步)的权重
73.7%

分布外测试集 · 三标签全对率(117 条)

逐条手写,不经过合成语法。样本少,置信区间宽,小差距不足以下结论。

rules关键词规则基线,不使用模型(feedlens/baseline_rules.py)
58.1%
base-zeroshot训练前:MiniMind 官方 full_sft 权重,使用与微调时相同的简短指令
0.0%
base-detailed训练前:同一份官方权重,提示词里写明标签集合并给一个示例
1.7%
scratch-v1对照:同结构随机初始化,只用任务数据训练,不加载任何预训练权重
51.3%
ft-lora-v1在官方 full_sft 权重上训练 LoRA 适配器(主干冻结),取验证损失最低的检查点(第 350 步)
60.7%
ft-lora-v1-last同一次 LoRA 训练在结束时(第 966 步)的权重,用来对比“按验证损失选检查点”是否合适
64.1%
ft-full-v1在官方 full_sft 权重上全参数微调(验证损失最低即训练结束时,第 483 步)
58.1%
ft-full-v2v0.2:全参数微调,训练数据换成 v2;取验证损失最低的检查点(第 150 步,不到一轮)
54.7%
ft-full-v2-lastv0.2:同一次训练结束时(第 789 步)的权重
53.0%
请这样理解这些数字:训练集和两份测试集都是合成数据,没有用真实用户反馈验证过。同分布测试集衡量“学会这套语法了吗”,分布外测试集更接近“换一种说法还行不行”。两者之间的落差就是这个项目目前最主要的问题。详见 评测报告。

一次迭代:照着失败案例改数据

第一轮训练后,我阅读了模型在分布外开发集上的全部失败案例,归纳出四类问题,据此扩充了合成语法(新增 44 个问题类型),用完全相同的训练设置重新训练。

数据性质第一轮第二轮变化
分布外开发集第二轮就是照着它改的,不独立54.090.5+36.5
新增问题类型的留出集新增类型里训练未见的说法58.389.0+30.7
同分布测试集对两轮都独立66.873.7+6.9
分布外测试集手写,对两轮都独立58.153.0-5.1

数值为三标签全对率(%)。补进去的内容确实学会了,但改进没有迁移到独立的手写测试集上。结论是:继续手工扩充语法是在打地鼠,下一步应当换一种造数据的方式并拿到真实数据。这一轮的模型没有发布。

怎么做出来的

五个环节,每一步都有对应的脚本和实际运行记录。

① 定义任务 9 类别 · 3 情感 · 3 紧急度 标注规范写进代码 ② 造数据 72 类问题 386 种说法 按说法分组划分防泄漏 ③ 微调 MiniMind 官方权重为起点 全参 / LoRA / 从零对照 ④ 评测 规则基线与训练前对照 同分布 + 手写分布外 ⑤ 应用 FastAPI + 原生前端 真实推理 可本地运行

数据

训练 5146 条、验证 969 条、测试 977 条,外加 180 条手写分布外样本。按“核心表达”分组划分,并实测了训练集与测试集的相似度。

训练

在 Apple M5 上实际训练了四次:全参数微调、LoRA、随机初始化的对照组,以及第二轮换数据的全参数微调。对照组用来回答“预训练权重贡献了多少”。

评测

预先写下验收标准。规则基线、训练前的模型、各种训练方式,使用同一批样本、同一个解析器、同一套指标。

开源基础与我的工作

来自开源项目 MiniMind

  • 模型结构、分词器与对话模板
  • LoRA 的实现
  • 作为微调起点的官方权重
  • 以只读方式引用,未修改,固定在提交 f659b55

本项目新增

  • 任务定义、标注规范、合成数据语法与手写测试集
  • 数据清洗、去重、分组划分与泄漏检查流水线
  • 支持验证集选模和精确续训的训练脚本
  • 评测脚本、指标实现与规则基线
  • 网页应用、模型说明卡与全部文档

当前完成情况

已完成并实际运行

  • 已完成固定并记录上游 MiniMind 提交,下载官方权重并核对 SHA256
  • 已完成数据流水线:合成语法生成、清洗、去重、按核心表达分组划分、泄漏检查
  • 已完成本机实际训练四次:全参数微调、LoRA、随机初始化对照、第二轮换数据的全参数微调
  • 已完成训练可续训,并用测试验证“中断后续训”与“一次跑完”权重逐位相同
  • 已完成九个系统的评测,逐条预测、指标、失败案例全部保存;系统间差距做了聚类自助法检验
  • 已完成一轮完整的迭代:读失败案例 → 提出假设 → 改数据 → 重新训练 → 在独立测试集上检验
  • 已完成网页应用:真实模型推理、批量分诊、演示模式、移动端适配
  • 已完成模型说明卡、PRD、架构、数据、训练、评测、复盘等文档

尚未完成

  • 未完成让模型在标签准确率上超过关键词规则基线:目前没有做到
  • 未完成真实用户反馈数据:目前训练集和测试集全部是合成数据
  • 未完成合成数据的人工抽样复核:待填写的表格已生成,尚无人填写
  • 未完成用户访谈与可用性测试:提纲和记录模板已备好,尚未执行
  • 未完成NVIDIA GPU 上的训练、从零预训练、“从仅预训练权重微调”的对照:只有配置、命令与估算
  • 未完成按生成准确率选检查点、多随机种子:发现了问题,还没有改
  • 未完成线上部署与真实使用数据

文档