知识库标签功能指南

知识库标签功能是 PIGX AI 知识库系统的重要特性,用于对知识库和文档进行分类管理。通过标签功能,您可以:

  • 知识库级别标签: 为整个知识库定义分类标签,便于管理和检索
  • 文档级别标签: 为单个文档添加标签,支持手动标注和 AI 自动分类
  • 标签筛选: 在文档列表中通过标签快速筛选目标文档
  • 智能分类: 利用 AI 向量分类技术自动为文档打标签

功能开关

AI标签功能开关

标签功能需要在知识库配置中开启:

  1. 进入知识库编辑页面
  2. 切换到「高级配置」选项卡
  3. 找到「AI标签功能」开关
  4. 开启后,会出现第 4 个选项卡「标签配置」
功能开关限制

只有开启了 AI 标签功能的知识库,其文档才支持标签管理。

使用指南

1. 配置知识库标签

知识库标签是文档标签的"标签池",文档只能从知识库标签中选择。

操作步骤:

  1. 编辑知识库,切换到「标签配置」选项卡
  2. 点击「+ 添加标签」按钮
  3. 输入标签名称,按 Enter 确认
  4. 可添加多个标签,点击标签右侧的 ✕ 可删除
  5. 保存知识库配置

2. 为文档添加标签

文档标签管理

文档标签用于对单个文档进行分类,支持两种方式:

方式一: 手动添加标签

操作步骤:

  1. 进入知识库的文档列表页面
  2. 找到目标文档,点击「标签」按钮
  3. 在弹出的抽屉中,点击选择知识库标签
  4. 已选中的标签会高亮显示 (深色背景 + ✓ 图标)
  5. 点击「确认」保存

方式二: AI 自动分类

当文档上传并切片完成后,系统会自动调用 AI 分类器为文档打标签。

触发条件

AI 自动分类需要同时满足以下条件:

  1. 知识库开启了「AI标签功能」
  2. 知识库配置了标签列表
  3. 文档本身没有手动设置标签
  4. 文档切片成功

后台技术原理

2. AI 自动分类实现

核心服务方法 (pigx-knowledge/service/impl/AiDocumentServiceImpl.java):

@Async
@Override
public void tagsDocument(AiDocumentEntity documentEntity) {
    // 合并所有切片内容
    String documentContent = sliceEntityList.stream()
        .map(AiSliceEntity::getContent)
        .collect(Collectors.joining(StrUtil.LF));

    // 使用向量分类器进行分类
    TextClassifier<String> classify = classifierProvider
        .getClassify(documentEntity.getDatasetId().toString(),
                     CollUtil.toList(aiDatasetEntity.getTags()));

    // 向量分类
    List<String> classified = classify.classify(
        StrUtil.subPre(documentContent,
                      knowledgeProperties.getInMemorySearch().getMaxSegmentSizeInChars())
    );

    // 更新自动分类结果
    documentEntity.setTags(classified.toArray(String[]::new));
    baseMapper.updateById(documentEntity);
}

AI 分类原理:

EsLXux

关键技术点:

  • 使用 @Async 异步执行,不阻塞主流程
  • 基于向量语义相似度进行分类,而非关键词匹配
  • 内容长度限制由 knowledgeProperties.getInMemorySearch().getMaxSegmentSizeInChars() 配置
语义分类优势

AI 分类基于向量语义相似度,而非简单的关键词匹配,因此能够更准确地理解文档内容的语义。

向量分类器详解

系统使用 LangChain4j 的 TextClassifier 进行向量分类,核心代码如下:

// 使用向量分类器进行分类
TextClassifier<String> classify = classifierProvider
    .getClassify(documentEntity.getDatasetId().toString(),
                 CollUtil.toList(aiDatasetEntity.getTags()));

// 向量分类
List<String> classified = classify.classify(
    StrUtil.subPre(documentContent,
                  knowledgeProperties.getInMemorySearch().getMaxSegmentSizeInChars())
);

工作原理:

  1. 分类器获取 (classifierProvider.getClassify):

    • 根据知识库 ID 和标签列表创建分类器实例
    • 每个知识库维护独立的分类器,避免跨库干扰
    • 标签列表作为分类类别(labels),支持多标签分类
  2. 文档内容截取 (StrUtil.subPre):

    • 限制输入文本长度,避免超出模型 token 限制
    • 长度由配置项 knowledgeProperties.getInMemorySearch().getMaxSegmentSizeInChars() 控制
    • 通常取文档前 N 个字符,包含足够的语义信息
  3. 向量分类执行 (classify.classify):

    • 将文档内容转换为向量表示(embedding)
    • 计算文档向量与各标签向量的相似度
    • 返回相似度最高的一个或多个标签

LangChain4j 集成:

// 分类器提供者实现示例
@Component
public class ClassifierProvider {

    @Autowired
    private EmbeddingModel embeddingModel;  // 向量模型

    public TextClassifier<String> getClassify(String datasetId, List<String> labels) {
        // 创建基于嵌入的分类器
        return new EmbeddingModelTextClassifier<>(
            embeddingModel,           // 使用配置的向量模型
            labels,                   // 分类标签列表
            CosineSimilarity.between() // 余弦相似度计算
        );
    }
}

向量模型支持:

系统支持多种向量模型,包括:

  • OpenAI Embeddings: text-embedding-3-small, text-embedding-3-large
  • 本地模型: 通过 Ollama 部署的开源模型
  • 其他 API: 通义千问、智谱 AI 等国内模型

分类策略:

  • 单标签模式: 返回相似度最高的标签
  • 多标签模式: 返回相似度超过阈值的所有标签
  • 阈值配置: 可通过配置调整分类敏感度
向量分类优势

相比传统的关键词匹配,向量分类能够理解文档的语义内容,即使文档中不包含标签的字面文字,也能准确分类。例如,一篇讨论"机器学习算法"的文档可以被正确分类到"AI技术"标签下。

总结

知识库标签功能通过三层架构实现了灵活的文档分类管理:

  1. 知识库层: 定义标签池,控制标签功能开关
  2. 文档层: 支持手动标注和 AI 自动分类
  3. 查询层: 基于标签快速筛选文档

适用场景

  • 文档数量较多,需要分类管理
  • 需要快速筛选特定类型的文档
  • 希望利用 AI 自动化文档分类
  • 需要灵活的多维度分类体系

结合 LangChain4j 向量分类技术,系统能够自动为文档打标签,大大提高了知识库的管理效率。同时,灵活的手动标注功能也保证了分类的准确性和可控性。