设计一个不会把你逼疯的知识分类体系

知识库上线三个月,使用率数据惨不忍睹。老李把团队拉到会议室,投影仪上是一根趴在地上的曲线。

“全公司五百号人,每天主动用知识库的不到二十个。我们花了那么多钱搞RAG、建知识库,结果没人用?”老李的保温杯在桌上敲得咔咔响。

小王举手:“老李,你有没有试过自己搜点东西?”

“我?我当然用过!”

“那你上次找《新员工入职流程》,花了几分钟?”

老李张了张嘴,没说出话。

“我替你算过,”小王翻开一个本子,“你要点开‘公司制度’,再点‘人力资源’,再点‘入职管理’,再点‘社招入职’,再点‘入职流程’,最后在第五层看到了一个叫‘新员工入职指引v3.2_final.pdf’的文件。你说,一个刚入职的人能找到这儿吗?”

老李的脸僵住了。

“我花了一个周末设计的这个分类体系,”他喃喃道,“十五个大类,每个大类下面十个子类,全面覆盖公司所有知识领域。错了吗?”

“老李你想啊,你找袜子的时候,是打开衣柜一层一层翻,还是直接拉开最顺手的抽屉?”


超市货架的启示

小王站起来走到白板前,画了两个方框。

“你周末去超市,想买一瓶酱油。你走进超市,抬头看到悬挂的指示牌——‘调味品’。顺着走过去,酱油就在货架第三层,旁边是醋和老抽。整个过程不超过三十秒。”

他在另一边又画了一个复杂的树状图:“现在想象一家超市的货架是按‘化学分子式’分类的。酱油在‘含盐发酵调味品’区,醋在‘酸性调味品’区,老抽在‘焦糖着色调味品’区。你买三样东西,要跑三个区域。你下次还会来这家超市吗?”

老李愣了几秒:“你的意思是,我的十五层分类就像按分子式摆货的超市?”

“而且你的分类名还用了大量内部术语。‘人力资源管理’、‘组织架构优化’、‘业务流程再造’——这些词是你和管理层熟悉的,但普通员工脑子里想的是‘请假怎么请’、‘报销怎么报’、‘年会几号开’。”

小王得出结论:“好的分类体系,不是把知识本身分得最细,而是让使用者的心智负担最小。你的目录树是按‘知识来源’组织的——这份文档来自HR部门,就放HR下面。但用户是按‘任务场景’找的——我要请假,跟请假相关的所有东西应该在一起,管它来源是HR还是行政。”

图:按知识来源组织的分类(左)vs 按任务场景组织的分类(右)


三层就够了吗?

“那照你这么说,全公司知识就分几个大类,不精细了?”老李抱着胳膊。

“分三层就够了。”小王在白板上写了三行。

“顶层是领域,大概五到七个,比如‘产品’、‘技术’、‘人事’、‘行政’、‘销售’。这些是任何人都能一眼看懂的,不需要培训。”

“中间层是主题,一个领域下面不超过七个主题。比如‘人事’下面是‘入职’、‘离职’、‘薪酬’、‘假勤’、‘绩效’。这些是用户脑子里的任务单元。”

“底层是概念,就是具体的文档、FAQ条目、案例。到这一层,已经不需要子目录了——用标签和搜索来解决细节区分。”

老李眯起眼:“才三层?那我那些精细的子类怎么办?”

“用标签。目录负责主干,标签负责枝叶。”小王打开笔记本,敲了一段对比代码:

python
# 老李的方案:靠目录层级精确分类
old_system = {
    "公司制度": {
        "人力资源": {
            "入职管理": {
                "社招入职": ["入职流程.pdf", "背调说明.pdf"],
                "校招入职": ["校招培训计划.pdf"],
            }
        }
    }
}
# 用户找"入职背调":点5层,看到两个文件,不知道选哪个


# 小王的方案:扁平目录 + 多维度标签
new_system = [
    {"doc": "入职流程.pdf", "tags": ["入职", "流程", "通用"]},
    {"doc": "背调说明.pdf", "tags": ["入职", "背调", "社招"]},
    {"doc": "校招培训计划.pdf", "tags": ["入职", "培训", "校招"]},
]

def search_by_tag(system, tags):
    """用户按任务场景搜索,不看目录"""
    return [doc["doc"] for doc in system if set(tags) & set(doc["tags"])]

# 用户搜"入职 背调":直接命中,不需要知道它在哪层

