提升召回质量
先修记忆本身,再用真实提问调整阈值和权重。
多数召回问题源于记忆的写法,而不是设置。先修改记忆,再用真实提示词检查结果。只有在记忆本身正确、结果仍然不对时,才调整设置。
先改善记忆的结构
按顺序完成以下步骤:
- 让记忆只讲一个主题。参见哪些内容应该放进 Lore。
- 给它一个具体的路径,以概念命名,不包含日期。参见路径与域。
- 写一个具体的触发条件:一个未来的情境。参见触发条件与术语。
- 添加术语,覆盖人们实际会输入的词,包括另一种语言的写法。
- 如实设置优先级。参见优先级。
- 确认嵌入模型已配置。召回需要它,参见下文的“必须配置嵌入模型”。
- 用真实提示词测试,并在修改任何设置之前先阅读结果。
症状与首先检查的地方
| 症状 | 首先检查 |
|---|---|
| 正确的记忆从不出现 | 它的触发条件和术语。用团队实际使用的词写一个提示词来测试。 |
| 某条记忆出现在无关的提示词中 | 是否过于宽泛。拆分它,检查触发条件中是否有 OR 用语;如果它只是背景信息,就降低优先级。 |
| 太多弱相关的记忆出现 | 记忆是否足够具体。如果足够具体,就提高 recall.display.min_display_score。见下方配置项。 |
| 中文提示词匹配效果差 | PostgreSQL 中是否有 pg_jieba 或 zhparser。参见下文的“中文召回”。无论如何,都应补充中文术语。 |
| 语义匹配缺失 | 嵌入模型是否已配置。更改嵌入模型会重建视图。 |
| 召回从来没有结果 | 嵌入模型是否已配置。没有它,召回会失败。用 lore_status 检查后端健康状态。 |
| 召回经常被跳过 | 服务器是否太慢。超时会跳过召回并给出提示。 |
| 长提示词丢失了重点 | 召回只使用前 200 个字符。把主题写在前面。 |
| 有用的记忆排名太低 | 它的触发条件和术语。优先级只带来很小的加分。 |
可调整的设置
只有在记忆结构正确之后才调整设置。每次只改一个值,然后用同样的提示词重新测试。
| 配置项 | 默认值 | 作用 | 何时修改 |
|---|---|---|---|
recall.display.min_display_score | 0.60 | 得分低于此值的候选会被扣留 | 当 Shown 很高而 Used 很低时提高它。只有当你确认正确的记忆总是刚好低于阈值被扣留时,才降低它。 |
recall.display.max_display_items | 3 | 每次召回最多展示的记忆条数 | 想让注入的内容更精简时调低。只有当相关记忆不断被条数上限截掉时,才调高。 |
recall.safety.max_query_chars | 200 | 参与召回的长提示词字符数 | 长提示词丢失关键词时调高。把主题放在提示词开头。 |
recall.safety.timeout_ms | 2000 | 超过此时间即跳过召回 | 只有服务器持续较慢时才调高。超时意味着该提示词完全没有召回。 |
recall.weights.w_exact | 0.30 | 精确匹配的权重 | 保持默认。先修改术语。 |
recall.weights.w_glossary_semantic | 0.25 | 术语语义匹配的权重 | 当基于含义的术语匹配效果较弱时,可以考虑调高。 |
recall.weights.w_dense | 0.30 | 视图(语义)匹配的权重 | 当记忆能通过含义找到,但排名太低时,可以考虑调高。 |
recall.weights.w_lexical | 0.03 | 全文匹配的权重 | 保持默认,除非已经配置了中文全文检索。参见下文的“中文召回”。 |
recall.bonus.priority_base 和 recall.bonus.priority_step | 0.05 和 0.01 | 优先级加分 | 保持默认。应改为如实设置优先级。 |
recall.recency.enabled | true | 开启或关闭时间加分 | 当旧的稳定规则应与近期笔记同等排序时关闭。 |
recall.recency.half_life_days | 180 | 时间加分减半所需的天数 | 调低(例如 30)以偏向近期工作。保持 180 则效果更温和。 |
recall.recency.max_bonus | 0.04 | 最大时间加分 | 保持默认。 |
recall.recency.priority_exempt | 1 | 优先级不高于此值的记忆不随时间衰减 | 保持默认。 |
自托管服务可以在 /settings 中修改设置,也可以通过 API 修改。只有服务器设置了 API_TOKEN 时,才需要带上 Authorization 请求头:
curl -X PUT http://127.0.0.1:18901/api/settings \
-H "Authorization: Bearer lm_your_token" \
-H "Content-Type: application/json" \
-d '{"patch": {"recall.display.min_display_score": 0.65}}'Loremem 云服务的召回行为设置位于设置 → 偏好。
中文召回
中文词之间没有空格,因此中文的词法匹配依赖 PostgreSQL 中的中文分词器。Lore 优先使用 pg_jieba,没有时使用 zhparser。
- 两者都未安装时,PostgreSQL 会退回到
simple文本检索,中文匹配效果会明显变弱。 - Lore 的 PostgreSQL 镜像
fffattiger/pgvector-zhparser:pg16同时包含这两个扩展,并预先加载了pg_jieba。 - 如果你使用自己的 PostgreSQL,请参见使用自己的 PostgreSQL。
- 无论数据库如何配置,都应把中文术语加入术语列表,例如
退款回调。人们会直接输入这些词。
必须配置嵌入模型
召回使用嵌入模型进行语义匹配。没有嵌入模型,召回无法运行:调用会失败,插件则在没有召回块的情况下继续运行。
- Loremem 云服务:模型已经预先配置。在设置 → 模型中选择嵌入配置。更改它会重建视图和召回索引,并消耗模型配额。
- **自托管:**在
/setup中设置嵌入端点,之后也可以在/settings中修改。它必须是兼容 OpenAI 的/v1/embeddings端点,并提供 base URL、API key 和模型名称。
要获得最完整的 gist 和 question 视图,还需要 View LLM。没有它时,Lore 会根据内容、触发条件和术语生成较简单的视图。参见生成的视图。
用真实提示词测试
用你在工作中真正会输入的提示词来测试。自己编造的关键词测试,无法反映 Agent 实际会发送的内容。
- 打开召回页面:在 Loremem 云服务中是控制台的召回页面;在自托管服务中是
/recall。 - 输入一条真实的提示词并运行召回。
- 查看候选、它们的顺序和分数。
- 判断正确的记忆卡在哪一步。如果它在所有阶段都没有出现,就修改记忆;如果它被找到了却被扣留,就检查展示阈值和条数上限。每个阶段显示什么,参见召回分析。
- 修改记忆,然后用同一条提示词重新运行。只有在记忆本身正确时,才调整设置。
定期检查的简单流程
- 每个重要决策之后,写入或更新记忆。参见写好一条记忆。
- 每周用真实提示词为每个活跃项目跑一遍召回,检查哪些记忆出现了。
- 查看召回分析,找出噪声较大或从未被采用的记忆。
- 每发现一个问题,只修复一条记忆。不要同时修改多个设置。
- 大规模清理之前先备份。参见备份与恢复。
提示
记下提示词、你预期的结果和实际返回的结果。每次修改后用同样的提示词重新测试,就能看出改动是否有效。