Install
openclaw skills install @myd2002/kb-queryAnswer Research KB questions from the team Gitea-backed knowledge base with OpenClaw reasoning, optional reference attachments, stable citations, OpenClaw-led evidence selection, and optional high-value Q&A persistence.
openclaw skills install @myd2002/kb-querykb_query 只负责“对话”页面的知识库查询。用户输入可以是纯文字,也可以带附件;附件一律是本轮参考材料,用于辅助理解问题、补充上下文或做临时对比,稳定来源仍以知识库证据页为准。
本 skill 不负责登录、权限、会话历史、文件上传、任务调度或资料源入库。Java 后端负责这些系统动作。OpenClaw 负责理解用户问题、判断需要参考哪些 KB 页面、综合证据、生成回答、判断证据是否充分,以及判断是否值得沉淀为 qa/ 页面。Python 脚本只做确定性动作:读取 catalog/index 和探索卡片、按 OpenClaw 选择读取证据页面、抽取附件文本预览、校验 OpenClaw 输出、可选写入 qa/、维护 catalog.json/index.md、写出后端 result JSON。
不要提供脚本兜底的抽取式简化回答。没有真实 OpenClaw 理解时,任务应失败或返回明确错误,而不是用脚本假装完成问答。
后端 payload 通常包含:
taskId: 后端生成的查询任务 ID,当前格式为 query-<conversationId>-<messageId>,用于共享 payload/result 文件和 OpenClaw session key。skill: kb_query。question: 用户问题。conversationId: 当前会话 ID。messageId: 用户消息 ID。attachments[]: 本轮参考附件,字段包括 attachmentId、fileName、mimeType、storagePath、sha256、size、temporary=true。answerPolicy.scopeSelection: auto_by_openclaw。answerPolicy.knowledgeBaseFirst: true,表示事实性回答必须优先基于团队 KB。answerPolicy.allowNonKbSupplementWhenInsufficient=true 时,知识库证据不足可以在明确说明后补充非 KB 或附件分析。answerPolicy.writeHighValueAnswerToQa: 是否允许高价值问答写入 qa/。payloadFile、resultFile、sharedDir: 后端共享目录路径。环境变量包括 GITEA_URL、GITEA_BOT_TOKEN、GITEA_BOT_USERNAME、GITEA_ORG、TEAM_KB_REPO、OPENCLAW_SHARED_DIR。
必须使用四段式流程,让“选哪些页面作为参考”由 OpenClaw 完成,而不是由脚本用关键词配对决定。
上下文预算必须保守执行。prepare/fetch 命令会把完整 JSON 写入文件,终端只输出摘要;OpenClaw 应阅读文件路径指向的 JSON,不要把完整 context/evidence 粘贴回聊天。页面选择应坚持“够用即可”:通常选择 1-4 个最关键 KB 页面,最多不得超过 context.analysisLimits.maxSelectedPages。如果 OpenClaw 判断问题本身不适合由 KB 回答,或者没有任何相关 KB 页面,可以写出合法的空选择 {"selectedPages":[],"rationale":"...","unresolvedQuestions":[]},继续运行 fetch/apply,并在答案中按证据不足规则说明。不要因为证据不足而停止在 selection 阶段;如果少量证据已经能回答,不要扩大读取范围;如果证据不足,按不足规则回答,而不是继续尝试读取大量页面。
所有中间 JSON 文件必须是严格合法 JSON。写 page-selection.json 和 answer.json 时不要加入 Markdown 代码围栏、注释、尾随逗号或半截文本;文件写好后再运行下一步脚本。answer 正文通常包含 Markdown、双引号和表格,优先用 python3 的 json.dump/json.dumps 写出整个 answer.json,不要手写长 JSON 字符串。
python3 scripts/run_task.py prepare --input <payload.json> --context-output <context.json>
准备脚本会读取 catalog.json、index.md、页面元数据、少量探索卡片和附件文本预览,输出 OpenClaw 可读的查询规划上下文。命令行只返回摘要,完整内容在 <context.json> 中。starterPageCards 只是帮助 OpenClaw 快速了解可能相关的页面,不是最终证据,也不能直接作为引用依据。脚本不会生成答案,也不会决定最终参考页面。
<context.json>,根据用户问题、目录、索引、页面卡片、预算限制和附件上下文,思考并生成 <page-selection.json>。OpenClaw 可以选择任意可见 catalog 页面,不限于 starterPageCards,但应选择最小充分集合。page-selection.json 示例:
{
"rationale": "为什么这些页面需要被读取作为证据",
"selectedPages": [
{
"path": "projects/example.md",
"reason": "用于确认项目边界和当前实现",
"expectedUse": "回答功能进度和边界"
}
],
"unresolvedQuestions": []
}
python3 scripts/run_task.py fetch --input <payload.json> --context <context.json> --selection <page-selection.json> --evidence-output <evidence.json>
fetch 只负责校验路径、读取 OpenClaw 选择的 KB 页面、解析 frontmatter sources[],并输出 <evidence.json>。命令行只返回证据页摘要,完整内容在 <evidence.json> 中。它不做答案判断,也不替 OpenClaw 增删参考范围。
OpenClaw 阅读 <context.json> 和 <evidence.json>,进行知识库问答,生成 <answer.json>。answer.json 必须符合“OpenClaw 输出格式”。答案中的 sources[] 只能引用 <evidence.json> 中实际读取到的稳定 KB 页面;临时附件不能作为稳定 KB 来源。
运行应用脚本:
python3 scripts/run_task.py apply --input <payload.json> --context <context.json> --evidence <evidence.json> --answer <answer.json>
应用脚本会校验答案、确保结尾有参考来源、必要时写入 qa/ 并更新 catalog.json 和 index.md,最后把后端 result JSON 写入 payload 指定的 resultFile。
{"success": true, "resultFile": "<result.json>"}
OpenClaw 必须先判断团队 KB 证据是否足以回答问题。证据充分性判断基于 OpenClaw 自己选择并通过 fetch 读取到的稳定 KB 页面。
如果 KB 证据足够:先直接回答结论,再给出必要解释、比较、步骤或建议。回答必须以中文为主,除非用户明确要求其他语言。
如果 KB 证据不足:回答开头必须明确说明“知识库内容无法回答这个问题”或等价表达,然后说明缺少哪些证据。可以在下方补充一般性回答或基于附件的临时分析,但必须标注“以下为非知识库结论/本轮参考附件推断”。
附件只能帮助理解问题、补充本轮上下文或做临时对比;不要把临时附件当作长期 KB 来源,不要因为附件出现就写普通知识页。若答案主要依赖附件且缺少稳定 KB 证据,通常不要沉淀为 qa/。
回答正文不强制套固定模板。可以按用户问题自然组织成结论、解释、对比、步骤、表格或建议;但不要为了模板牺牲可读性。
答案结尾必须包含“参考来源”小节,这是唯一强制模板。稳定来源应优先列出 KB 页面路径和标题;如果证据页带有 sources[],同时列出对应源文件、归档路径、仓库 URL、commit 或其他可追溯线索。若没有可引用 KB 页面,写明“知识库中未找到可支撑本问题的页面”。
高价值问答不是“回答得长”或“用户问了一个问题”就沉淀,而是要成为团队以后可复用的知识入口。OpenClaw 必须先做结构化评估,再决定是否把 highValue 或 qa.write 设为 true。
硬性门槛:
knowledgeSufficient=true,且答案有稳定 KB 页面支撑。正向信号:
建议采用 0-5 分评估:reuseValue、synthesisDepth、evidenceQuality、stability、actionability 各 0/1 分。总分至少 4 分,且通过全部硬性门槛时,才允许写入 qa/。
OpenClaw 必须在 answer.json 中给出 qaEvaluation,说明为什么是或不是高价值问答。apply 脚本只执行确定性拦截:缺少评估、证据不足、无稳定来源、附件驱动、临时/一次性、分数不足时,即使 OpenClaw 请求写入,也不沉淀。
qa/ 页面应包含:问题、可复用回答、证据页面、适用场景、更新时间。QA 页面只应引用稳定 KB 页面作为来源;临时附件不能作为唯一长期证据。
answer.json 是 OpenClaw 生成、apply 脚本读取的文件:
{
"answer": "完整回答。正文不需要固定模板;结尾可以已包含参考来源,apply 会补齐缺失的参考来源。",
"knowledgeSufficient": true,
"sources": [
{
"path": "projects/example.md",
"title": "Example",
"type": "project",
"snippet": "可选引用片段",
"sourceIds": [],
"sourceTraces": [
{
"sourceId": 1,
"sourceType": "local_folder",
"title": "原始资料标题",
"fileName": "example.pdf",
"archivedPath": "source_files/local_folder/example.pdf",
"url": "",
"commitHash": ""
}
]
}
],
"usedAttachments": [
{
"attachmentId": 1,
"fileName": "context.docx",
"role": "query_reference"
}
],
"highValue": false,
"qaEvaluation": {
"reuseValue": 0,
"synthesisDepth": 0,
"evidenceQuality": 0,
"stability": 0,
"actionability": 0,
"attachmentDriven": false,
"ephemeral": false,
"reason": "为什么适合或不适合沉淀"
},
"qa": {
"write": false,
"path": "qa/example.md",
"title": "可复用问答标题",
"content": "可选;不填时 apply 根据 answer 自动生成"
},
"errors": []
}
后端最终读取 resultFile 中的字段:
{
"success": true,
"answer": "...",
"sources": [],
"createdQaPath": "qa/example.md",
"processedSources": ["team-kb"],
"createdPages": [],
"updatedPages": [],
"errors": [],
"commitId": ""
}