本地 RAG 工具搜对了、7B 却写错了?OpenClaw D4 来源引用实操
正文:
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 对话里通常有:
- 工具层:展开
memory_search,看 JSON / snippet → 以它为准 - 模型层: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.md、AGENTS.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 重述
更多推荐




所有评论(0)