本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新

   构建智能问答系统时,将原始的业务数据转化为可供检索的知识库,是决定系统效果的关键一环。HarmonyOS Next 提供的 Data Augmentation Kit 中的知识加工能力,提供了一套完整的数据处理 pipeline,能够将结构化或非结构化的数据,通过智能处理转化为倒排索引库和向量知识库,为后续的 RAG 检索增强生成奠定基础。

一、知识加工

知识加工是指根据实际业务数据生成知识库的能力,主要包含两个方面:

  1. 知识库生成:通过配置 schema,将原始数据处理生成倒排表、向量库等知识加工产物

  2. 状态监控:通过接口查询知识加工的实时状态

价值点 说明
中文优化 知识加工和检索对中文处理进行了专门优化,中文问答效果优于英文
自动化处理 数据变更时自动触发加工,保持知识库实时更新
多格式支持 支持文本、办公文档、图片等多种文件格式
灵活配置 可自定义处理流程,适配不同业务场景

二、产物结构

知识加工会生成两种核心数据表:倒排表和向量表。

2.1 倒排表结构(Inverted Index Table)

倒排表主要用于关键词检索,其表名在原表名基础上增加 _inverted 后缀。

列名 类型 定义
reference_id UNINDEXED 关联 id,与业务表主键 id 对应
chunk_id UNINDEXED 标识每一个切分后的 Chunk,一个 Chunk 代表文本的一个切片
chunk_source UNINDEXED 每个 Chunk 在业务表中的字段归属
chunk_text TEXT 倒排索引字段,每个 Chunk 的文本内容

2.2 向量表结构(Vector Table)

向量表用于语义检索,表名在原表名基础上增加 _vector 后缀。

列名 类型 含义
id INTEGER 自增主键
reference_id INTEGER 关联 id,与业务表主键 id 对应
chunk_id TEXT 标识每一个切分后的 Chunk
chunk_source TEXT 每个 Chunk 在业务表中的字段归属
repr FLOATVECTOR(128) chunk_id 对应的文本的向量表征
Scalar TEXT Schema 中定义的所有标量字段,类型均为 TEXT

2.3 命名规则

产物 命名规则 示例
倒排库 与原数据库相同 testmail_store.db
倒排表 原表名 + _inverted email → email_inverted
向量库 原库名 + _vector testmail_store.db → testmail_store_vector.db
向量表 原表名 + _vector email → email_vector

三、触发知识加工的时机

知识加工在以下两种情况下会自动触发:

3.1 开库时触发

配置好 knowledge_schema.json 和开库参数后,每次开库都会启动一次知识加工任务

3.2 数据变更时触发

当已经成功开库且存在活跃的数据库连接时,数据源表发生数据变更(插入、更新、删除)时会自动触发增量加工

四、限制

4.1 基本限制

限制项 说明
同步限制 知识加工使用的表不支持同时进行端端同步、端云同步以及搜索
schema 升级 知识加工 schema 不支持升级,如需变更需重新创建
设备限制 知识加工数据向量化能力目前只支持 PC/2in1 上使用,Phone、Tablet 不支持

4.2 字段值长度限制

字段 长度限制 支持字符
version 1 ~ 2147483647 正整数
dbName 1 ~ 120 数字、大小写字母、下划线、点号(.)
tableName 1 ~ 120 数字、大小写字母、下划线(_)
columnName 1 ~ 255 -
referenceFields 1 ~ 255 仅支持一个整数字段
description(Scalar) 1 ~ 255 -
path(Json) 1 ~ 255 合法的 Json 路径表达式

4.3 字段类型限制

类型 说明 要求
Text 纯文本知识加工字段 非文本类型配置为 Text 不生效
Scalar 标量字段,不进行加工 必须包含 description 字段
Json Json 格式的知识加工字段 必须包含 parser,最多定义 5 个文件路径

五、其他说明

5.1 pipelineHandlers:处理流程控制

pipelineHandlers 用于定义知识加工时各处理模块的执行顺序。配置为映射关系,每个键为当前 Handler,值为其后继 Handler 列表。

"pipelineHandlers": {
  "FileParserHandler": ["SplitTextHandler"],
  "SplitTextHandler": ["TextEmbeddingHandler"],
  "TextEmbeddingHandler": ["ImageEmbeddingHandler"],
  "ImageEmbeddingHandler": []
}
5.1.1 支持的 Handler 类型
Handler 名称 功能 依赖 推荐位置
FileParserHandler 提取 Json 字段中指向的本地文件文本内容 无依赖 SplitTextHandler 之前
SplitTextHandler 对文本进行两级切分(chunk/segment) TextEmbeddingHandler 之前
TextEmbeddingHandler 对 segment 进行文本向量表征 依赖 SplitTextHandler ImageEmbeddingHandler 之前
ImageEmbeddingHandler 对图片进行向量表征 无依赖 流程末尾
5.1.2 Handler 功能

