搜索架构
Nowledge Mem 如何组合六种搜索策略来找到对的记忆,即使用词完全不同。
搜索个人知识和搜索网页是两回事。你在找的是自己存下来的东西,用的是当时自己的措辞,可能已经过了好几个月。最大的挑战不是速度,而是你现在的提问方式和当初的记录方式之间的差距。
Nowledge Mem 通过同时从多个角度搜索来解决这个问题,然后混合排序。
六种搜索策略
每次搜索查询最多并行跑六种策略:
语义搜索用向量嵌入比较查询和每条记忆的含义。"API 认证"能匹配到"JWT token 配置",即使用词完全不同。大多数查询靠这个。
全文检索做关键词匹配,支持中日韩分词。你记得确切的术语、函数名或代码标识符时,这个最管用。
实体搜索通过知识图谱找关联。搜"数据库性能"可以找到关于"PostgreSQL 索引"的记忆,因为两者共享实体关联,即使原文从没提过"数据库性能"。
社区搜索利用图谱中的社区聚类(强连接节点的集群)。有些记忆靠关键词或语义匹配找不到,但在同一个社区里就能找到。
标签搜索让你自己打的标签参与排序。查询命中某个标签时,带这个标签的记忆相关性会提高。
图遍历沿关系边(EVOLVES 链、实体关联、结晶来源)查找,靠的是图结构连接而非文本相似度。
快速模式和深度模式
不是每次搜索都需要全部六种策略全力运行。
快速模式(大多数查询 100ms 以内)并行跑语义搜索、全文检索和实体匹配。大约 90% 的查询用这个就够了,也是默认行为。
深度模式在快速结果基础上加一层 LLM 分析。先分类查询意图(查事实?探索概念?追踪关系?),再调整策略权重。需要的话还会用 HyDE(假设文档嵌入)来弥合表达差距,或者让 LLM 重新评估头部结果来改善排序。
查询带时间意图("我上个季度决定了什么?")或者快速模式结果置信度不高时,深度模式自动触发。也可以手动开。
结果排序
最终排序混合了上述策略的信号与记忆级别的评分:
- 语义相关性是主导因素。语义上接近查询的记忆排得高,其他信号影响有限。
- 衰减分数给最近和频繁访问的记忆适度加分。详见记忆衰减。
- 置信分数给证据充分的记忆(多次访问、EVOLVES 链接、结晶引用)小幅额外加分。
知识结晶因为是经过验证的合成知识,有排序加分。EVOLVES 链中的最新版本也比被取代的旧版排得更高。
每条结果都附带 source_thread_id(如果有的话)。如果智能体或工具需要记忆本身之外的更多上下文,可以拉取原始对话。
时间搜索
带有时间引用的查询("2020 年发生了什么?"、"上个季度的决定")会激活时间匹配。系统为每条记忆追踪两个独立的时间戳:
- 事件时间:事情发生的时间
- 记录时间:你保存它的时间
时间匹配会增加相关性提升,但不会覆盖语义相关性。来自正确时间段的记忆仍然需要语义上相关才能排名靠前。时间是信号,不是过滤器。
日期精度会被明确追踪。如果一条记忆的事件时间只精确到年,系统不会假装知道具体月份。