正文:

D3 把 xlsx 检查项、PDF 发票和见证表 docx 都进了 memory,CLI 一搜能命中,facts_only 字段也在 md 里。我本以为问答这一步会很顺,结果在浏览器里连续翻车:

  • 工具 snippet 里 seller_name坷垃农家菜馆,最终气泡变成别的店名
  • 金额 2550.00 被写成 255
  • 问发票,回答尾巴冒出叶片、开关柜见证表
  • 问「叶片见证表」,Top1 却落到 检查项目(1).md 的试板检验、出厂检查
  • 问检查项目,又贴出 开关柜见证表模版 正文

后来我才搞明白:不是索引坏了,是 Agent 有两层输出——memory_search 的 snippet 往往是对的,Qwen 7B 在写「最终回答」时二次发挥,改专名、改金额、甚至自己改写搜索词。

D4 干的就是这件事:回答必须带来源文件名,字段尽量逐字引用,验收先看工具层再看气泡。

两层输出,别验错层

OpenClaw 对话里通常有:

  1. 工具层:展开 memory_search,看 JSON / snippet → 以它为准
  2. 模型层:Assistant 气泡里的总结 → 可能不可信

我遇到过「先闪一下正确文字,流式结束又变错」——那是 UI 先展示了 tool,再展示了 model。验收时一定要 展开工具调用 对照。

配置:先压住随机性

openclaw-data\openclaw.json 里我做了两处改动(改完要 restart Gateway,且 New Chat 才吃新 prompt):

"ollama/qwen2.5:7b": {
  "params": { "temperature": 0 }
},
"memorySearch": {
  "query": { "maxResults": 1 }
}
  • temperature: 0:减少乱改字
  • maxResults: 1:单文件精确问时,别让模型合并开关柜、逆变器等多条 snippet

见证表对比、头脑风暴式泛问,可以把 maxResults 改回 3;发票 / 单文件字段提取建议保持 1。

规则写进 SOUL.md / AGENTS.md

路径:openclaw-data\workspace\SOUL.mdAGENTS.md

要点就几条:

  • memory_search 只调用一次,禁止模型改写 query
  • 发票:copy-paste facts_only 四行,末尾 来源:文件名.md
  • 检查项目:搜索词必须是 doc_type:checklist 检查项目
  • 叶片:搜索词必须是 source_file:叶片设备见证情况表禁止改成「叶片见证表」这种模糊词

改完 workspace 规则后,旧会话不会自动加载,必须 New Chat

固定提问模板(浏览器三条验收)

模板在 study\prompts\D4-浏览器提问模板.md,核心是 键值检索,别泛问:

发票(恰好 5 行):

只调用一次 memory_search,搜索:invoice_no:26152000000166099696

你的回答只能有下面 5 行,禁止写解释、禁止引用其他文件:

buyer_name: (从 snippet facts_only 原样复制)
seller_name: (从 snippet facts_only 原样复制)
invoice_date: (从 snippet facts_only 原样复制)
total_amount: (从 snippet facts_only 原样复制)
来源:dzfp_....md

叶片(禁止模糊搜):

只调用一次 memory_search,搜索:source_file:叶片设备见证情况表

必须包含 device: 叶片、见证表编号(如 YCL-01-R01)。
禁止引用钢塔、检查项目、发票。
最后一行:来源:叶片设备见证情况表(19个).md

检查项目(必须带 doc_type):

只调用一次 memory_search,搜索:doc_type:checklist 检查项目

只列出 Top1 里 ## 开头的 sheet 名称。
最后一行:来源:检查项目(1).md

CLI 真值对照(不经过 LLM)

浏览器说不准时,我先跑 CLI,判断是「库问题」还是「模型问题」:

cd study\scripts
.\d4-answer-from-search.ps1 "invoice_no:26152000000166099696"
.\d4-answer-from-search.ps1 "source_file:叶片设备见证情况表"
.\d4-answer-from-search.ps1 "doc_type:checklist 检查项目"
CLI 对 / 浏览器错 结论
D4 问题:约束输出,不是重建索引
回到 D3:查 md、重跑 ingest

我这边 CLI 金标准大致是:

  • 发票:seller 含 坷垃,金额 2550.00
  • 叶片:device: 叶片witness_table_no: YCL-01-R01
  • 检查项目:17 个 sheet,来源 检查项目(1).md

踩坑与解决

坑 1:工具对、气泡错(先对后错)

现象:snippet 里坷垃,回答变康卉 / 物资批发。
原因:7B 润色中文专名;UI 两层展示顺序误导。
解决:temperature: 0 + prompt 禁止改写;验收以 tool 为准。

坑 2:模型改写 memory_search 关键词

现象:你写「叶片见证表」,工具里搜成别的,Top1 变成检查项目。
原因:7B 调用工具前改了 query。
解决:prompt 写死搜索词;用 source_file:invoice_no:doc_type: 等带 key 的检索。

坑 3:一条问题混进多个文件

现象:问发票,尾巴出现开关柜、叶片见证表。
原因:maxResults 过大 + 模型合并多条结果。
解决:精确问设 maxResults: 1;prompt 写「只根据 Top1」。

坑 4:模糊搜「叶片见证表」命中检查项目

现象:回答全是试板检验、出厂检查,没有叶片。
原因:向量泛搜 叶片见证表 时,Top1 可能是 检查项目(1).md(我 CLI 测过 score 约 0.47)。
解决:必须用 source_file:叶片设备见证情况表(Top1 score 约 0.79)。

坑 5:检查项目没加 doc_type,命中开关柜

现象:来源变成 开关柜见证表模版2120V1.md
原因:泛搜「检查项目」会撞到结构相近的见证表模板。
解决:doc_type:checklist 检查项目

坑 6:SOUL.md 改了不生效

现象:规则加了,模型仍旧乱写。
原因:旧会话没加载新 SOUL;或 7B 能力不够仍违规。
解决:New Chat;仍不行就认小模型局限,商用换更大模型或绕过 LLM。

坑 7:金额 2550 变 255

现象:库内 2550.00,回答写 255
原因:模型「心算」或截断。
解决:prompt 禁止改写金额;商用 不让 LLM 报金额,程序拼字段。

小结

D4 对我来说结论很清晰:本地 RAG 的瓶颈 often 不在向量库,而在检索之后的生成环节。 工程、造价、监理类资料问答,客户要的是「这句话出自哪份文件、数字没被改」,小模型不适合当最后一道关。

Demo 阶段可以用「snippet 即答案」+ CLI 真值对照;真要交付,检索后 模板填字段,LLM 只写解释句或者不用。

后续计划

  • D5:raw 目录监控,新文件自动 ingest
  • 扫描 PDF OCR 管道(还没开始)
  • 商用:专名和金额不让 7B 重述
Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