FileParserHandler

  • 支持格式:doc、docx、ppt、pptx、xls、xlsx、html、txt、pdf、png、jpg、jpeg

  • 文本类文件:提取正文内容

  • 图片文件:通过 OCR 提取可识别文本

  • 不配置影响:Json 字段内文件不会被解析,倒排和向量中均无这些内容

SplitTextHandler

  • 两级切分:

    • 第一级 chunk:用于倒排索引

    • 第二级 segment:用于向量表征

  • 不配置影响:倒排表和向量表都无文本内容,检索无法返回文本相关内容

TextEmbeddingHandler

  • 对 SplitTextHandler 产生的 segment 进行文本向量表征

  • 不配置影响:文本表征结果不会进入向量表,影响语义搜索

ImageEmbeddingHandler

  • 根据 Json 字段解析后的图像路径加载图片,对图像特征进行向量表征

  • 独立处理:不依赖 SplitTextHandler,不参与文本倒排表

  • 不配置影响:图像表征结果不会进入向量表,影响图片相关搜索

5.1.3 Handler 配置规则
规则 说明 后果
推荐流程 FileParserHandler → SplitTextHandler → TextEmbeddingHandler → ImageEmbeddingHandler 最佳效果
循环依赖 Handler 之间形成闭环 加载 schema 时报错
空下游 下游为空数组 加工流程在此结束
顺序错误 跳过某些处理器或顺序不通 文件未处理、流程中断或初始化失败
简化配置 如仅需倒排索引,可只配置 SplitTextHandler 按需处理

5.2 knowledgeProcess:加工参数配置

knowledgeProcess 为可选配置,用于设置知识加工的具体参数。

5.2.1 embeddingModelCfg:向量表征模型
"embeddingModelCfg": {
  "modelVersion": "default"  // 向量表征模型版本
}
参数 说明 限制
modelVersion 使用的向量表征模型版本 最大长度 100,需与推理版本一致,默认 "default"
5.2.2 chunkSplitter:文本切分设置
"chunkSplitter": {
  "chunkSize": 3072,        // 每个Chunk的最大长度
  "segmentSize": 300,        // Chunk内部分段的最大长度
  "overlapRatio": 0.1        // 相邻Chunk之间的重叠比例
}
参数 类型 取值范围 默认值 说明
chunkSize 整数 [100, 5000] 3072 控制一级切分粒度
segmentSize 整数 [128, 512] 300 控制向量表征粒度
overlapRatio 浮点数 (0.0, 0.3] 0.1 保持上下文连续性
5.2.3 perRecordLimit:单条记录处理限制
"perRecordLimit": {
  "parseFileMaxCnt": 10,        // 最多解析的文件数
  "textEmbeddingMaxCnt": 50,     // 最多向量表征的文本段数
  "imageEmbeddingMaxCnt": 10     // 最多处理的图片数量
}
参数 取值范围 默认值 说明
parseFileMaxCnt [0, 200] 10 控制文件解析规模
textEmbeddingMaxCnt [0, 200] 50 控制文本表征规模
imageEmbeddingMaxCnt [0, 200] 10 控制图片处理规模

注意事项

  • 设定过小:可能导致信息加工不全

  • 设定过大:可能导致系统资源消耗过大

六、接口说明

接口名 描述
getKnowledgeProcessor 获取知识加工对象,用于获取知识加工状态等操作
getStatus 获取当前知识加工状态
getRdbStore 创建或打开关系型数据库,配置开库参数后可触发知识加工

调用流程

getKnowledgeProcessor → 获取加工对象
        ↓
   getStatus → 查询加工状态
        ↓
 数据变更/开库 → 自动触发加工

七、开发步骤

7.1 步骤1:配置 knowledge_schema.json

文件路径要求

src/main/resources/rawfile/arkdata/knowledge/knowledge_schema.json

配置示例

