Skip to content

informat.knowledgebase 知识库文档操作

概述

使用 informat.knowledgebase 可以在当前应用的知识库模块中创建脚本文档、覆盖写入 Markdown 正文,并查询文档的异步摄入状态。

典型调用流程如下:

  1. 使用 createDocument 创建一个空文档并取得文档 ID;
  2. 使用 writeDocument 写入完整正文并取得摄入任务 ID;
  3. 在后续脚本或业务流程中使用 getIngestTaskStatus 查询处理结果。

使用限制

  • moduleId 必须是当前应用中已发布的知识库模块 ID,不支持使用模块标识符(module key)。
  • 脚本只能写入通过 informat.knowledgebase.createDocument 创建的文档,不能覆盖用户上传的 PDF、Word 或其他文档。
  • writeDocument 是全量覆盖操作,不是追加写入。
  • 文档正文不能为空,UTF-8 编码后的大小不能超过 15MB。

createDocument

在目标知识库模块中创建一个空的脚本文档,并返回文档 ID。文档创建后状态为 PENDING,调用 writeDocument 写入正文后才会开始摄入。

javascript
informat.knowledgebase.createDocument(moduleId, document);
参数类型描述
moduleIdString当前应用中知识库模块的真实 ID
documentObject文档配置

document 支持以下属性:

属性类型必填描述
nameString文档名称
categoryString文档分类
descriptionString文档描述
documentTypeString文档类型,默认为 MARKDOWN
chunkConfigObject自定义分块配置;不传时使用文档类型的推荐配置

documentType 支持以下值:

适用内容
DEFAULT通用文本
CODE代码文档
APIAPI 文档
MARKDOWNMarkdown 文档
FAQ常见问题
ARTICLE文章
TABLE表格型文本
EXCELExcel 转换后的文本
CUSTOM使用自定义分隔符的文本

chunkConfig 支持以下属性:

属性类型默认值描述
parentMaxLenInteger1500父分块最大字符数
childMaxLenInteger400子分块最大字符数
childMinLenInteger80子分块最小字符数
childOverlapLenInteger50相邻子分块重叠字符数
enableOverlapBooleantrue是否启用子分块重叠
parentSeparatorString\\n\\n父块分隔符,仅 CUSTOM 类型使用
childSeparatorString\\n子块分隔符,仅 CUSTOM 类型使用

返回值

文档 ID,类型为 String

示例

javascript
const documentId = informat.knowledgebase.createDocument('knowledgeModuleId', {
    name: '产品接口说明',
    category: '技术文档',
    description: '由应用脚本自动维护',
    documentType: 'MARKDOWN',
    chunkConfig: {
        parentMaxLen: 1500,
        childMaxLen: 400,
        childMinLen: 80,
        childOverlapLen: 50,
        enableOverlap: true,
    },
});

调用账号需要拥有目标知识库模块的新增权限。

writeDocument

全量覆盖目标脚本文档的正文,并提交异步摄入任务。

javascript
informat.knowledgebase.writeDocument(moduleId, documentId, content);
参数类型描述
moduleIdString当前应用中知识库模块的真实 ID
documentIdStringcreateDocument 返回的文档 ID
contentString完整的 Markdown 正文

返回值

返回值类型为 Object,包含以下属性:

属性类型描述
docIdString文档 ID
taskIdString异步摄入任务 ID

示例

javascript
const result = informat.knowledgebase.writeDocument(
    'knowledgeModuleId',
    documentId,
    `# 产品接口说明

## 创建订单

调用创建订单接口前,需要先取得访问令牌。`,
);

informat.console.log(`文档ID:${result.docId}`);
informat.console.log(`任务ID:${result.taskId}`);

调用账号需要拥有目标知识库模块的更新权限。同一文档处于 PROCESSING 状态时不能再次覆盖,等待当前任务完成或失败后再重新写入。

数据一致性

