news 2026/10/16 23:42:16

AI File Sorter 分类引擎深度解析:Prompt 构建、Taxonomy 归一化与一致性机制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AI File Sorter 分类引擎深度解析:Prompt 构建、Taxonomy 归一化与一致性机制
  • AI 应用
  • 大模型
  • 本地部署
  • 桌面应用

【免费下载链接】ai-file-sorter

Cross-platform desktop application for content-aware file organization and renaming. Supports local and remote LLMs, preview-based workflows, and fully user-controlled changes.

项目地址:https://gitcode.com/gh_mirrors/ai/ai-file-sorter
点击查看免费下载

AI File Sorter 是一款跨平台的AI 文件分类与整理工具,它通过本地或远程 LLM 理解文件内容,自动给出「主分类 : 子分类」建议,并在你确认后才真正移动或重命名文件。本文深入解析其分类引擎的三大核心机制:Prompt 构建、Taxonomy 归一化与一致性机制,帮助你理解分类结果是如何一步步产生、被校准并保持稳定的。

一、分类引擎的整体流程

在深入细节之前,先看清一条完整的分类流水线,所有机制都挂在这条链路上:

  1. 扫描:FileScanner遍历目标目录,产出文件条目(见 app/lib/FileScanner.cpp);
  2. 分类:CategorizationService 为每个文件组装 Prompt,调用 LLM 并解析「主分类 : 子分类」;
  3. 归一化:DatabaseTaxonomyNormalizer 把模型输出的五花八门的标签折叠成统一的分类体系(Taxonomy);
  4. 一致性处理:ConsistencyPassService对整批结果做二次校准;
  5. 审阅与应用:你在审阅界面逐条确认,应用才执行移动/重命名,全程支持撤销与 Dry Run 预览。

官方文档对两种分类模式有专门说明,值得先读一遍:docs/categorization-behavior.md。

二、Prompt 构建:每个文件的"提问方式"都不一样

分类质量的上限首先由 Prompt 决定。LocalLLMPromptBuilder(app/lib/LocalLLMPromptBuilder.cpp)按文件类型选择不同的系统提示词:

  • 普通文件:依据文件名、扩展名和目录上下文判断,遇到安装包会先识别它安装的是什么软件;
  • 文档文件:先抽取"文档摘要"(Document summary)作为主要证据,再结合路径线索;
  • 图片文件:附带视觉模型生成的"图片描述",并明确区分「截图类」应按屏幕内容而非按图片本身分类;
  • 目录:按名称与路径主题给出宽泛分类。

更关键的是两种分类风格会切换提示词策略(在分类设置对话框中可切换):

  • More consistent(更一致):图片一律以Images为主分类,追求目录树稳定;
  • More refined(更精细):允许按语义给出如Wildlife / Lions这样的主题分类。

Prompt 的"上下文区块"由build_combined_context统一拼装(CategorizationService.cpp),按顺序包含:

区块作用
一致性提示块注入本批最近 5 条同类文件的分类结果作为参照
白名单候选块限制可选主分类;白名单超过 30 项时,自动检索出最相关的 8 个候选,避免撑爆上下文
学习候选块从用户历史确认的决策中检索相似候选,让引擎"越用越懂你"
分类语言指令非英文界面时,指示模型输出对应语言风格的分类
主分类候选按文件族(family)收窄可选的主分类集合

针对小模型的上下文限制,还有两级保护:prompt_token_budget预留生成空间,shrink_user_prompt_for_context在重试时逐级压缩摘要段(1200→800→500→300 字符)再压缩整段 Prompt(1800→700 字符),确保小上下文模型也能跑通。

三、Taxonomy 归一化:让"Docs"和"Documents"归为一类

LLM 的输出天然不稳定:同一个文件这次叫Documents,下次可能叫Docs,再下次可能是Doc Files。如果不做归一化,分类结果会散落成一堆近义文件夹。DatabaseTaxonomyNormalizer(app/include/DatabaseTaxonomyNormalizer.hpp)负责解决这个问题,它分四层处理:

1️⃣ 基础归一化:normalize_label把标签转为小写字母数字加规范空格的形式;strip_trailing_stopwords去掉结尾的file/files/doc/photo等无信息量词缀(taxi files→taxi,但单 token 不动)。

2️⃣ 同义词折叠:内置映射表把常见变体收敛到规范名,例如:

  • doc、docs、text、papers→Documents
  • application、apps、programs、patches→Software
  • photo、screenshot、wallpaper→Images
  • 旧版Music→ 规范名Audio;Installer Builders→Installer Tools

3️⃣ 语义家族(Semantic Family):对Manuals、Guides、Licenses、Presentations等家族,若子分类只是General、Misc或与主分类重复的泛化词,会自动折叠为General,避免Documents / Documents这类无意义层级。

4️⃣ 模糊匹配:归一化后仍对不上库中已有条目时,resolve_category会计算编辑距离相似度(Levenshtein,DatabaseManager.cpp),当主分类与子分类的综合得分 ≥ 0.85 时判定为同一分类,并把原始写法记为别名,后续直接精确命中,不再重复模糊计算。

四、一致性机制:让整批结果"前后统一"

归一化解决"名字统一",一致性机制解决"判断统一"——同一批里 50 个 PDF 不应被分成 50 个不同的子类别。引擎用三层手段实现:

1. 会话内一致性提示(Consistency Hints)

collect_consistency_hints(CategorizationService.cpp)为每个文件生成签名(如FILE:.pdf),从本批会话历史取最近 5 条同签名分类结果;不足时再从数据库中取该扩展名近期分类补齐。这些提示以这样的文本注入 Prompt:

