Skip to content

fix(search): 全量校对时清理已删除消息 - #154

Closed
qq666666qq wants to merge 1 commit into
LifeArchiveProject:mainfrom
qq666666qq:fix/local-search-reconcile
Closed

qq666666qq wants to merge 1 commit into
LifeArchiveProject:mainfrom
qq666666qq:fix/local-search-reconcile

Conversation

@qq666666qq

Copy link
Copy Markdown
Contributor

问题

原因

本地语义索引的全量校对会复用现有 generation,但此前只会写入当前快照中仍然存在或发生变化的消息。任务结束时的 prune 只按账号、会话和时间范围裁剪,没有比较本轮完整快照与已有索引。

因此,已经从源消息中删除的 source、片段成员和向量仍会保留。

表现

  1. 首次建立索引时包含消息 A 和 B。
  2. 删除源消息 B。
  3. 再执行一次非增量的完整校对,此时快照只包含 A。
  4. 校对完成后,B 仍可被关键词搜索或语义搜索命中。

后果

  • 用户已经删除的聊天内容仍可能出现在本地搜索结果中。
  • AI 检索可能继续引用已删除内容。
  • 共享片段的向量仍会受到已删除文本影响,导致相邻消息的语义排序失真。

修改

  • 在冻结快照中持久化本轮 source,并为 source 比对增加索引。
  • 只对读取完整且没有来源警告的范围执行缺失删除。
  • 累积各分页的来源警告,避免早期警告被最后一页覆盖。
  • 找出当前 generation 中存在、但可靠快照中不存在的 source。
  • 原子删除缺失消息、成员和受影响的共享向量片段。
  • 重新编码共享片段中仍然存在的相邻消息,避免删除文本残留在向量中。
  • 增量任务及存在来源警告的范围不会执行缺失删除。

验证

运行:

python -m pytest -q tests/test_local_search.py tests/test_local_search_totals.py tests/test_local_search_reading.py tests/test_local_search_progressive.py

结果:

84 passed in 24.06s

@xiaoshengbao

Copy link
Copy Markdown
Contributor

想请教一下,这里的“源消息删除”在实际使用中,通常会由什么操作触发?能否举一个从用户操作到触发索引清理的具体例子,方便理解这个修复覆盖的场景?

@qq666666qq qq666666qq closed this Sep 22, 2026
@qq666666qq

Copy link
Copy Markdown
Contributor Author

想请教一下,这里的“源消息删除”在实际使用中,通常会由什么操作触发?能否举一个从用户操作到触发索引清理的具体例子,方便理解这个修复覆盖的场景?

嘿嘿,这是防撤回功能,我看错了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants