本地 OpenClaw 知识库进阶:xlsx 检查项入库、PDF 试跑与一键 ingest
正文:
D2 把 8 份电力见证 docx 跑进了 memory,CLI 能搜、浏览器也能调工具。做到这儿我发现还缺几件事:检查项那张 xlsx 一直没进库;问「叶片」经常撞到「钢塔」;每来一个新文件都要「转 md → 拷 workspace → 跑 index」三步,太碎。
D3 就是把这些补上,另外顺手试了一条文字型 PDF(电子发票),看 Word 能不能直接抽字进库。
整体思路
D2 的链路不变,只是中间多了一层「结构化」、末尾合成一条命令:
raw(docx/xlsx/pdf) → 转 md(带 YAML 头)→ workspace → memory index
见证表 md 头部会写上 device、doc_type、source_file 这类字段,后面检索时好区分。发票 PDF 我不打算整段正文入库,只保留 buyer_name、seller_name 这些 facts 字段,免得版式乱了以后更难搜。
配置还是 D2 那套,没大改:
"memorySearch": {
"provider": "ollama",
"model": "nomic-embed-text",
"remote": { "baseUrl": "http://host.docker.internal:11434" },
"extraPaths": ["knowledge/power-witness"],
"query": { "maxResults": 3 }
},
"tools": {
"profile": "messaging",
"alsoAllow": ["group:memory"]
},
"plugins": { "slots": { "memory": "memory-core" } }
入库和验证(我这边最后是 10/10 files、222 chunks,含 1 个 xlsx + 1 个 PDF):
cd study\scripts
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass -Force
.\d3-ingest.ps1 -All
cd openclaw
docker compose exec -T openclaw-gateway node dist/index.js memory status --deep
docker compose exec -T openclaw-gateway node dist/index.js memory search "doc_type:checklist 检查项目"
单文件可以 -File "检查项目(1).xlsx",只改 metadata 不重新转 Office 用 -MetadataOnly。
踩坑与解决
坑 1:跑 ingest 提示找不到脚本
现象:PowerShell 报 d3-ingest.ps1 不是命令。
原因:D2 只有转换脚本,一键入库脚本得单独写,我当时以为已经有了直接跑。
解决:确认 study\scripts\ 下有 d3-ingest.ps1 再执行。
坑 2:脚本里写中文,PowerShell 直接语法错误
现象:一运行满屏红字,elseif ($base -match '叶片') 附近解析失败,中文变成乱码。
原因:Windows 自带 PowerShell 5.1 吃 UTF-8 脚本很挑,字符串里的中文容易炸。
解决:脚本主体尽量英文;设备名、文件名映射放到单独的 d3-file-map.json 里用 UTF-8 读。
坑 3:md 有了 frontmatter,但全是 device: general
现象:转换是成功的,YAML 头也在,可设备类型没写上。
原因:规则在 PS 里匹配中文文件名没生效。
解决:改成 JSON 里按完整文件名映射;跑一遍 .\d3-ingest.ps1 -MetadataOnly 重刷头信息。
坑 4:xlsx 转出来了,索引还是 8/8
现象:demo-office\...\md\ 里能看到检查项目,但 memory status 不变。
原因:md 没同步进容器挂载的 workspace\knowledge\power-witness\,或者 Copy-Item *.md 漏了带括号的文件名。
解决:复制时逐个 -LiteralPath;同步完再 memory index --force。
坑 5:索引卡在 9/10,或报 database locked
现象:compose run 建索引失败,提示 sqlite 被占用;或者 status 差 1 个文件。
原因:Gateway 正在跑,和临时容器抢同一个库。
解决:先 docker compose restart openclaw-gateway,再用 exec 进正在跑的容器索引:
docker compose exec -T openclaw-gateway node dist/index.js memory index --force --verbose
坑 6:搜「叶片」还是钢塔排前面
现象:D2 的老问题还在,泛问容易撞到结构相近的见证表。
原因:钢塔那份 chunk 多,向量一泛搜就偏。
解决:检索词写具体一点,CLI 试过这两句差别很大:
# 容易偏
memory search "检查项目 叶片"
# Top1 比较稳
memory search "doc_type:checklist 检查项目"
memory search "source_file:叶片设备见证情况表"
坑 7:PDF 用 Word 打开,正文挤成一行
现象:电子发票能抽出字,但购销方两列糊在一起,中间还有怪字符。
原因:PDF 版式丢了,直接 Content.Text 不行。
解决:改用 Word 的表格读单元格,发票只输出 facts_only 几行字段,不保留大段原文。
坑 8:发票日期写成 2615-20-00
现象:文件名里明明有 20260302,md 里日期却离谱。
原因:正则 _(\d{8}) 先匹配到发票号里的 8 位数字了。
解决:改成匹配文件名末尾:_(\d{8})\d*\.pdf$。
小结
D3 对我来说主要是三件事:xlsx 和 PDF 也能进库了;md 带上设备/文档类型,检索没那么瞎;新增文件一条命令跑完,不用手动三步。
当然还不完美:扫描件 PDF 没碰;泛问见证表还是会混;浏览器里偶尔出现「工具返回对了、最终回答写歪了」——这个我打算放下一阶段,专门做来源引用和禁止改写。
后续计划
- 对话回答固定带文件名出处
- raw 目录监控,新文件自动 ingest
- 扫描 PDF 走 OCR 管道(还没开始)
更多推荐


所有评论(0)