写入操作会协调源文件替换、旧分块清理和摄入任务创建。数据库事务失败时,新文件和 Redis 任务会执行补偿清理;事务提交后,旧源文件才会删除。

getIngestTaskStatus

查询异步摄入任务状态。

javascript
informat.knowledgebase.getIngestTaskStatus(moduleId, taskId);
参数类型描述
moduleIdString任务所属知识库模块的真实 ID
taskIdStringwriteDocument 返回的任务 ID

返回值

返回值类型为 Object,包含以下属性:

属性类型描述
taskIdString任务 ID
docIdString文档 ID
statusString任务状态
totalChunksInteger总子分块数
processedChunksInteger已处理子分块数
progressNumber处理进度百分比
errorMessageString失败原因;任务未失败时为空
startTimeStringISO-8601 格式的开始时间
endTimeStringISO-8601 格式的结束时间;任务未结束时为空
durationLong执行时长,单位为毫秒

status 可能为以下值:

状态描述
PENDING任务已创建,等待执行
PROCESSING正在分块并生成向量数据
COMPLETED摄入完成,文档可以用于检索
FAILED摄入失败,可通过 errorMessage 查看原因

示例

javascript
const task = informat.knowledgebase.getIngestTaskStatus(
    'knowledgeModuleId',
    taskId,
);

if (task.status === 'COMPLETED') {
    informat.console.log(`摄入完成,共生成 ${task.totalChunks} 个子分块`);
} else if (task.status === 'FAILED') {
    throw new Error(task.errorMessage || '知识库文档摄入失败');
} else {
    informat.console.log(`当前进度:${task.progress}%`);
}

调用账号需要拥有目标知识库模块的查询权限。任务记录在 Redis 中保存 7 天,过期后不能再通过任务 ID 查询。

不要在脚本中忙等待

摄入任务在后台异步执行。不要使用循环持续查询任务状态,否则会长时间占用脚本执行线程。可以在后续自动化、定时任务或其他业务入口中查询处理结果。

服务重启与任务恢复

摄入任务的状态、租户上下文和待处理正文都保存在 Redis 中,不依赖服务进程内存。服务重启后,系统会定期扫描 PENDINGPROCESSING 任务并恢复执行。

  • 恢复任务使用任务级分布式锁,避免多个服务节点重复处理同一任务;
  • 已经完整写入数据库的父分块会作为续传断点,不会从头重复写入;
  • Redis 不可用时,任务创建会直接失败并回滚,不会降级为仅保存在内存中的任务;
  • 状态为 FAILED 的任务不会自动重试。排除错误后,可以再次调用 writeDocument 创建新的摄入任务。

服务刚恢复时,任务可能短暂保持 PENDINGPROCESSING,通常会在下一次恢复扫描后继续执行。

完整示例

javascript
export function publishGuide(moduleId, markdown) {
    const documentId = informat.knowledgebase.createDocument(moduleId, {
        name: '应用使用指南',
        category: '产品文档',
        description: '由发布脚本维护',
        documentType: 'MARKDOWN',
    });

    return informat.knowledgebase.writeDocument(
        moduleId,
        documentId,
        markdown,
    );
}

export function getPublishStatus(moduleId, taskId) {
    return informat.knowledgebase.getIngestTaskStatus(moduleId, taskId);
}

常见问题

提示模块不存在或不是知识库模块

确认传入的是当前应用中已发布知识库模块的真实 ID,而不是模块名称或模块标识符。

提示只能写入 informat.knowledgebase 创建的文档

writeDocument 不能覆盖通过界面上传或其他入口创建的文档。请先调用 createDocument,再使用返回的文档 ID 写入正文。

文档长时间保持 PENDING

检查 Redis、向量模型和知识库模块配置是否可用。服务重启或异步线程池繁忙时,任务会由恢复扫描重新调度。

任务状态为 FAILED

查看 errorMessage,检查向量模型配置、网络连接和正文分块配置。修复问题后再次调用 writeDocument