Recent assignments for similar items: - Documents : Tax forms - Documents : Invoices Prefer one of the above when it fits; otherwise, choose the closest consistent alternative.

2. 分类缓存与用户学习库(分离存储)

  • 分类缓存:存历史分类结果与重命名建议,重复扫描秒出结果,相当于"本地记忆",可随时清理,不影响模型;
  • 用户学习库:UserLearningStore 单独存储在配置目录,只收录你在审阅中明确批准的决策,并按词法+向量相似度检索候选。两者刻意分开,清缓存不会丢掉你教给引擎的习惯。

3. 一致性通道(Consistency Pass)

整批分类完成后,若开启该选项,ConsistencyPassService(app/lib/ConsistencyPassService.cpp)会进行第二次 LLM 校准:

  • 每10 个文件为一块,把"已知分类体系(Taxonomy JSON)+ 当前分配"发给模型;
  • 明确要求:优先复用已有分类条目、合并近义标签(如DocsvsDocuments)、不合并不同概念、保持原顺序逐行输出完整路径 => 主分类 : 子分类,以END收尾;
  • 解析器逐行校验,未知路径 ID 或空分类会自动回退到原值并记录警告;
  • 修正结果仍要经过resolve_category归一化后写回数据库,保证不产生新的"野生分类"。

五、效果对比:乱目录 → 结构化文件夹

下图是同一文件夹整理前后的对比,可以看到分类引擎 + 归一化 + 一致性校准共同作用的结果:顶层目录稳定、同类文件聚合、无近义重复分类。

应用前你始终可以先看 Dry Run 预览(DryRunPreviewDialog),所有变更都是用户完全可控的。

六、核心模块速查

机制关键文件
Prompt 构建app/lib/LocalLLMPromptBuilder.cpp
分类主流程与提示块拼装app/lib/CategorizationService.cpp
Taxonomy 归一化app/lib/DatabaseTaxonomyNormalizer.cpp
模糊匹配与别名app/lib/DatabaseManager.cpp
一致性通道app/lib/ConsistencyPassService.cpp
用户学习库app/include/UserLearningStore.hpp
行为说明文档docs/categorization-behavior.md

一句话总结:AI File Sorter 的分类引擎 = 按文件类型定制的 Prompt 拼装 + 多层 Taxonomy 归一化兜底 + 会话提示/缓存/学习库/批量校准四层一致性保障——这正是它能对成百上千个文件给出既准确又稳定的分类结果的原因。

  • AI 应用
  • 大模型
  • 本地部署
  • 桌面应用

【免费下载链接】ai-file-sorter

Cross-platform desktop application for content-aware file organization and renaming. Supports local and remote LLMs, preview-based workflows, and fully user-controlled changes.

项目地址:https://gitcode.com/gh_mirrors/ai/ai-file-sorter
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/13 8:37:49

A*寻路算法核心实现与工程实践:从网格建模到八方向扩展

写这篇东西的起因,是最近在项目里要做一个网格地图的寻路模块。同事甩过来一堆参考代码,要么只给了伪代码,要么讲了一堆理论却没法直接跑。我干脆自己整理了一份传统A*算法的核心实现,从地图建模开始写,一直写到能跑通…

作者头像 李华
网站建设 2026/10/16 13:04:13

Realtek音频管理器消失的四层原因与修复指南

1. 这不是软件丢失,而是系统音频生态的“断链”问题“电脑没有Realtek高清晰音频管理器”,这句话在各大技术论坛、问答社区和售后工单里高频出现,但绝大多数人把它当成一个简单的“图标不见了”或“软件没装好”的小故障。我接触过上百个类似…

作者头像 李华
网站建设 2026/10/15 13:50:23

SOAP/OData/Event错误日志业务目录:角色分配与权限治理实战

我先把这个标题拆开聊两句。很多人一看到“SOAP / OData / Event 错误日志业务目录”这种说法,第一反应是“这不就是给接口配几个错误码嘛”,结果真正上手才发现,事情远没有那么简单——数据接口报错不是只有一个日志文件,而是散落…

作者头像 李华
网站建设 2026/10/16 23:42:15

本地路由层实战:让Claude Code与Codex无缝接入国内大模型

1. 为什么我要折腾这个路由层国内做 AI 应用开发的人,最近一年应该都有同一个感受:海外那几套 agent harness 的工程体验确实做得好,任务拆解、工具调用、上下文管理、代码回退这些机制打磨得很成熟,但真要把它们接到国内模型上&a…

作者头像 李华
网站建设 2026/10/16 13:54:35

72GB权重四模态跑通:Jev-Omni本地部署的坑我都替你踩完了

72GB权重四模态跑通:Jev-Omni本地部署的坑我都替你踩完了 【免费下载链接】Jev-Omni 项目地址: https://ai.gitcode.com/hf_mirrors/akhilaaa3/Jev-Omni 一个 12B 参数的多模态模型,输入文本、图像、音频甚至视频,不吐一个字&#xf…

作者头像 李华
网站建设 2026/10/16 11:51:41

微信小程序疫苗预约接种系统全栈源码实战拆解

简介:基于微信小程序的疫苗预约接种系统完整源码包,面向小程序开发者、Java后端学习者及高校毕设/课设人群。系统在既有疫苗预约项目基础上重构并二次开发,业务覆盖预约、支付、签到、预检、接种、留观全流程。管理员端支持查看数据分析图&am…

作者头像 李华