鸿蒙中 知识库的生成
本文同步发表于我的,微信搜索程语新视界即可关注,每个工作日都有文章更新构建智能问答系统时,将原始的业务数据转化为可供检索的知识库,是决定系统效果的关键一环。HarmonyOS Next 提供的 Data Augmentation Kit 中的知识加工能力,提供了一套完整的数据处理 pipeline,能够将结构化或非结构化的数据,通过智能处理转化为倒排索引库和向量知识库,为后续的 RAG 检索增强生
本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新
构建智能问答系统时,将原始的业务数据转化为可供检索的知识库,是决定系统效果的关键一环。HarmonyOS Next 提供的 Data Augmentation Kit 中的知识加工能力,提供了一套完整的数据处理 pipeline,能够将结构化或非结构化的数据,通过智能处理转化为倒排索引库和向量知识库,为后续的 RAG 检索增强生成奠定基础。
一、知识加工
知识加工是指根据实际业务数据生成知识库的能力,主要包含两个方面:
-
知识库生成:通过配置 schema,将原始数据处理生成倒排表、向量库等知识加工产物
-
状态监控:通过接口查询知识加工的实时状态
| 价值点 | 说明 |
|---|---|
| 中文优化 | 知识加工和检索对中文处理进行了专门优化,中文问答效果优于英文 |
| 自动化处理 | 数据变更时自动触发加工,保持知识库实时更新 |
| 多格式支持 | 支持文本、办公文档、图片等多种文件格式 |
| 灵活配置 | 可自定义处理流程,适配不同业务场景 |
二、产物结构
知识加工会生成两种核心数据表:倒排表和向量表。
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
更多推荐



所有评论(0)