Install
openclaw skills install rag-kb使用 Python、FAISS、BM25、阿里云百炼 text-embedding-v4 与可选的 qwen3-rerank,维护基于文件目录的本地知识库;适用于在 OpenClaw 预先抽取文本后,遍历 chunks 与 T2Q 建立索引,以及对指定知识库或全部知识库做综合、语义或关键词查询。
openclaw skills install rag-kb这个 skill 用于配合 OpenClaw 自己的模型,维护目录化知识库。OpenClaw 负责从原始文件中抽取文本,并生成摘要、做语义切片、生成 T2Q;Python 只负责消费已经准备好的文本文件,建立语义与 BM25 索引,并执行查询。
chunks/ 和 t2q/ 建立或更新索引python3 -m pip install -r {baseDir}/requirements.txt3.10+BAILIAN_SK;脚本同时兼容历史变量名 BAILIAN-SKtext-embedding-v41024jieba 分词/var/openclaw-kb/{kb}/protected_terms.jsonqwen3-rerankhybridsummary 必须是单行纯文本,保存为 summary.txtchunk,不索引 t2qindex 需要联网生成 embedding;query --retrieval-mode semantic|hybrid 需要联网生成查询 embedding;任意模式启用 --rerank 时需要联网做重排;且只会向阿里云百炼官方接口发起 HTTPS 请求:
https://dashscope.aliyuncs.com/compatible-mode/v1/embeddingshttps://dashscope.aliyuncs.com/compatible-api/v1/reranksAuthorization 请求头;脚本不会收集或上传其他环境变量doctor 与 query --retrieval-mode keyword 不依赖网络,也不会读取百炼密钥每次新增、抽取文本、摘要、切片、T2Q、索引、删除之前,必须先读 references/layout.md。
主文档不再重复展开所有命名细节。执行时以 layout.md 为准。
每次生成 summary.txt、chunks/*.md、t2q/*.md 之前,必须再读 references/content-rules.md。
主文档不再重复展开这三类内容的细节。执行时以 content-rules.md 为准。
知识库根目录默认是 /var/openclaw-kb,但可通过 --root-dir 覆盖。
每个知识库目录下的保护词文件固定为:
/var/openclaw-kb/{kb}/protected_terms.json
每次进入这个 skill 前,必须先算出这三个值:
kb:知识库名,例如 regulationts:上传时间戳,格式固定为 yyyyMMddhhmmsafe_name:去掉危险字符后的文件基础名只有先得到这三个值,后面的文本保存、摘要、切片、T2Q、索引才能继续。
/var/openclaw-kb/{kb}/{ts}-{safe_name}
summary.txt、chunks/、t2q/ 都必须放在这个目录下这是 OpenClaw 的前置步骤,不调用 Python。
OpenClaw 需要:
/var/openclaw-kb/{kb}/{ts}-{safe_name}//var/openclaw-kb/{kb}/{ts}-{safe_name}/{safe_name}.md这个 skill 不负责文件转文本。
进入摘要、切片、T2Q、索引之前,OpenClaw 必须已经把原始文件抽取成文本文件,推荐保存为:
/var/openclaw-kb/{kb}/{ts}-{safe_name}/{safe_name}.md
也兼容:
/var/openclaw-kb/{kb}/{ts}-{safe_name}/{safe_name}.txt
这是纯 skill 步骤,不调用 Python。
OpenClaw 读取已经抽取好的文本文件后,需要:
summary.txtsummary.txt这是纯 skill 步骤,不调用 Python。
OpenClaw 读取已经抽取好的文本文件后,需要:
注意:
doc/docx/pdf/ppt/xls/xlsx 到文本的转换这是纯 skill 步骤,不调用 Python。
OpenClaw 需要:
这一步调用 Python。它会遍历一个文档目录下的 chunks/ 和 t2q/,建立语义索引和 BM25 索引。
python3 {baseDir}/scripts/bailian_faiss_kb.py index \
--root-dir /var/openclaw-kb \
--kb regulation \
--doc-dir /var/openclaw-kb/regulation/{ts}-xx \
--topk 10 \
--topN 10
行为:
chunks/*.mdt2q/*.mdtext-embedding-v4 生成 1024 维向量vectors.jsonlindex.faisschunk 构建 BM25 倒排索引并写入 bm25.jsonmanifest.jsontopk 与 topN 写入知识库配置protected_terms.json这一步调用 Python。它会扫描某个知识库目录下的全部文档目录,重新生成整个知识库的语义索引和 BM25 索引。
python3 {baseDir}/scripts/bailian_faiss_kb.py rebuild \
--root-dir /var/openclaw-kb \
--kb regulation \
--topk 10 \
--topN 10
行为:
/var/openclaw-kb/{kb}/ 下所有合法文档目录chunks/*.mdt2q/*.mdvectors.jsonlindex.faissbm25.jsonmanifest.jsonprotected_terms.json删除分成两步,而且顺序固定为先删索引,再删文件:
python3 {baseDir}/scripts/bailian_faiss_kb.py delete \
--root-dir /var/openclaw-kb \
--kb regulation \
--doc-id {ts}-xx
行为:
vectors.jsonl 中删除该文档对应的 chunk 和 T2Q 向量记录index.faissbm25.jsonmanifest.json/var/openclaw-kb/regulation/{ts}-xx
这一步调用 Python。它会把保护词写入知识库目录下的 protected_terms.json,然后离线刷新 bm25.json 与 manifest.json。
python3 {baseDir}/scripts/bailian_faiss_kb.py protect-add \
--root-dir /var/openclaw-kb \
--kb regulation \
--term 测试环境权限 \
--term OpenClaw
行为:
/var/openclaw-kb/{kb}/protected_terms.jsonvectors.jsonl 离线重建 bm25.jsonmanifest.jsonindex.faiss这一步调用 Python。它会从知识库目录下的 protected_terms.json 删除指定词条,然后离线刷新 bm25.json 与 manifest.json。
python3 {baseDir}/scripts/bailian_faiss_kb.py protect-delete \
--root-dir /var/openclaw-kb \
--kb regulation \
--term 测试环境权限
行为:
/var/openclaw-kb/{kb}/protected_terms.json 删除指定保护词vectors.jsonl 离线重建 bm25.jsonmanifest.jsonindex.faiss这一步调用 Python。
默认综合查询指定知识库:
python3 {baseDir}/scripts/bailian_faiss_kb.py query \
--root-dir /var/openclaw-kb \
--kb regulation \
--query "报销审批流程是什么"
默认综合查询全部知识库:
python3 {baseDir}/scripts/bailian_faiss_kb.py query \
--root-dir /var/openclaw-kb \
--query "报销审批流程是什么"
显式只做语义查询:
python3 {baseDir}/scripts/bailian_faiss_kb.py query \
--root-dir /var/openclaw-kb \
--kb regulation \
--query "报销审批流程是什么" \
--retrieval-mode semantic
显式只做关键词查询:
python3 {baseDir}/scripts/bailian_faiss_kb.py query \
--root-dir /var/openclaw-kb \
--kb regulation \
--query "报销审批流程是什么" \
--retrieval-mode keyword
需要更高精度时,显式启用 rerank:
python3 {baseDir}/scripts/bailian_faiss_kb.py query \
--root-dir /var/openclaw-kb \
--kb regulation \
--query "报销审批流程是什么" \
--retrieval-mode hybrid \
--rerank
查询规则:
--kb regulation,只查询该知识库--kb,遍历根目录下所有知识库--retrieval-mode,默认按 hybrid 做综合检索--retrieval-mode semantic 时,按 FAISS 做语义召回;chunk 与 t2q 都参与召回,命中 t2q 时必须反查回真实 chunk--retrieval-mode keyword 时,只按 BM25 检索真实 chunk;t2q 不参与关键词检索--retrieval-mode hybrid 时,先分别做语义召回和 BM25 召回,再在真实 chunk 级别融合topN 返回topNprotected_terms.json默认返回 Markdown,按文件分组,每个命中的 chunk 单独成节。
格式固定为:
## xx.docx
- uploaded at {ts}
- summary: 摘要文本
- total chunks: 该文件的切片数量
### Chunk 00001
这里是 chunk 内容
### Chunk 00002
这里是 chunk 内容
注意:
summary 来自 summary.txtpython3 {baseDir}/scripts/bailian_faiss_kb.py doctor \
--root-dir /var/openclaw-kb
summary.txt 超过 200 字,Python 会拒绝索引indexprotect-add 或 protect-delete