{
  "knowledgeSource": [{
    "version": 1,
    "dbName": "testmail_store.db",
    "tables": [{
      "tableName": "email",
      "referenceFields": ["id"],
      "knowledgeFields": [
        {
          "columnName": "subject",
          "type": ["Text"]
        },
        {
          "columnName": "content",
          "type": ["Text"]
        },
        {
          "columnName": "image_text",
          "type": ["Text"]
        },
        {
          "columnName": "attachment_names",
          "type": ["Text"]
        },
        {
          "columnName": "inline_files",
          "type": ["Json"],
          "parser": [
            {
              "type": "File",
              "path": "$[*].uri"
            }
          ]
        },
        {
          "columnName": "sender",
          "type": ["Scalar"],
          "description": "sender"
        },
        {
          "columnName": "receivers",
          "type": ["Scalar"],
          "description": "receivers"
        },
        {
          "columnName": "received_date",
          "type": ["Scalar"],
          "description": "received_date"
        }
      ],
      "pipelineHandlers": {
        "FileParserHandler": ["SplitTextHandler"],
        "SplitTextHandler": ["TextEmbeddingHandler"],
        "TextEmbeddingHandler": ["ImageEmbeddingHandler"],
        "ImageEmbeddingHandler": []
      }
    }],
    "knowledgeProcess": {
      "embeddingModelCfg": {
        "modelVersion": "default"
      },
      "chunkSplitter": {
        "chunkSize": 3072,
        "segmentSize": 300,
        "overlapRatio": 0.1
      },
      "perRecordLimit": {
        "parseFileMaxCnt": 10,
        "textEmbeddingMaxCnt": 50,
        "imageEmbeddingMaxCnt": 10
      }
    }
  }]
}

7.2 步骤2:配置开库参数并预置数据

import { relationalStore } from '@kit.ArkData';

// 开库参数配置
const storeConfig: relationalStore.StoreConfig = {
  name: 'testmail_store.db',           // 必须与 schema 中 dbName 一致
  securityLevel: relationalStore.SecurityLevel.S3,
  enableSemanticIndex: true,            // 必须设为 true 才会触发知识加工
  tokenizer: relationalStore.Tokenizer.CUSTOM_TOKENIZER
};

// 建表语句(表名、列名必须与 schema 一致)
const createTableSql = `CREATE TABLE IF NOT EXISTS email(
  id integer primary key, 
  subject text, 
  content text, 
  image_text text, 
  attachment_names text, 
  inline_files text, 
  sender text, 
  receivers text, 
  received_date text
);`;

// 插入数据示例
const insertSql = `insert or replace into email VALUES(
  0, 
  'Subject of an email', 
  'Content of an email',
  'Convert image to text through OCR', 
  'attachment_name_1.txt',
  '[{"uri":"/data/storage/el2/base/haps/entry/files/capture_1.png"},{"uri":"/data/storage/el2/base/haps/entry/files/capture_2.jpeg"}]',
  'zhangsan(zhangsan@xxx.com)', 
  'lisi(lisi@xxx.com), wangwu(wangwu@xxx.com)', 
  'Convert time to timestamp'
);`;

7.3 步骤3:查询知识加工状态

import { relationalStore } from '@kit.ArkData';
import { knowledgeProcessor } from '@kit.DataAugmentationKit';
import { UIAbility, common } from '@kit.AbilityKit';

// 开库参数配置
const storeConfig: relationalStore.StoreConfig = {
  name: 'testmail_store.db',
  securityLevel: relationalStore.SecurityLevel.S3,
  enableSemanticIndex: true,
  tokenizer: relationalStore.Tokenizer.CUSTOM_TOKENIZER
};

// 知识加工配置
let knowledgeSourceConfig: knowledgeProcessor.KnowledgeSourceConfig = {
  rdbSource: storeConfig,
};

let knowledgeProcessorConfig: knowledgeProcessor.KnowledgeProcessorConfig = {
  sourceConfig: knowledgeSourceConfig,
};

// 获取知识加工状态
async function getKnowledgeProcessingStatus() {
  const context = AppStorage.get<common.UIAbilityContext>("Context") as common.UIAbilityContext;
  
  try {
    // 1. 获取知识加工对象
    const processor = await knowledgeProcessor.getKnowledgeProcessor(
      context, 
      knowledgeProcessorConfig
    );
    
    // 2. 获取知识加工状态
    const status: knowledgeProcessor.ProcessorStatus = await processor.getStatus();
    
    console.info(`知识加工状态: ${JSON.stringify(status)}`);
    return status;
  } catch (err) {
    console.error(`获取知识加工状态失败: ${err.message}, code: ${err.code}`);
    return undefined;
  }
}

支持的文件类型

类别 格式 处理方式
文本/网页 txt, html 直接提取文本
办公文档 doc, docx, ppt, pptx, xls, xlsx, pdf 提取纯文本内容(复杂内容建议应用侧预处理)
图片 jpeg, jpg, png OCR 提取可识别文本 + 图片向量表征

鸿蒙中 RAG知识问答能力https://blog.csdn.net/wangsen927/article/details/158103008?spm=1011.2415.3001.5331

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