“看到区别没?目录是唯一的——一个文档只能属于一个目录。标签是多元的——同一个文档可以同时打上‘入职’、‘背调’、‘社招’三个标签。用户无论从哪个角度来找,都能找到。”


老李踩过的四个坑

老李沉默了一会儿,把自己那个Excel分类表打开,盯着看了很久。

“你说实话,我这个分类体系有哪些问题?”

小王咳嗽了一声:“你确定要听?”

“说。”

“第一,过度嵌套。十五层,比俄罗斯套娃还深。超过三层,用户就开始迷路。超过五层,用户宁愿搜百度也不搜你的系统。”

“第二,模糊命名。你的分类名是‘组织架构优化’,但里面放的其实是‘各部门总监任命通知’。命名和内容对不上,用户点进去才发现被骗了。”

“第三,不一致层级。有的子类是‘按部门分’,有的子类是‘按项目分’,有的子类是‘按时间分’。混合分类标准,就像图书馆的书架同时按颜色和按作者排列——你永远猜不到下一本书在哪。”

“第四,冷门占坑。‘纪检监察’这个分类,过去五年就三份文档,但它占了目录树的整整一个一级节点。而‘产品文档’下面塞了两百份文件,就一个节点。高频低频,一视同仁——这是对用户的不尊重。”

老李的脸一阵红一阵白,最后叹了口气:“那怎么改?”


让AI帮你自动分类

“不用你手工重新分类,”小王调出一段代码,“让AI给文档打标签。”

python
# 用LLM自动给文档打标签
def auto_tag_document(doc_text, tag_pool):
    """从预定义的标签池中选择最匹配的标签"""
    prompt = f"""
    文档内容:{doc_text[:2000]}
    
    标签池:{tag_pool}
    
    请从标签池中选择最贴合文档内容的3-5个标签。
    规则:
    1. 只看内容,不看标题
    2. 标签必须从标签池中选择,不能自己发明
    3. 返回JSON格式:{{"tags": ["标签1", "标签2"]}}
    """
    response = llm.generate(prompt)
    return parse_json(response)["tags"]

# 标签池保持精简:不超过30个标签
tag_pool = ["入职", "离职", "薪酬", "假勤", "报销", "技术文档", 
            "产品手册", "API", "部署", "年会", "安全", "合规",
            "培训", "绩效", "招聘", "数据库", "前端", "后端"]

# 批量处理新文档,自动打标签
new_doc = "2025年年会于11月8日在杭州举办,老李喜中三等奖..."
tags = auto_tag_document(new_doc, tag_pool)
print(tags)  # 输出: ["年会", "行政"]

“标签池控制在三十个以内。超过三十个,用户又该选择困难了。如果文档自动打标签准确率在90%以上,基本不需要人工干预。剩下10%靠用户反馈纠正——谁用谁纠错,纠错还能优化模型。”

老李看着代码,眼神若有所思:“那旧的分类结构怎么办?全扔掉?”

“不用扔,映射过来。把你原来十五层目录,映射成三层主题加标签。自动化脚本跑一遍,旧文档全量打标签。”小王在白板上画了一个映射表:

“原来的‘公司制度/人力资源/入职管理/社招入职/入职流程.pdf’,映射成——主题:入职,标签:社招,流程,新员工。原来那个长长的路径,变成两个维度:一个主题加三个标签。用户搜‘入职流程’,主题匹配‘入职’,标签匹配‘流程’,直接命中。”


老李合上Excel,拧开保温杯喝了一口。枸杞早就凉了,但他没在意。

“行。下周一把新的三层体系推上去,旧文档做一次全量标签映射。标签池你来定,别超过二十五个。”

他站起来,走到白板前,把自己画的十五层目录树擦掉,只留了三行。

“那什么——”他转过身,语气不情不愿地,“你刚说的那个自动打标签,准确率90%怎么验证?是不是还得做个评测集?给我讲讲你怎么算的。”

小王笑了:“老李,你这已经是第二次主动问评测的事了。看来RAGAS那套方法论你是真吃透了。”

“少废话,”老李板着脸,但嘴角翘了起来,“下班前给我方案。下不为例啊。”

他走出会议室,保温杯里的枸杞晃晃悠悠,像是在点头。白板上只剩三层分类框架,干干净净,像一间刚整理完的衣柜——拉开抽屉,袜子就在手边。

知识版本管理:'latest'不是一个策略
实体抽取:教 AI 像人类一样"读懂"文本